前言

1.在图像处理中,会用鼠标选择一个感兴趣的区域进行相关的操作,我这里演示如何用鼠标选择任何形状的ROI,就你Ps的抠图一样,使用鼠标左键选择一个任何形状的区域,生成新的图像。
2.我演示的代码环境是,IDE是VS2015,使用的是OpenCV3.30这个版本。

选择任何形状的ROI

#include <iostream>
#include<opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>     using namespace cv;//定义全局坐标系
Point prev_pt = Point(-1, -1);
Mat src, background_img, foreground_img;void on_mouse(int event, int x, int y, int flags, void*){//松开鼠标左键或不是按住左键拖拽的动作时,把坐标还原 if (event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON))      {prev_pt = Point(-1, -1);}//按下左键else if (event == CV_EVENT_LBUTTONDOWN)                                    {prev_pt = Point(x, y);}//移动鼠标并按住左键拖拽else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))    {Point pt = Point(x, y);//前景模板上划线line(foreground_img, prev_pt, pt, Scalar(255), 2, 8, 0); //原图上划线   Scalar::all(255)意思就是BGR通道像素值全为255line(src, prev_pt, pt, Scalar::all(255), 2, 8, 0); //起点等于终点,说明曲线要比prev_pt = pt;imshow("原图", src);}//点击右键,截取所选区域if (event == CV_EVENT_RBUTTONUP)                          {Mat dst;//画线闭合区域被白色填充显示在原始图像上floodFill(foreground_img, Point(x, y), Scalar(255));// img中被FG_mask掩盖后的图像附到FG中显示              src.copyTo(dst, foreground_img); namedWindow("ROI", 0);imshow("ROI", dst);}
}
int main()
{Mat image = imread("4.jpg");//初始化前景和背景模板      foreground_img = Mat(image.size(), CV_8UC1, Scalar(0));                                                  image.copyTo(src);//显示原图namedWindow("原图", 0);imshow("原图", src);    cvSetMouseCallback("原图", on_mouse, 0);waitKey(0);return 0;
}

结果

1.运行之后,按下鼠标左键,对着要选择的区域拖动鼠标描边,闭合之后松开左键,点击右键,得到ROI区域。

2.如果不闭合,按漫水填充的算法,会得到整张图像。

OpenCV图像处理使用笔记(一)——使用鼠标选取任何形状的ROI相关推荐

  1. OPENCV图像处理基础(五)鼠标事件画个框

    在GUI编程中会涉及到鼠标事件,通过鼠标事件可以使得人和机器的交互更为便捷.opencv中提供了一种以回调函数实现的鼠标事件机制. 下面是一个例子,通过鼠标在一张图片上画出任意大小的矩形框. 效果如下 ...

  2. OpenCV图像处理使用笔记(八)——Sobel算子

    前言 前面博客讲了矩阵之间的卷积操作,在图像处理中,使用一些标准的模板的卷积核与原图像进行运算,可以改变像素强度,从而影响周围其他像素的强度,常用于图像模糊.锐化及边缘检测等. Sobel算子 1.S ...

  3. OpenCV图像处理使用笔记(七)——卷积运算原理

    前言 1.在图像处理中,特别在深度学习图像处理,最常看到图像卷积操作,那什么是卷积呢,卷积就是两个原函数产生一个新的函数,两个函数之间的这种操作就称着卷积,在图像这里的图像卷积也用输入的图像矩阵与一个 ...

  4. OpenCV图像处理使用笔记(六)——图像滤波

    前言 1.图像滤波也叫图像模糊,是平滑图像像素常用处理的方式,通常是为了达到减少图像噪声和伪影,或者降低图像分辨率,OpenCV提供了常用的五种图像模糊操作. 2.我的这里演示的系统环境是Linux, ...

  5. OpenCV图像处理使用笔记(四)——图像融合

    前言常用 1.在OpenCV中定义了好多函数用来操作图像矩阵,有两个矩阵相加的,相减的,混合的,下面我使用QT加OpenCV演示图像融合这个函数. 2.我的IDE是Qt creator,OpenCV的 ...

  6. OpenCV图像处理使用笔记(五)——图像边界拓展

    前言 1.在OpenCV滤波和卷积算法中,在进行核运算的过程时候,矩阵边界拓展是一个非常重要的处理,OpenCV提供的函数copyMakeBorder()来拓展边界. 2.我的系统环境是Linux,加 ...

  7. OpenCV图像处理使用笔记(二)——图像矩阵的掩膜操作

    前言 1.数字图像处理中的掩膜的概念是起源于于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形"底片"称为掩膜(也称作"掩模" ...

  8. OpenCV图像处理使用笔记(三)——单通道的Mat对象强转为三通道的Mat对象

    前言 在机器学习和深度学习的时候,对图像进行处理时,会遇到明明是给的三通道的图像,但因为是黑白的,程序判断为单通道的图像,这样让人很无语,还有有时候有些库必须要传入三通道的RGB图像,但为了提升处理的 ...

  9. qt+opencv图像处理实现笔记

    在Qt里按钮控件默认对应一个on_pushButton_clicked()成员,如果想用点击信号,在代码中实现on_pushButton_clicked()成员即可. 图像预处理 灰度处理.灰度直方图 ...

最新文章

  1. Chapter 1 Securing Your Server and Network(9):使用Kerberos用于身份验证
  2. LeetCode Factorial Trailing Zeroes(计算阶乘结果尾部有几个0)
  3. python映射类型是什么意思_Python对象类型
  4. AUTOSAR从入门到精通100讲(二十)-特斯拉、高通、华为AI处理器深度分析
  5. [react] 如何更新组件的状态?
  6. xg push sdk android,AppCan文档中心-uexXGPush
  7. 【学习笔记】cs231n-assignment2-FullyConnectedNets
  8. 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
  9. 普通代码签名证书和EV代码签名证书的区别
  10. *TEST 10 for NOIP 迷幻测试 (230/300)
  11. 谷歌浏览器反复提示PageOffice安装
  12. 架构师更多的是和人打交道,说说我见到和听说到的架构师升级步骤和平时的工作内容
  13. 李宏毅学习笔记43.More about Domain Adaptation. Part II. Applications
  14. 华为 watch fit 鸿蒙,华为新款智能手表 Watch Fit 曝光,矩形表盘,支持近 100 种运动模式...
  15. OA系统如何实现实时项目成本核算
  16. 扫地机器人黑色耐脏吗_扫地机买什么 篇七:中秋送礼 我最后选择了黑色的石头:石头扫地机近一年使用心得 与 S55黑色版开箱...
  17. Mathematica
  18. React使用antd
  19. [BX]和内存单元的描述
  20. pd.concat() Pandas 数据的拼接

热门文章

  1. JVM 优点与缺点的深入分析
  2. 【LSH源码分析】p稳定分布LSH算法
  3. 卷积Groups Group Convolutions
  4. 鸟哥的Linux私房菜(服务器)- 主机基本安全之二: Linux线上自动升級
  5. 鸟哥的Linux私房菜(服务器)- 簡易 OpenWebMail 設定
  6. 计算机视觉Computer Vision网址导航
  7. 人工智能:第九章 Agent (艾真体)
  8. FISCO BCOS 2.0发布:新增群组架构克服吞吐瓶颈
  9. 用开源组件构建属于你的 PHP 框架
  10. 找到 mysql 数据库中的不良索引