滑鼠在視窗中繪製矩形
阿新 • • 發佈:2019-02-04
#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; } }