使用cvSetMouseCallback处理鼠标事件 [英] Mouse event handling with cvSetMouseCallback

查看:76
本文介绍了使用cvSetMouseCallback处理鼠标事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am writing a code for eye tracker using OS X / X Code / OpenCV 2.2. As part of the Eye Tracker training process, I am using cvSetMouseCallback to capture the data as per following: Right click for right eye; Left click for left eye.

但是,我发现该程序只能用鼠标左键(CV_EVENT_LBUTTONDOWN)来工作,而不能用鼠标右键(CV_EVENT_RBUTTONDOWN)来工作.起初,我认为这是触控板和鼠标设置的问题,但是事实证明,我已经在计算机中将二次点击"都设置为右键".欣赏是否有人可以对此有所了解?谢谢您抽出宝贵的时间对此进行研究.

However, I found that the program could only work with left click (CV_EVENT_LBUTTONDOWN) while it does not work with right click (CV_EVENT_RBUTTONDOWN). At first, I thought it was a trackpad and mouse setting issues, however, it turns out that I have already set both Secondary Click as "Right" in the machine. Appreciate if someone could shed some light on this? Thank you for your time to look into this.

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

For those interested, I have a simple code snippet for 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;
}

}

推荐答案

尝试删除此行:

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

从循环中并将其立即放置在以下位置:

from the loop and place it immediately after:

cvNamedWindow( "video", 1 );

致谢!

这篇关于使用cvSetMouseCallback处理鼠标事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆