OpenCV之鼠标和键盘事件处理

来源:互联网 发布:java线程数量 编辑:程序博客网 时间:2024/06/05 20:19

       之前介绍的直方图反向投影算法,在编码过程中是通过在查询图像中设置感兴趣区域,作为模板图像,并直观,实现方法比较挫,于是想到了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;}