您好,欢迎来到Unity之家!   unity.jb51.net 
  • 首 页
  • 你问我答
  • 当前位置:首页 > 学习培训 > Unity编程 >
    OpenCV鼠标事件响应
    时间:2015-02-07 08:54 来源:Unity之家 作者:unity.jb51.net 浏览:收藏 挑错 推荐 打印



    程序定义了一个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;
        }



    好了。大家可复制代码,到unity中去做测试。

    欢迎大家来评论哟。。。

    (责任编辑:脚印)
    免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。