概述
在上一篇小弟用了一个较为麻烦且取巧的办法利用opencv对图像进行简单的截图。
今天更进一步,利用鼠标直接在图片上使用矩形框选取感兴趣区域截图,真正类似于qq微信的截图方式。
运行结果如下
代码如下
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Rect select;
bool select_flag = false;//bool flag=false; 这句是定义了一个变量为flag 在下面代码中出现的flag都是这个变量
Mat tu1, tu2;
void S_on_Mouse(int event, int x, int y, int flags, void*param)
{
Point p1, p2;
switch (event)
{
case EVENT_LBUTTONDOWN://点击鼠标左键发生的事件
{
select.x = x;
select.y = y;
select_flag = true;
}
break;
case EVENT_MOUSEMOVE://移动鼠标发生的事件
{
if (select_flag)
{
tu1.copyTo(tu2);
p1 = Point(select.x, select.y);
p2 = Point(x, y);
rectangle(tu2, p1, p2, Scalar(0, 255, 0), 2,8);//tu2:待处理图片; p1, p2:代表左上右下矩形的点坐标; scalar:颜色2代表线条宽度; 8是线型,默认取8(可不填)
imshow("框选图", tu2);
}
}
break;
case EVENT_LBUTTONUP://松开鼠标左键发生的事件
{
//显示框出的ROI
Rect roi = Rect(Point(select.x, select.y), Point(x, y));
if (roi.width && roi.height)
{
Mat roiImg = tu1(roi);
imshow("截图", roiImg);
imwrite("截图.jpg", roiImg);//保存截图在工程目录下
}
select_flag = false;
}
break;
}
}
int main()
{
tu1 = imread("ming2.jpg");
tu2 = tu1.clone();
select.x = select.y = 0;//初始化xy的值
imshow("框选图", tu2);
while (1)
{
int key = waitKey(10);
switch (key)
{
case 'j'://按j再点击鼠标左键开始截图
setMouseCallback("框选图", S_on_Mouse, 0);//一旦调用鼠标就开始执行S_on_Mouse函数
break;
}
if (key == 27 || key == 's')//按s退出
break;
}
waitKey(0);
return 0;
}
以上主要运用到了调用鼠标事件
函数:cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse,void* param CV_DEFAULT(NULL));
画矩形框用到以下函数与rect不同
rectangle(tu2, p1, p2, Scalar(0, 255, 0), 2,8);
tu2:待处理图片;
p1, p2:代表左上右下矩形的点坐标;
scalar:颜色绿色
2代表线条宽度;
8是线型,默认取8(可不填)
Rect(x,y,width,height);
x, y 为左上角坐标,
width, height 则为长和宽。
写在最后
该方法参考了许多博主链接如下
1.rectangle函数与Rect函数的用法 - weixin_43491924的博客 - CSDN博客 https://blog.csdn.net/weixin_43491924/article/details/85218336
2.关于标记bool flag=false;-黑马程序员技术交流社区
http://bbs.itheima.com/thread-56606-1-1.html
3.opencv 截图并保存 - kalp_yp - CSDN博客
https://blog.csdn.net/u013539952/article/details/77171061
4.在OpenCV中调用鼠标事件 - k - CSDN博客 https://blog.csdn.net/qq_22033759/article/details/48415613
1524618
最后
以上就是积极期待为你收集整理的OpenCV学习9 获取图像感兴趣(ROI)区域并截图(2)的全部内容,希望文章能够帮你解决OpenCV学习9 获取图像感兴趣(ROI)区域并截图(2)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复