Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

OpenCV之鼠标和键盘事件处理

$
0
0

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

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>