Обработка событий мыши с помощью cvSetMouseCallback

Я пишу код для айтрекера с использованием 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;
}

}

person CCS    schedule 15.02.2011    source источник


Ответы (2)


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

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

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

cvNamedWindow( "video", 1 );

С Уважением !

person patxiska    schedule 06.09.2011

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

person ERH    schedule 11.11.2016