Opencv 使用cvSetMouseCallback处理鼠标事件

Opencv 使用cvSetMouseCallback处理鼠标事件,opencv,mouseevent,Opencv,Mouseevent,我正在使用OSX/Xcode/OpenCV 2.2为眼动跟踪器编写代码。作为眼动跟踪器培训过程的一部分,我使用cvSetMouseCallback捕获数据,如下所示: 右击右眼;左眼点击左键 但是,我发现该程序只能使用左键单击(CV_EVENT_LBUTTONDOWN)而不能使用右键单击(CV_EVENT_RBUTTONDOWN)。起初,我认为这是一个触摸板和鼠标设置问题,但事实证明,我已经设置了二次点击为“右”在机器上。如果有人能解释一下,我会很感激的?谢谢你抽出时间来调查这件事 对于那些感兴

我正在使用OSX/Xcode/OpenCV 2.2为眼动跟踪器编写代码。作为眼动跟踪器培训过程的一部分,我使用cvSetMouseCallback捕获数据,如下所示: 右击右眼;左眼点击左键

但是,我发现该程序只能使用左键单击(CV_EVENT_LBUTTONDOWN)而不能使用右键单击(CV_EVENT_RBUTTONDOWN)。起初,我认为这是一个触摸板和鼠标设置问题,但事实证明,我已经设置了二次点击为“右”在机器上。如果有人能解释一下,我会很感激的?谢谢你抽出时间来调查这件事

对于那些感兴趣的人,我有一个cvSetMouseCallback的简单代码片段:

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

void my_mouse_callback( int event, int x, int y, int flags, void* param );

int main (int argc, const char * argv[]) 
{

CvCapture *capture;
IplImage  *img;
int       key = 0;

// initialize camera
capture = cvCaptureFromCAM( 0 );

// always check
assert( capture );

// create a window
cvNamedWindow( "video", 1 );

while( key != 'q' ) {
    // get a frame
    img = cvQueryFrame( capture );

// set the mouse callback function. 
cvSetMouseCallback( "video", my_mouse_callback, (void*) img);

    // always check
    if( !img ) break;

// 'fix' frame
    cvFlip( img, img, 1 );
    img->origin = 0;

cvShowImage("video", img );

    // quit if user press 'q'
    key = cvWaitKey( 5 );

}

// free memory
cvReleaseCapture( &capture );
cvDestroyWindow( "video" );

return 0;

}

void my_mouse_callback( int event, int x, int y, int flags, void* param ){
//IplImage* image = (IplImage*) param;


switch( event ){
    case CV_EVENT_LBUTTONDOWN:
        printf("LBUTTONDOWN\n");
        break;

    case CV_EVENT_RBUTTONDOWN:
        printf("RBUTTONDOWN\n");
        break;

    case CV_EVENT_FLAG_CTRLKEY:
        printf("FLAG_LBUTTONDBLCLK\n");
        break;
}

}
#包括
#包括
#包括
void my_mouse_回调(int事件、int x、int y、int标志、void*param);
int main(int argc,const char*argv[]
{
捕获*捕获;
IplImage*img;
int键=0;
//初始化摄像机
捕获=cvCaptureFromCAM(0);
//经常检查
断言(捕获);
//创建一个窗口
cvNamedWindow(“视频”,1);
while(键!=“q”){
//拍一帧
img=cvQueryFrame(捕获);
//设置鼠标回调函数。
cvSetMouseCallback(“视频”,我的鼠标回调,(void*)img);
//经常检查
如果(!img)中断;
//“固定”框架
cvFlip(img,img,1);
img->origin=0;
cvShowImage(“视频”,img);
//如果用户按“q”,则退出
key=cvWaitKey(5);
}
//空闲内存
cvReleaseCapture(&capture);
视频窗口(“视频”);
返回0;
}
void my_mouse_回调(int事件、int x、int y、int标志、void*param){
//IplImage*图像=(IplImage*)参数;
开关(事件){
案例CV\u事件\u LBUTTONDOWN:
printf(“LBUTTONDOWN”);
打破
案例CV事件Buttondown:
printf(“RBUTTONDOWN”);
打破
案例CV事件标志CTRLKEY:
printf(“FLAG_lbuttondblck\n”);
打破
}
}

尝试删除此行:

cvSetMouseCallback( "video", my_mouse_callback, (void*) img);
从循环中取出,并将其立即放置在以下位置之后:

cvNamedWindow( "video", 1 );

问候

我可以看出这是一篇很老的帖子,但是对于将来寻求帮助的人来说:我在使用opencv(python)时遇到了类似的问题,并帮助我解决了这个问题。简而言之,右键单击返回的标志值与CV_EVENT_RBUTTONDOWN返回的值不匹配;打印右键单击时获得的标志值,并将其与CV_EVENT_RBUTTONDOWN中存储的标志值进行比较,以查看它们是否相同,这可能会有所帮助