2011-07-21 15 views
8

अनिवार्य - मैं एक नौसिखिया हूं। एक नौकरी है जिसमें प्रोग्रामिंग शामिल है और मैं खुद को पढ़ रहा हूं जैसे मैं जाता हूं। एक शिक्षक के रूप में कहने की जरूरत नहीं है मुझे चीजें अक्सर गलत और अच्छी तरह से मिलती हैं।ओपनसीवी 2.3 - माउस इवेंट्स

जहां मैं अभी हूं: मैंने कक्षा "ग्राफ" बनाई है, यह (आश्चर्यजनक रूप से पर्याप्त) ग्राफ बनाता है। लेकिन अब मैं इसे बनाना चाहता हूं ताकि माउस पर क्लिक करके मैं ग्राफ को संशोधित कर सकूं। लेकिन मुझे कक्षा के सदस्य समारोह होने के लिए माउस हैंडलर नहीं मिल रहा है।

cv::setMouseCallback(windowName, onMouse, 0); // Set mouse handler to be onMouse 

काम नहीं करता

cv::setMouseCallback(windowName, Graph::onMouse, 0); 

साथ यह मेरे पैरामीटर त्रुटियों की कमी देता है। this के अनुसार मैं इसे सदस्य कार्य नहीं कर सकता। दिए गए उत्तर का पालन करने के बाद, यह संकलित करता है लेकिन मेरा this पॉइंटर शून्य हो जाता है। ओह।

OnMouse इस प्रकार है:

void onMouse(int event, int x, int y,int, void*) 
{ 
    if (event == CV_EVENT_LBUTTONDOWN) 
    { 
     cvMoveWindow("Window", 500, 500); //Just to see if stuff happened 
    } 
    return; 
} 

खिड़की मैं जाने के बारे में परवाह नहीं है, मैं ग्राफ में ही संशोधित करना चाहते हैं - जो एक सीवी एक :: ग्राफ़ वस्तु में चटाई वैरिएबल के रूप में संग्रहीत किया जाता है। और मैं यह नहीं समझ सकता कि इसे कैसे किया जाए।

किसी भी मदद की सराहना की जाएगी, और मुझे उम्मीद है कि यह सिर्फ अस्पष्ट नहीं था।

+0

अच्छा सवाल! मुझे बिल्कुल वही समस्या मिली है –

उत्तर

11

हाँ सी ++ में कॉलबैक फ़ंक्शन एक खुशी है, है ना? आपको वास्तव में ओपनसीवी को एक फ़ंक्शन (क्लास विधि नहीं) देना है जैसा कि आप पहले ही पा चुके हैं। हालांकि, अगर आप निम्नलिखित तकनीक का उपयोग कर इस awfulness के आसपास हैक कर सकते हैं: setMouseCallback पर पिछले पैरामीटर समस्याओं आप आमतौर पर इस तरह का सामना में से कुछ पर काबू पाने के लिए काफी उपयोगी है

class MyClass 
{ 
public: 
    void realOnMouse(int event, int x, int y, int flags) 
    { 
     // Do your real processing here, "this" works fine. 
    } 
}; 

// This is a function, not a class method 
void wrappedOnMouse(int event, int x, int y, int flags, void* ptr) 
{ 
    MyClass* mcPtr = (MyClass*)ptr; 
    if(mcPtr != NULL) 
     mcPtr->realOnMouse(event, x, y, flags); 
} 

int main(int argv, char** argc) 
{ 
    // OpenCV setup stuff... 

    MyClass processor; 
    cv::setMouseCallback(windowName, wrappedOnMouse, (void*)&processor); 

    // Main program logic 

    return 0; 
} 

कि।

+0

बहुत बढ़िया! धन्यवाद। चूंकि मैं ग्राफ़ सदस्य फ़ंक्शन से setMouseCallback को कॉल कर रहा हूं, इसलिए मैंने "इस" में बदल दिया और प्रोसेसर और यह बहुत अच्छा काम करता है। – Russbear

+0

क्या माउस कॉलबैक और कॉलर को अलग करना संभव है, मेरा मतलब है कि सेटमाउस कॉलबैक, कक्षा का हिस्सा बनने के लिए और मुख्य कार्यक्रम में नहीं ?? मुझे लगता है कि वर्ग को अपने आप पर माउस फ़ंक्शन बनाने के लिए अधिक सुविधाजनक है। मुमकिन?? धन्यवाद! –

1

आप ऑनसाइट विधि को स्थिर विधि के रूप में भी उपयोग कर सकते हैं।

class Graph 
{ 
public: 
    static void onMouse(int event, int x, int y, void* param) 
    { 
      //Your code here 
    } 

    //Everything else you may need 
} 

अब आप के साथ onMouse विधि कॉल करने के लिए सक्षम होना चाहिए:

cv::setMouseCallback(windowName, onMouse, (void*) param); 

परम शून्य हो सकता है या जो भी आप विधि के पैरामीटर के रूप में पास करना चाहते हैं, लेकिन आप करने की आवश्यकता होगी वांछित प्रकार के लिए एक प्रकार कास्ट।

आशा है कि यह उपयोगी था। अलविदा।

संबंधित मुद्दे