OpenCV鼠标事件响应

程序定义了一个drawbox结构,结构中包含矩形的两个对角点,两个图像指针(程序可以指定在哪个图像上画矩形)和一个控制是否画图的bool类型变量。在回调函数中,程序监听了三种类型的鼠标事件:左键按下、鼠标移动和左键抬起。这三种类型的鼠标事件定义了一个完整的鼠标画图过程。左键按下时开始画图,拖动显示所画的图形,左键抬起表示画图结束。在结束之前,为了实时显示所画的图形,将所画的图放在box结构中的temp变量中,待画图结束时在box结构的image中存放这一次画图的最终结果。

    #include<cv.h>
    #include<highgui.h>
    #include<iostream>
    using namespace std;
    // callback function
    void cvMouseCallback(int mouseEvent,int x,int y,int flags,void* param);
    struct drawbox
    {
    CvPoint point1;
    CvPoint point2;
    IplImage* image;
    IplImage* temp;
    bool isDraw;
    }; Unity3D教程手册
    int main(int argc,char* argv[])
    {
    // declare and initialize a struct drawbox variable
    drawbox box;
    box.point1 = cvPoint(0,0);
    box.point2 = cvPoint(0,0);
    box.image = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
    cvZero(box.image);
    box.temp = cvCloneImage(box.image);
    box.isDraw = false;
    // register a mouse callback function
    cvNamedWindow("exam",CV_WINDOW_AUTOSIZE);
    cvSetMouseCallback("exam",cvMouseCallback,&box);
    while(1)
    {
    cvCopy(box.image,box.temp);
    if(box.isDraw)
    {
    cvRectangle(box.temp,box.point1,box.point2,CV_RGB(255,255,255));
    }
    cvShowImage("exam",box.temp);
    if(cvWaitKey(20) == 27) break;
    }
    cvReleaseImage(&box.image);
    cvReleaseImage(&box.temp);
    cvDestroyWindow("exam");
    return 0;
    }
    void cvMouseCallback(int mouseEvent,int x,int y,int flags,void* param)
    {
    drawbox* box = (drawbox*)param;
    switch(mouseEvent)
    {
    case CV_EVENT_LBUTTONDOWN:
    box->point1 = cvPoint(x,y);
    box->point2 = cvPoint(x,y);
    box->isDraw = true;
    break;
    case CV_EVENT_MOUSEMOVE:
    box->point2 = cvPoint(x,y);
    break;
    case CV_EVENT_LBUTTONUP:
    box->point2 = cvPoint(x,y);
    cvRectangle(box->image,box->point1,box->point2,CV_RGB(0,255,0));
    box->isDraw = false;
    break;
    }
    return;
    } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小姑娘很大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值