【问题标题】:opencv set mouse callbackopencv设置鼠标回调
【发布时间】:2013-02-14 22:23:35
【问题描述】:

我是 OpenCV 的初学者,想在控制台中打印我通过单击定义的像素(RGB 格式)的特定值。

经过一些搜索,我设法打印出我在图像上点击的坐标。

如果有人知道怎么做,请修改我正在使用的代码:

void mouseEvent (int evt, int x, int y, int flags, void* param)
{                    
     if (evt == CV_EVENT_LBUTTONDOWN)
     { 
          printf("%d %d\n",x ,y );  
     }         
}

这是我用来调用函数的:

cvSetMouseCallback("blah blah", mouseEvent, 0);

【问题讨论】:

    标签: opencv mouseevent


    【解决方案1】:

    把你的图片放在一个叫做 frame 的 Mat 中,然后:

    namedWindow("test");
    cvSetMouseCallback("test", mouseEvent, &frame);
    
    char key = 0;
    while ((int)key != 27) {
        imshow("test", frame);
        key =  waitKey(1);
    }
    

    其中mouseEvent定义为:

    void mouseEvent(int evt, int x, int y, int flags, void* param) {                    
        Mat* rgb = (Mat*) param;
        if (evt == CV_EVENT_LBUTTONDOWN) { 
            printf("%d %d: %d, %d, %d\n", 
            x, y, 
            (int)(*rgb).at<Vec3b>(y, x)[0], 
            (int)(*rgb).at<Vec3b>(y, x)[1], 
            (int)(*rgb).at<Vec3b>(y, x)[2]); 
        }         
    }
    

    【讨论】:

    • 只是为了澄清你对Cristian的回答:cvSetMouseCallback()的最后一个参数是一个指针,它用于将用户数据发送到回调。因此,我们感兴趣的数据是发送其图像本身,因此当点击时,您可以访问该指定位置的像素。这就是这个答案所显示的。
    • 感谢答案,但仍有一些困难:我在 Dev c++ 上使用 OpenCV 2.1。我已尝试将 Mat* rgb 切换为 CvScalar,但仍需更改 (*rgb).at(y, x)[0]。如果您知道如何为 2.1 更改此设置,我将不胜感激!
    • 做到了!我已将 (int)(rgb).at(y, x)[0] 替换为 ((uchar)(rgb->imageData + rgb->widthStepy) )[x*3] 和 Mat rgb = (Mat*) 参数;使用 IplImage* rgb = (IplImage*) 参数;感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多