现在的位置: 首页 > 综合 > 正文

《学习OpenCV》第四章(1)

2017年10月14日 ⁄ 综合 ⁄ 共 1403字 ⁄ 字号 评论关闭

鼠标事件

这一节接触了以下内容

CvMouseCallback(int event, int x, int y, int flags, void* param)和cvSetMouseCallback(const char* window_name, CvMouseCallback on_mouse, void* param=NULL):第一个为鼠标事件响应的回调函数,第二个为回调函数的注册函数;

为了可以相应鼠标点击事件,首先必须创建一个回调函数,使鼠标点击事件发生时OpenCV可以调用这个函数,创建这个函数以后,需要在OpenCV中注册这个函数,以便特定窗口被触发鼠标事件以后,OpenCV可以正确调用这个函数。

程序编写:
编程环境:windows xp系统; opencv 1.0; VC++6.0;
程序说明:

这个程序可以通过鼠标来画方形。
加入头文件:
#include <cv.h>
#include <highgui.h>
主要程序代码:

	// TODO: Add extra initialization here

	box = cvRect(-1, -1, 0, 0);

	IplImage* image = cvCreateImage(cvSize(500, 500), IPL_DEPTH_8U, 3);	//创建图像
	cvZero(image);	//初始化图像
	IplImage* temp = cvCloneImage(image);	//克隆图像副本
	cvNamedWindow("lovely");

	cvSetMouseCallback("lovely", my_mouse_callback, (void*) image);	//注册回调函数

	while (1)
	{
		cvCopyImage(image, temp);
		if (drawing_box)
		{
			draw_box(temp, box);
		}
		cvShowImage("lovely", temp);

		if (cvWaitKey(15) == 27)
		{
			break;
		}
	}

//画方形
void draw_box(IplImage *img, CvRect rect)
{
	cvRectangle(img, cvPoint(box.x, box.y), cvPoint(box.x+box.width, box.y+box.height), cvScalar(0xff, 0x00, 0x00));
}

//鼠标事件的响应函数
void my_mouse_callback(int event, int x, int y, int flags, void* param)
{
	IplImage* image = (IplImage*)param;

	switch(event) {
	case CV_EVENT_MOUSEMOVE:
		if (drawing_box)
		{
			box.width  = x-box.x;
			box.height = y-box.y;
		}
		break;
	case CV_EVENT_LBUTTONDOWN:
		drawing_box = true;
		box = cvRect(x, y, 0, 0);
		break;
	case CV_EVENT_LBUTTONUP:
		drawing_box = false;
		if (box.width < 0)
		{
			box.x += box.width;
			box.width *= -1;
		}
		if (box.height < 0)
		{
			box.y += box.height;
			box.height *= -1;
		}
		draw_box(image, box);
		break;
	}
}

运行成功界面:


程序源代码下载

抱歉!评论已关闭.