2011-02-15 9 views
6

के साथ माउस इवेंट हैंडलिंग मैं ओएस एक्स/एक्स कोड/ओपनसीवी 2.2 का उपयोग कर आंख ट्रैकर के लिए एक कोड लिख रहा हूं। आई ट्रैकर प्रशिक्षण प्रक्रिया के हिस्से के रूप में, मैं निम्नलिखित के अनुसार डेटा कैप्चर करने के लिए cvSetMouseCallback का उपयोग कर रहा हूं: दाहिनी आंखों के लिए राइट क्लिक करें; बाएं आंख के लिए बायाँ क्लिक करें।सीवीसेटमौस कैलबैक

हालांकि, मैंने पाया कि प्रोग्राम केवल बाएं क्लिक (CV_EVENT_LBUTTONDOWN) के साथ काम कर सकता है, जबकि यह दायाँ क्लिक (CV_EVENT_RBUTTONDOWN) के साथ काम नहीं करता है। सबसे पहले, मैंने सोचा कि यह एक ट्रैकपैड और माउस सेटिंग समस्याएं थी, हालांकि, यह पता चला है कि मैंने पहले ही माध्यमिक क्लिक को मशीन में "दाएं" के रूप में सेट कर दिया है। अगर कोई इस पर कुछ प्रकाश डाल सकता है तो सराहना करें? इसे देखने के लिए आपके समय के लिए धन्यवाद। पाश से

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

और बाद स्थापित: इस लाइन को हटाने के लिए

#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

कोशिश:

cvNamedWindow("video", 1); 

रुचि रखने वालों के लिए, मैं cvSetMouseCallback के लिए एक सरल कोड स्निपेट

सम्मान!

0

मैं देख सकता हूं कि यह एक पुरानी पोस्ट है, लेकिन भविष्य में लोगों की मदद की तलाश में: मुझे ओपनसीवी (पायथन में) और this answer का उपयोग करने में भी एक ही समस्या थी। संक्षेप में, दाएं क्लिक से लौटाए गए झंडे का मूल्य CV_EVENT_RBUTTONDOWN से लौटाए गए मान से मेल नहीं खाता; फ़्लैग वैल्यू को प्रिंट करना जो आपको सही क्लिक करते हैं और इसे CV_EVENT_RBUTTONDOWN में संग्रहीत फ़्लैग मान से तुलना करते हैं, यह देखने के लिए कि वे समान हैं या नहीं।