Обработка событий мыши с помощью cvSetMouseCallback - PullRequest
6 голосов
/ 15 февраля 2011

Я пишу код для eye tracker, используя OS X / X Code / OpenCV 2.2. Как часть процесса обучения Eye Tracker, я использую 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;
}

}

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

попробуйте удалить эту строку:

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

из цикла и поместите его сразу после:

cvNamedWindow( "video", 1 );

С уважением!

0 голосов
/ 11 ноября 2016

Я вижу, что это старый пост, но для людей, которые ищут помощи в будущем: у меня была похожая проблема с использованием opencv (в python), и этот ответ помог мне.Вкратце, значение флагов, возвращаемое при щелчке правой кнопкой мыши, не соответствует значению, возвращенному из CV_EVENT_RBUTTONDOWN;распечатываете значение флагов, которое вы получаете при щелчке правой кнопкой мыши, и сравниваете его со значением флагов, хранящимся в CV_EVENT_RBUTTONDOWN, чтобы увидеть, могут ли они быть одинаковыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...