OpenCV鼠标画图例程,鼠标绘制矩形

本文提供了一个使用OpenCV库进行鼠标交互绘制矩形的示例程序。通过安装回调函数来响应用户的鼠标操作,实现动态绘制矩形框的功能。

文章出处来源于:

http://blog.youkuaiyun.com/wangyaninglm/article/details/19618871


#include <cv.h>  

#include <highgui.h>  
#pragma comment(lib,"opencv_core2413d.lib")  //等同于 附加依赖项所需的库文件

#pragma comment(lib,"opencv_highgui2413d.lib")  


/*
zlibd.lib
libjasperd.lib
libjpegd.lib
libpngd.lib
libtiffd.lib
vfw32.lib
comctl32.lib
IlmImf.lib
gdi32.lib
*/
//以下代码  经过测试  可用
// Define our callback which we will install for  
// mouse events.  
//  
void my_mouse_callback(int event, int x, int y, int flags, void* param);


CvRect box;
bool drawing_box = false;


// A litte subroutine to draw a box onto an image  
//  
void draw_box(IplImage* img, CvRect rect)
{
cvRectangle
(
img,
cvPoint(box.x, box.y),
cvPoint(box.x + box.width, box.y + box.height),
cvScalar(0x00, 0x00, 0xff)    /* red */
);
}


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");


// Here is the crucial moment that we actually install  
// the callback.  Note that we set the value ‘param’ to  
// be the image we are working with so that the callback  
// will have the image to edit.  
//  
cvSetMouseCallback(
"Box Example",
my_mouse_callback,
(void*)image
);


// The main program loop.  Here we copy the working image  
// to the ‘temp’ image, and if the user is drawing, then  
// put the currently contemplated box onto that temp image.  
// display the temp image, and wait 15ms for a keystroke,  
// then repeat…  
//  
while (1) {


cvCopyImage(image, temp);
if (drawing_box) draw_box(temp, box);
cvShowImage("Box Example", temp);


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


// Be tidy  
//  
cvReleaseImage(&image);
cvReleaseImage(&temp);
cvDestroyWindow("Box Example");
}


// This is our mouse callback.  If the user  
// presses the left button, we start a box.  
// when the user releases that button, then we  
// add the box to the current image.  When the  
// mouse is dragged (with the button down) we   
// resize the box.  
//  
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;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值