#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
void my_mouse_callback(int event0,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(0x00,0x00,0xff));
}
int _tmain(int argc, _TCHAR* 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");
cvSetMouseCallback("Box Example",my_mouse_callback,(void*)image);
while(1)
{
cvCopyImage(image,temp);
if(drawing_box) draw_box(temp,box);
cvShowImage("Box Example",temp);
if(cvWaitKey(15)==27) break;
}
cvReleaseImage(&image);
cvReleaseImage(&temp);
cvDestroyWindow("Box Example");
}
void my_mouse_callback(int event0,int x,int y,int flags,void* param)
{
IplImage* image=(IplImage*)param;
switch(event0)
{
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;
}
}
包括头文件;
声明鼠标事件的回调函数;event0 代表鼠标事件;x,y代表发生鼠标事件时鼠标位置坐标;flags表示发生时的状态;param可用来传递额外的参数信息。
在图像上画矩形
BGR (线条为红色)
定义图像:200X200,8位,三通道
图像背景为0 (黑色)
定义窗口
声明回调函数,把整个图像作为参数传入
主循环
15ms内如果有Esc按键则退出
退出时销毁图像
回调函数
鼠标移动时改变矩形的大小
左键点击定义矩形的起点
释放左键确定矩形的大小并画矩形
结果图像: