2011-02-15 19 views
6

Estoy escribiendo un código para eye tracker usando OS X/X Code/OpenCV 2.2. Como parte del proceso de entrenamiento Eye Tracker, estoy usando cvSetMouseCallback para capturar los datos de la siguiente manera: Haga clic derecho para el ojo derecho; Haz clic izquierdo para el ojo izquierdo.Manejo de eventos del mouse con cvSetMouseCallback

Sin embargo, me pareció que el programa solo podía funcionar con el clic izquierdo (CV_EVENT_LBUTTONDOWN) mientras que no funcionaba con el botón derecho (CV_EVENT_RBUTTONDOWN). Al principio, pensé que se trataba de un problema de configuración de mouse y mouse, sin embargo, resulta que ya configuré Click Secundario como "Derecha" en la máquina. Apreciar si alguien pudiera arrojar algo de luz sobre esto? Gracias por su tiempo para ver esto.

Para los interesados, que tienen un simple fragmento de código para 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; 
} 

} 

Respuesta

2

intenta quitar esta línea:

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

del bucle y colocarlo inmediatamente después:

cvNamedWindow("video", 1); 

Saludos!

0

Veo que esta es una publicación anterior, pero para las personas que buscan ayuda en el futuro: tuve un problema similar al usar opencv (en python) y this answer me ayudó. En resumen, el valor de los indicadores devuelto por el clic derecho no coincide con el valor devuelto por CV_EVENT_RBUTTONDOWN; imprimir el valor de las banderas que obtienes al hacer clic con el botón derecho y compararlas con el valor de las banderas almacenadas en CV_EVENT_RBUTTONDOWN para ver si son las mismas puede ayudar.

Cuestiones relacionadas