前言

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. 如何在离开页面时弹出确认对话框
  2. LeetCode 2 两数相加
  3. 第十一届蓝桥杯校内赛题解
  4. 更改windows2003最大连接数的方法
  5. 大型网站架构技术一览
  6. 同软件多个线程设置不同ip_多线程--面试知识
  7. 《我的视频我做主:Premiere Pro CS5实战精粹》——第一部分 基础篇 第1章 非线性剪辑基础 1.1 认识非线性剪辑...
  8. linux usleep 线程控制权_linux多线程同步—信号量
  9. 【Python】Paramiko模块实现Linux服务器远程文件操作
  10. jquery中如何表达本页网址_如何用js得到当前页面的url信息方法(JS获取当前网址信息)...
  11. Linux中出现 -bash: unzip: command not found
  12. Python之对list进行切片
  13. 《Spring5官方文档》新功能(4,3)
  14. 海尔微型计算机U盘启动,海尔台式电脑如何bios设置u盘启动教程
  15. c语言do while例子,C语言do while循环
  16. /hv/hv_go.h:14:27: fatal error: metslib/mets.hh: No such file or director解决办法
  17. 中华瑰宝之山西人的面食
  18. java安装出现向导中断,在Macromedia Dreamweaver 8 完整安装之前向导已中断的解决办法...
  19. 网络新闻评论观点挖掘系统实现
  20. java 实现58热敏票据打印

热门文章

  1. linux 命令last -x,Linux常用命令last的使用方法详解
  2. 面试题总结16 对一个整数开根号
  3. 对象在JVM中的表示: OOP-Klass模型
  4. Log4j的isdebugEnabled的作用
  5. Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap
  6. 计算机从业者的技术成长学习之路
  7. C++实用技巧(四)
  8. Coursera公开课笔记: 斯坦福大学机器学习第一课“引言(Introduction)”
  9. 【Java集合系列】---ArrayList
  10. OpenCv实现两幅图像的拼接