【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充

2bd72e70ac1ebbc906dc1870875d3ca6.png

127182a9ea2f22ff85bad28b601ebf2b.png

image

798ffb1cc12d1979ab753c9a2f9e29b2.png

mask

222086218d6c6973d7837793e311bbc9.png

mask

d5bac1f77a9da77d4f9cb3197a204081.png

#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件
#include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编码头文件
#include "opencv2/videoio.hpp" // 包含OpenCV视频IO头文件
#include "opencv2/highgui.hpp" // 包含OpenCV高层GUI头文件#include <iostream> // 包含标准输入输出流库using namespace cv; // 使用命名空间cv,避免每次调用OpenCV函数时都要写cv::
using namespace std; // 使用命名空间std,避免每次使用标准库时都要写std::// 帮助函数,输出程序用法信息
static void help(char** argv)
{// 输出程序的使用说明cout << "\nThis program demonstrated the floodFill() function\n""Call:\n"<<  argv[0]<<  " [image_name -- Default: fruits.jpg]\n" << endl;// 输出热键信息cout << "Hot keys: \n""\tESC - quit the program\n" // ESC键退出程序"\tc - switch color/grayscale mode\n" // c键切换颜色/灰度模式"\tm - switch mask mode\n" // m键切换掩膜模式"\tr - restore the original image\n" // r键恢复原始图像"\ts - use null-range floodfill\n" // s键使用零范围泛洪填充(Simple floodfill)"\tf - use gradient floodfill with fixed(absolute) range\n" // f键使用固定范围渐变泛洪填充(Fixed Range floodfill)"\tg - use gradient floodfill with floating(relative) range\n" // g键使用浮动范围渐变泛洪填充(Gradient floodfill)"\t4 - use 4-connectivity mode\n" // 4键使用4连通模式"\t8 - use 8-connectivity mode\n" << endl; // 8键使用8连通模式
}// 定义全局变量
Mat image0, image, gray, mask; // 原图像、当前图像、灰度图和掩膜图
int ffillMode = 1; // 泛洪填充模式,默认为1
int loDiff = 20, upDiff = 20; // 泛洪填充的下差和上差
int connectivity = 4; // 连接模式,默认为4连通
int isColor = true; // 表示是否为彩色模式
bool useMask = false; // 表示是否使用掩膜
int newMaskVal = 255; // 新掩膜值// 鼠标回调函数
static void onMouse( int event, int x, int y, int, void* )
{if( event != EVENT_LBUTTONDOWN ) // 如果事件不是左键按下,则直接返回return;Point seed = Point(x,y); // 构建种子点int lo = ffillMode == 0 ? 0 : loDiff; // 根据ffillMode确定下差int up = ffillMode == 0 ? 0 : upDiff; // 根据ffillMode确定上差// 构建标志信息,包含连接模式、新掩膜值、以及填充模式int flags = connectivity + (newMaskVal << 8) +(ffillMode == 1 ? FLOODFILL_FIXED_RANGE : 0);// 生成随机颜色int b = (unsigned)theRNG() & 255;int g = (unsigned)theRNG() & 255;int r = (unsigned)theRNG() & 255;Rect ccomp; // 定义泛洪区域的矩形// 根据是否为彩色模式确定新的填充值Scalar newVal = isColor ? Scalar(b, g, r) : Scalar(r*0.299 + g*0.587 + b*0.114);Mat dst = isColor ? image : gray; // 根据是否为彩色模式选择目标图像int area; // 泛洪区域的面积if( useMask ) // 如果使用掩膜模式{threshold(mask, mask, 1, 128, THRESH_BINARY); // 阈值化处理掩膜图area = floodFill(dst, mask, seed, newVal, &ccomp, Scalar(lo, lo, lo),Scalar(up, up, up), flags); // 泛洪填充,并返回填充区域面积imshow( "mask", mask ); // 显示掩膜图}else // 如果不使用掩膜模式{area = floodFill(dst, seed, newVal, &ccomp, Scalar(lo, lo, lo),Scalar(up, up, up), flags); // 泛洪填充,并返回填充区域面积}imshow("image", dst); // 显示图像cout << area << " pixels were repainted\n"; // 输出重绘像素数
}// 程序主函数
int main( int argc, char** argv )
{// 解析命令行参数cv::CommandLineParser parser (argc, argv,"{help h | | show help message}{@image|fruits.jpg| input image}");if (parser.has("help")) // 如果带有help参数,则显示帮助信息{parser.printMessage();return 0;}// 获取命令行指定的图像文件名称,如果没有指定则为默认值string filename = parser.get<string>("@image");// 加载图像image0 = imread(samples::findFile(filename), 1);if( image0.empty() ) // 如果图像为空,则输出提示信息并返回{cout << "Image empty\n";parser.printMessage();return 0;}help(argv); // 显示程序使用说明image0.copyTo(image); // 将原图像拷贝到当前图像cvtColor(image0, gray, COLOR_BGR2GRAY); // 将原图像转化为灰度图mask.create(image0.rows+2, image0.cols+2, CV_8UC1); // 创建掩膜图namedWindow( "image", 0 ); // 创建窗口// 创建轨迹条,用于调整泛洪填充的下差和上差createTrackbar( "lo_diff", "image", &loDiff, 255, 0 );createTrackbar( "up_diff", "image", &upDiff, 255, 0 );setMouseCallback( "image", onMouse, 0 ); // 设置鼠标回调函数for(;;) // 无限循环{imshow("image", isColor ? image : gray); // 显示图像char c = (char)waitKey(0); // 获取一个按键if( c == 27 ) // 如果按键是ESC,则退出程序{cout << "Exiting ...\n";break;}// 根据按键进行不同的操作switch( c ){case 'c': // 切换颜色模式if( isColor ){cout << "Grayscale mode is set\n";cvtColor(image0, gray, COLOR_BGR2GRAY); // 转换为灰度图像mask = Scalar::all(0); // 重置掩膜isColor = false;}else{cout << "Color mode is set\n";image0.copyTo(image); // 还原为彩色图像mask = Scalar::all(0); // 重置掩膜isColor = true;}break;case 'm': // 切换掩膜模式if( useMask ){destroyWindow( "mask" ); // 销毁掩膜窗口useMask = false;}else{namedWindow( "mask", 0 ); // 创建掩膜窗口mask = Scalar::all(0); // 重置掩膜imshow("mask", mask); // 显示掩膜useMask = true;}break;case 'r': // 恢复原始图像cout << "Original image is restored\n";image0.copyTo(image); // 拷贝原图到当前图像cvtColor(image, gray, COLOR_BGR2GRAY); // 转换为灰度图mask = Scalar::all(0); // 重置掩膜break;case 's': // 设置为简单泛洪填充模式cout << "Simple floodfill mode is set\n";ffillMode = 0;break;case 'f': // 设置为固定范围渐变泛洪填充模式cout << "Fixed Range floodfill mode is set\n";ffillMode = 1;break;case 'g': // 设置为浮动范围渐变泛洪填充模式cout << "Gradient (floating range) floodfill mode is set\n";ffillMode = 2;break;case '4':// 当用户按下'4'键时,输出提示信息并设置连通性为4(4连通)cout << "4-connectivity mode is set\n";connectivity = 4; // 设置连通性变量为4,意味着接下来floodFill操作将使用4连通区域break; // 跳出switchcase '8':// 当用户按下'8'键时,输出提示信息并设置连通性为8(8连通)cout << "8-connectivity mode is set\n";connectivity = 8; // 设置连通性变量为8,意味着接下来floodFill操作将使用8连通区域break; // 跳出switch}}return 0; // 程序结束,返回0值
}
int area = floodFill(dst, mask, seed, newVal, &ccomp, 
Scalar(lo, lo, lo), Scalar(up, up, up), flags);

c453d0fdd262dc1b6e63ee99673f60d2.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分享】3种方法取消Word文档的“打开密码”

我们知道&#xff0c;Word文档可以设置“打开密码”&#xff0c;防止文档被随意打开&#xff0c;那后续不需要密码保护了&#xff0c;要怎么取消呢&#xff1f;不小心把密码忘记了还可以取消吗&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 如果是Word文档不再需要密码…

Open3D(C++) 0~1归一化到0~255

目录 一、算法原理二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 0-1归一化到0~255的计算原理如下: g ′ = 255 ∗

冯喜运:4.15汇市观潮:现货黄金美原油技术分析

【 黄金消息面分析】&#xff1a;周一(4月15日)亚市盘初&#xff0c;金价开盘跳涨13美元&#xff0c;报2357.71美元/盎司&#xff0c;随后延续涨势&#xff0c;最高触及2372.45美元/盎司&#xff0c;目前金价回落至2354.19美元/盎司&#xff0c;如果中东局势未进一步恶化&#…

通过注解实现接口入参检查

valid 通过注解实现接口入参检查 前言一、引入依赖二、使用步骤1.创建入参对象 request2.提供一个接口 controller3.全局异常捕获 GlobalExceptionHandler4.执行结果 总结 前言 作为一个后端开发&#xff0c;一般是不单独对接口参数的每个入参进行长度、最大值、最小值判断。 …

RN向上向下滑动组件封装(带有渐变色)

这段组件代码逻辑是出事有一个View和下面的块,下面的块也就是红色区域可以按住向上向下滑动,当滑动到屏幕最上面则停止滑动,再向上滑动的过程中,上方的View的背景色也会有个渐变效果,大概逻辑就是这样 代码如下 import React, {useEffect, useRef, useState} from react; impo…

爱自然生命力专项基金:“爱·启航”残障家庭教育援助项目帮扶上万残障家庭

为进一步积极践行社会责任&#xff0c;助力公益慈善事业&#xff0c;2017年2月爱自然生命力体系与中国下一代教育基金会开展相关合作&#xff0c;共同启动了中国下一代教育基金会爱自然生命力专项基金&#xff0c;并启动了基金第一个项目“爱启航残障家庭教育援助项目”&#x…

华为昇腾AI芯片加持,9.1k Star 的 Open-Sora-Plan,国产Sora要来了吗

Aitrainee | 公众号&#xff1a;AI进修生 哇&#xff0c;今天Github趋势榜第一啊&#xff0c;为了重现Sora&#xff0c;北大这个Open-Sora-Plan&#xff0c;希望通过开源社区力量的复现Sora&#xff0c;目前已支持国产AI芯片(华为昇腾&#xff09;&#xff0c;这回不用被卡脖子…

(学习日记)2024.04.17:UCOSIII第四十五节:中断管理

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

An Investigation of Geographic Mapping Techniques for Internet Hosts(2001年)第二部分

​下载地址:An investigation of geographic mapping techniques for internet hosts | Proceedings of the 2001 conference on Applications, technologies, architectures, and protocols for computer communications 被引次数:766 Padmanabhan V N, Subramanian L. An i…

【原创】springboot+mysql宠物管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

用html写一个雨的特效

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>雨特效</title><link rel"stylesheet" href"./style.css"> </head> <body> <div id"wrap-textu…

VLAN配置不求人:华为设备配置详解

实验拓扑 实验需求 1.全网有VLAN10&#xff0c;VLAN20&#xff0c;VLAN30 2.VLAN10/20/30,192.168.10/20/30.0 3.配置Trunk, Access,Trunk封装使用Dot1q 4.Trunk的模式使用收到形成mode on 5.所有vlan的网关在router 6.单臂路由来实现所有的通讯 7.VLAN30是所有网络设备…

AskManyAI:一个GPT、Claude、Gemini、Kimi等顶级AI的决斗场

一直以来很多人问我能不能有个稳定&#xff0c;不折腾的全球AI大模型测试网站&#xff0c;既能够保证真实靠谱&#xff0c;又能够保证稳定、快速&#xff0c;不要老动不动就挂了、出错或者漫长的响应。 直到笔者遇到了AskManyAI&#xff0c;直接就惊艳住了&#xff01; 话不多…

主播美颜SDK:实现精细化美颜功能的关键技术分析

主播美颜SDK作为实现精细化美颜功能的关键技术&#xff0c;其背后蕴含着丰富的算法和工程技术。本文将对主播美颜SDK的关键技术进行深入分析&#xff0c;探讨其实现精细化美颜功能的原理与方法。 图像识别与面部分析 通过图像识别技术&#xff0c;SDK能够准确地识别出人脸位置…

学习笔记------约束的管理

此篇记录FPGA的静态时序分析&#xff0c;在学习FPGA的过程中&#xff0c;越发觉得对于时序约束只是懂了个皮毛。现在记录一下自己的学习过程。 本文摘自《VIVADO从此开始》高亚军 为什么要进行约束&#xff1f;约束的目的是什么&#xff1f; 简单来说&#xff0c;就是需要在…

HIT The Wiorld,HIT世界官网地址+配置要求+测试时间+加速器分享

HIT The Wiorld&#xff0c;HIT世界官网地址配置要求测试时间加速器分享 NEXON新游《HIT&#xff1a;世界&#xff08;HIT&#xff1a;The World&#xff09;》将在4月17日上线&#xff0c;目前已在官网开启事前预约预创建角色。Hit :the world&#xff08;HIT:世界&#xff…

拥抱信创新篇章,行云绽放麒麟软件携手认证

近年来&#xff0c;我国积极推进信创国产化&#xff0c;各产业也纷纷加速推进软件和芯片的本土化&#xff0c;将“自主可控”列为关键战略目标。在这样的背景下&#xff0c;行云绽放与麒麟软件携手共进&#xff0c;积极拥抱信创&#xff0c;完成了重要的认证工作&#xff0c;为…

拯救鲨鱼!Helping wireshark!wireshark未响应解决方法

前言 做题的的时候 在用wireshark解密tls秘钥的时候 我的小鲨鱼突然未响应了 然后我多次尝试无果 并且殃及池鱼 我电脑上所有的流量包都打不开了&#xff1f;&#xff01;&#xff01;&#xff01; 于是乎 尝试删了重下 还是未响应 开始怀疑电脑 重启电脑两次 还是打…

React-项目构建

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-项目构建 目录 1、初始化项目 2、目录结构 组件 1、组件的创建方式 1.1、函数创建组…

文件系统错误(-805305975)

背景 自己在一次无意中进行图片打开的时候突然发现了一个bug&#xff0c;使用windows10自带的照片查看器无论是打开后缀格式为jpg的图片还是后缀为png的图片&#xff0c;电脑反应都很慢&#xff0c;开始以为是图片太大导致的&#xff0c;后来换了小图片尝试还是不行&#xff0c…