#include <cv.h>
#include <highgui.h>
#include <stdio.h>
using namespace cv;
using namespace std;
/*********** 回调函数声明 ****************/
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("Box Example"); //创建窗口
/**************** 注册回调函数到OpenCV中 ***********************/
cvSetMouseCallback("Box Example", my_mouse_callback, (void *)image);
while (1)
{
cvCopyImage(image, temp); //将image数据复制到temp中
if (drawing_box)
draw_box(temp, box); //在temp中绘制矩形
cvShowImage("Box Example", temp); //在Box Example窗口中显示绘制的矩形
if (cvWaitKey(15) == 27)
break;
}
}
void my_mouse_callback(int event, int x, int y, int flags, void* param)
{
//将注册回调函数中的参数(void*)param恢复并保存到image中
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;
}
}
鼠标在窗口中绘制矩形
最新推荐文章于 2024-07-23 17:03:04 发布