使用cvSetMouseCallback处理鼠标事件

时间:2011-02-15 06:59:21

标签: opencv mouseevent

我正在使用OS X / X Code / OpenCV 2.2为眼动仪编写代码。作为Eye Tracker培训流程的一部分,我使用cvSetMouseCallback按以下方式捕获数据: 右键单击右眼;左键单击左眼。

但是,我发现该程序只能在左键单击(CV_EVENT_LBUTTONDOWN)时使用,而右键单击(CV_EVENT_RBUTTONDOWN)则不起作用。起初,我认为这是一个触控板和鼠标设置问题,然而,事实证明我已经在机器中将Secondary Click设置为“Right”。感谢是否有人可以对此有所了解?感谢您抽出时间研究这个问题。

对于那些感兴趣的人,我有一个简单的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;
}

}

2 个答案:

答案 0 :(得分:2)

尝试删除此行:

cvSetMouseCallback( "video", my_mouse_callback, (void*) img);

从循环中将其放置在:

之后
cvNamedWindow( "video", 1 );

问候!

答案 1 :(得分:0)

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