通過Opencv自帶的函數功能cvRectangle來實現用鼠標畫矩形,具體代碼如下:
#include "stdio.h"
#include "highgui.h"
#include "cv.h"
void my_mouse_callback(int event,int x,int y,int flags,void *param);
CvRect box;
/*
typedef struct CvRect
{
int x;
int y;
int width;
int height;
}
CvRect;
*/
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));
/* 函數原型:void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,int thickness=1, int line_type=8, int shift=0 );
參數介紹:
img -- 圖像.
pt1 -- 矩形的一個頂點。
pt2 -- 矩形對角線上的另一個頂點
color -- 線條顏色 (RGB) 或亮度(灰度圖像 )(grayscale image)。
thickness -- 組成矩形的線條的粗細程度。取負值時(如 CV_FILLED)函數繪製填充了色彩的矩形。
line_type -- 線條的類型。見cvLine的描述
shift -- 座標點的小數點位數。*/
}
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);
//clone是把所有的都複製過來,也就是說不論你是否設置Roi,Coi等影響copy的參數,clone都會原封不動的克隆過來。
//copy就不一樣,只會複製ROI區域等。用clone複製之後,源圖像在內存中消失後,複製的圖像也變了,而用copy複製,源圖像消失後,複製的圖像不變
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)
//接收到ESC按鍵
{
break;
}
}
cvReleaseImage(&image);
cvReleaseImage(&temp);
cvDestroyWindow("Box Example");
printf("Hello World!\n");
return 0;
}
//響應畫矩形
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;
}
}