首页 > 代码库 > 用鼠标在窗口中画方形

用鼠标在窗口中画方形

最近在看《学习opencv》,下面的程序是利用opencv实现鼠标在窗口中画方形:

#include <cv.h>
#include <highgui.h>
#include <stdbool.h>

void my_mouse_callback(
    int x, int event, 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,0),
        1,8, 0);
}
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",CV_WINDOW_AUTOSIZE);
    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 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;
    }
}

 

用鼠标在窗口中画方形