之前介绍的直方图反向投影算法,在编码过程中是通过在查询图像中设置感兴趣区域,作为模板图像,并直观,实现方法比较挫,于是想到了OpenCV中是否提供了鼠标和键盘事件的控制方法,通过鼠标事件任意选择感兴趣区域作为模板图像,结果到网上一搜索,发现OpenCV中果然提供了相关接口,但是网上提供的例程多数是基于C语言接口的,使用的图像容器还是比较早版本的IplImage,针对Mat容器的还比较少,于是就参考了一下其代码,对其进行了改写,通过鼠标事件实现了屏幕截图功能,并可以通过键盘事件对感兴趣区域进行平移以及放大和缩小操作,同时将截取的图像保存下来,具体实现如下,供感兴趣的同学参考一下这样只需要对之前Blog中提供的代码进行简单修改就可以实现前面所说的功能。
链接如下
OpenCV之灰度直方图反向投影(图像相似性检测):http://blog.csdn.net/forthcriminson/article/details/8543781
OpenCV之彩色直方图反向投影(图像相似性检测):http://blog.csdn.net/forthcriminson/article/details/8546945
#include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> #include <ctype.h> using namespace cv; using namespace std; CvPoint pt1 = Point(0,0); CvPoint pt2 = Point(0,0); bool is_selecting = false; void cvMouseCallback(int mouseEvent,int x,int y,int flags,void* param) { switch(mouseEvent) { case CV_EVENT_LBUTTONDOWN: pt1 = Point(x,y); pt2 = Point(x,y); is_selecting = true; break; case CV_EVENT_MOUSEMOVE: if(is_selecting) pt2 = Point(x,y); break; case CV_EVENT_LBUTTONUP: pt2 = Point(x,y); is_selecting = false; break; } return; } int main(int argc,char* argv[]) { char* window = "img"; Mat img = imread("D:\\1.jpg",1); Mat img_show,roi; img.copyTo(img_show); namedWindow(window,CV_WINDOW_AUTOSIZE); setMouseCallback(window,cvMouseCallback); bool shift_on = false; while(true) { img.copyTo(img_show); rectangle(img_show,pt1,pt2,Scalar(255,255,255)); imshow(window,img_show); char key = cvWaitKey(10); switch(key) { //ROI平移操作 case '\t': shift_on = !shift_on; break; case 'a': pt1.x--; pt2.x--; break; case 's': pt1.y++; pt2.y++; break; case 'd': pt1.x++; pt2.x++; break; case 'w': pt1.y--; pt2.y--; break; //ROI放大和缩小,主要是对初始设置的ROI区域的边缘进行平移操作 case '1': if(shift_on) pt1.x--; else pt2.x--; break; case '2': if(shift_on) pt2.y++; else pt1.y++; break; case '3': if(shift_on) pt2.x++; else pt1.x++; break; case '4': if(shift_on) pt1.y--; else pt2.y--; break; //回车确定最终ROI区域的截取,并将其保存下来 case '\r': roi=img(Rect(pt1.x,pt1.y,std::abs(pt2.x-pt1.x),std::abs(pt2.y-pt1.y))); imwrite("D:\\ROI.jpg",roi); break; }; if(key==27) break; } return 0; }
作者:forthcriminson 发表于2013-1-28 22:30:15 原文链接
阅读:72 评论:0 查看评论