C++ opencv 截取任意形状封闭图形
C++ opencv 截取任意形状封闭图形
漫水填充加模板实现截图。
**实现思路:**创建一个原图大小相同的单通道白色模板,在原图上通过鼠标圈出抠图区域,
并在模板上相同区域使用黑色线条画出对应区域,再将模板进行漫水填充,模板所选区域外全为黑色,区域内为白色。最后,使用copyTo()将模板上不为0的区域像素拷贝出来。
//FloodFill漫水函数原型
int floodFill(InputOutputArray image, InputOutputArray mask,Point seedPoint, Scalar newVal, Rect* rect=0,Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 );InputOutputArray:输入和输出图像。mask: 输入的掩码图像。seedPoint: 进行填充的起始点。 newVal: 图像中所有被算法选中的点,都用这个数值来填充。rect: 最小包围矩阵。loDiff: 最大的低亮度之间的差异。upDiff: 最大的高亮度之间的差异。flag: 选择算法连接方式。
// copyTo函数
src.copyTo(dst, mask);
src拷贝原图,dst结果图,mask模板。
mask不存在时将src拷贝给dst,存在时将mask像素不为0的区域拷贝给dst。
Mat dst = src;浅复制,共享同一块内存;copyto深复制,各自拥有内存。
//初始化及回调函数的调用bool g_bDrawingBox = false;//记录鼠标左键是否按下Rect g_rectangle; //画矩形所用rectPoint2i roi_p;//路径上的点 //画任意线条image_mask.create(roi_image1.rows, roi_image1.cols, CV_8U);image_mask.setTo(Scalar(255));setMouseCallback("裁剪图", mouse, (void*)&roi_image1);while (1){if (waitKey(10) == 27) { break; }//esc键,程序退出imshow("裁剪图", roi_image1);}//回调函数void mouse(int event, int x, int y, int flags, void* param) {Mat& image = *(Mat*)param;switch (event){case EVENT_LBUTTONDOWN: {cout << "EVENT_LBUTTONDOWN" << endl;g_bDrawingBox = true;g_rectangle = Rect(x, y, 0, 0);roi_p.x = x;roi_p.y = y;}break;case EVENT_MOUSEMOVE: {if (g_bDrawingBox) {g_rectangle.width = x - g_rectangle.x;g_rectangle.height = y - g_rectangle.y;line(image, roi_p, Point2i(x,y), Scalar(0, 0, 255), 1, CV_AA);line(image_mask, roi_p, Point2i(x, y), Scalar(0), 3, 8);roi_p.x = x;roi_p.y = y;}}break;case EVENT_LBUTTONUP: {// 可以将起点和终点的矩形画出来cout << "EVENT_LBUTTONUP" << endl;g_bDrawingBox = false;if (g_rectangle.width < 0) {g_rectangle.x += g_rectangle.width;g_rectangle.width *= -1;}if (g_rectangle.height < 0) {g_rectangle.y += g_rectangle.height;g_rectangle.height *= -1;}rectangle(image, g_rectangle, Scalar(0, 0, 255));}break;case EVENT_RBUTTONUP: {floodFill(image_mask, Point(100, 100), Scalar(0, 0, 0));//漫水填充image.copyTo(dst, image_mask);//抠图}}
}
C++ opencv 截取任意形状封闭图形相关推荐
- windows自带的比微信好用的截图工具:截取任意形状图片,标尺画直线,窗口图精准截取
快捷键 win+shift+s 可以调用 windows 自带的截图工具. 这个工具最主要有三个优点: ① 就是可以截取任意形状. ② 编辑时,可以借助标尺画很直的线. ③ 窗口完美包裹截图,强迫症的 ...
- 新版QQ功能录制屏幕、截取任意形状、屏幕文字识别
是不是觉得QQ PC版最近的更新都是在网课功能上了呢?对的,腾讯为了同学们可以更好地上网课真是操碎了心.不过QQ最近推出了9.3.2版,这一次的更新可是跟网课无关,此次更新带给用户几个非常好用的新功能 ...
- opencv实现任意形状的内切圆
参考任意多边形的最大内切圆算法_海风吹来的石头的博客-CSDN博客_c++ 最大内切圆 前言 利用opencv的distanceTransform函数实现内切圆,对于稍微大一点的图像,耗时很严重,所以 ...
- 如何用python绘制灰度直方图_Python Opencv任意形状目标检测并绘制框图实例
Python Opencv检测并绘制框图 opencv 进行任意形状目标识别,供大家参考,具体内容如下 工作中有一次需要在简单的图上进行目标识别,目标的形状不固定,并且存在一定程度上的噪声影响,但是噪 ...
- 绘制简单封闭图形并且进行填充
思路:绘制封闭曲线,获得轮廓, 对轮廓进行填充 因为在绘制曲线的时候,记录了起始点和最后一个点的坐标,用以使曲线封闭,所以绘制的时候只需要绘制到起点的附近区域即可,松开鼠标后,曲线连接起点和终点,实现 ...
- python使用opencv将tif裁剪为任意形状
python使用opencv将tif裁剪为任意形状 前言 一.opencv是什么? 二.使用步骤 1.安装依赖 2.裁剪 总结 前言 博主最近在研究如何将tif裁剪成需要的任意形状,博主考虑过gdal ...
- VISIO 2010,不规则封闭图形填充方法
转自:http://blog.chinaunix.net/uid-11829250-id-3476687.html 使用VISIO(2010)时,对规则的封闭图形填充非常简单,但是要想画一个不规则的图 ...
- ICCV 2019 Oral 端到端任意形状场景文字识别
点击我爱计算机视觉标星,更快获取CVML新技术 本文简要介绍来自谷歌近期的一篇论文"Towards Unconstrained End-to-End Text Spotting", ...
- opencv之基本形状识别
文章目录 opencv之基本形状识别 各种博客上的现有方法 新方法--从信号的角度分析 实验结果 通过上面这些图可以得到图下结论: 附代码 opencv之基本形状识别 各种博客上的现有方法 https ...
最新文章
- 小米数据管理与应用实践
- CVPR 2021 | 国防科大:基于几何稳定性分析的物体位姿估计方法
- Java 性能优化之 String 篇
- python 清空所有对象_Python编程思想(7):列表的增删改操作
- Swift入门篇-循环语句
- RE:SB的SDOISB记
- WebKit中的Chrome和ChromeClient
- 极光:2021年移动互联网母婴亲子行业研究报告
- C++新特性探究(十五):bind
- 中年码农,最后的倔强!
- 多目标优化算法_阿里提出多目标优化全新算法框架,同时提升电商GMV和CTR
- vc++ 6.0 三次bezier曲线绘制_Python matplotlib绘制散点图
- Linux网络编程:libnet 移植及使用
- 软素质面试题分享以及一些面试技巧和面试礼仪
- php绘制的图像是什么格式,图片一般是什么格式
- dhcp服务器 无线桥接,老款TP-Link TL-WR841N路由器无线桥接设置方法
- 根据表达式序列(前缀、中缀、后缀)构建表达式树
- educoder 2-2Python 计算思维训练——循环与列表(二)
- 【33】解读TPU:设计和拆解一块ASIC芯片
- POJ 3255(迪杰斯特拉算法求次短路)