Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opencv设置鼠标回调_Opencv_Mouseevent - Fatal编程技术网

opencv设置鼠标回调

opencv设置鼠标回调,opencv,mouseevent,Opencv,Mouseevent,我是OpenCV的初学者,希望在控制台中打印我通过单击定义的像素(RGB格式)的特定值 经过一些搜索,我设法找到了我在图像上点击的坐标 如果有人知道如何做到这一点,请修改我正在使用的代码: void mouseEvent (int evt, int x, int y, int flags, void* param) { if (evt == CV_EVENT_LBUTTONDOWN) { printf("%d %d

我是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);

将您的图像放置在称为frame的垫子中,然后:

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]); 
    }         
}
void mouseEvent(int-evt、int-x、int-y、int-flags、void*param){
Mat*rgb=(Mat*)参数;
如果(evt==CV_事件_LBUTTONDOWN){
printf(“%d%d:%d,%d,%d\n”,
x、 y,,
(int)(rgb).at(y,x)[0],
(int)(rgb).at(y,x)[1],
(int)(rgb).at(y,x)[2]);
}         
}

将您的图像放在一个名为frame的垫子上,然后:

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]); 
    }         
}
void mouseEvent(int-evt、int-x、int-y、int-flags、void*param){
Mat*rgb=(Mat*)参数;
如果(evt==CV_事件_LBUTTONDOWN){
printf(“%d%d:%d,%d,%d\n”,
x、 y,,
(int)(rgb).at(y,x)[0],
(int)(rgb).at(y,x)[1],
(int)(rgb).at(y,x)[2]);
}         
}

只是为了澄清您对克里斯蒂安的回答:
cvSetMouseCallback()
的最后一个参数是指针,用于向回调发送用户数据。因此,我们感兴趣的数据发送到图像本身,这样当点击时,您可以访问指定位置的像素。这就是答案。THX对于答案伴侣,但仍然存在一些困难:我在OpenDV 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*)参数;谢谢你的帮助!为了向克里斯蒂安澄清您的答案:
cvSetMouseCallback()
的最后一个参数是指针,用于向回调发送用户数据。因此,我们感兴趣的数据发送到图像本身,这样当点击时,您可以访问指定位置的像素。这就是答案。THX对于答案伴侣,但仍然存在一些困难:我在OpenDV 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*)参数;谢谢你的帮助!