【opencv】示例-create_mask.cpp 通过鼠标交互产生掩膜图像(黑白图像)

1a70fcbed17098ce40ed9081450f484d.png

61a5e30a47ed6ffd3206fefc7949d7a4.png

/*
* create_mask.cpp
*
* Author:
* Siddharth Kherada <siddharthkherada27[at]gmail[dot]com>
*
* 这个教程演示了如何制作掩膜图像(黑白图像)。
* 该程序将输入图像作为源图像,并输出对应的掩膜图像。
*/


#include "opencv2/imgproc.hpp"  // 导入OpenCV图像处理头文件
#include "opencv2/imgcodecs.hpp"  // 导入OpenCV图像编码解码头文件
#include "opencv2/highgui.hpp"  // 导入OpenCV高层图形用户界面头文件
#include <iostream>  // 导入输入输出流头文件


using namespace std;  // 使用std命名空间,避免每次都要加std::
using namespace cv;  // 使用cv命名空间,避免每次都要加cv::


Mat src, img1, mask, final;  // 定义Mat类对象src(源图像),img1(中间图像),mask(
### 如何使用 C++ 和 OpenCV 实现图像中特定区域的染色 要实现图像中特定区域的染色功能,可以通过 OpenCV 提供的 `floodFill` 方法来完成。此方法允许指定一个种子点,并根据设定的颜色范围或阈值条件找到与该种子点相连通的区域并对其进行着色。 以下是具体实现过程以及示例代码: #### 使用 FloodFill 进行区域染色 OpenCV 中的 `floodFill` 函数能够从给定的种子点出发,寻找与其连通且满足一定条件(如颜色相似度)的像素集合,并将其替换为目标颜色[^4]。下面是一个完整的例子展示如何通过鼠标点击事件动态选择种子点并对选定区域进行染色。 ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; Mat image, mask; // 输入图片和掩码矩阵 Point seed_point(-1, -1); // 鼠标点击位置初始化为空 int lo_diff = 20, up_diff = 20; // 定义上下限差值参数 Scalar new_color(255, 0, 0); // 新颜色设置为蓝色 BGR顺序 // 鼠标回调函数定义 void onMouse(int event, int x, int y, int flags, void*){ if(event == EVENT_LBUTTONDOWN && !mask.empty()){ seed_point = Point(x,y); floodFill(image, mask, seed_point, new_color, 0, Scalar(lo_diff,lo_diff,lo_diff), Scalar(up_diff,up_diff,up_diff)); imshow("Flood Fill Demo",image); } } int main(){ Mat src = imread("your_image.jpg"); // 替换为你自己的图片路径 if(src.empty()){ cout << "Could not open or find the image!" << endl; return -1; } image = src.clone(); namedWindow("Flood Fill Demo"); // 创建大小为 image.width+2 * image.height+2 的单通道掩模图 mask.create(image.rows + 2, image.cols + 2, CV_8UC1); setMouseCallback("Flood Fill Demo",onMouse,NULL); imshow("Flood Fill Demo",image); while(char(waitKey()) != 'q'); // 按下 q 键退出程序 destroyAllWindows(); return 0; } ``` 上述代码展示了如何利用 OpenCV 库中的 `floodFill()` 函数结合简单的 GUI 来让用户交互式地标记感兴趣的对象区域并改变它的颜色。 #### 关键概念解释 - **Mask**: 在调用 `floodFill` 时使用的额外二进制图像,它记录哪些像素已经被访问过。这有助于防止重复填充同一部分或者跨越边界的情况发生。 - **LoDiff & UpDiff**: 控制当前像素及其邻居之间的最大亮度差异。较小数值意味着更严格的匹配标准;较大则表示较宽松的标准。 - **Seed Point**: 用户通过鼠标左键点击确定的位置作为起始搜索节点。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值