您的位置:首页 > 运维架构

opencv:鼠标事件

2017-02-07 22:26 197 查看
鼠标事件类型

CV_EVENT_MOUSEMOVE
0
CV_EVENT_LBUTTONDOWN
1
CV_EVENT_RBUTTONDOWN
2
CV_EVENT_MRUTTONDOWN
3
CV_EVENT_LBUTTONUP
4
CV_EVENT_RBUTTONUP
5
CV_EVENT_MBUTTONUP
6
CV_EVENT_LBUTTONDBLCLK
7
CV_EVENT_RBUTTONDBLCLK
8
CV_EVENT_MBUTTONDBLCLK
9


鼠标事件标志

CV_EVENT_FLAG_LBUTTON
1
CV_EVENT_FLAG_RBUTTON
2
CV_EVENT_FLAG_MBUTTON
3
CV_EVENT_FLAG_CTRLKEY
8
CV_EVENT_FLAG_SHIFTKEY
16
CV_EVENT_FLAG_ALTKEY
32


用鼠标画矩形

//鼠标事件注册
void cvSetMouseCallback(const char* window_name,CvMouseCallback on_mouse,void* param = NULL);


#include "cv.h"
#include "highgui.h"
//鼠标事件声明
void my_mouse_callback(int event,int x,int y,int flags,void* param);
//声明矩形
CvRect box;
//画矩形的标志变量
bool drawing_box = false;
//在图像上画一个矩形
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));
}

int main(int argc,char** argv)
{
box = cvRect(-1,-1,0,0);

IplImage* image = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,3);
cvZero(image);

IplImage* temp = cvCloneImage(image);
cvNamedWindow("Example3_6",0);

//注册鼠标事件
cvSetMouseCallback("Example3_6",my_mouse_callback,(void*)image);

while (1)
{
cvCopyImage(image,temp);
if (drawing_box)
{
draw_box(temp,box);
}
cvShowImage("Example3_6",temp);
if (cvWaitKey(15) == 27)
{
break;
}
}
cvReleaseImage(&image);
cvReleaseImage(&temp);
cvDestroyAllWindows();
}
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;
default:
break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: