TOP
在opencv學習中教程中的鼠標回調函數的使用,都是在主函數中調用,但在自定義類中調用該函數時,會出現參數的類型與形參不匹配問題。最后在stackoverflow中找到了一些解決辦法。
鼠標調用的函數為:
1 /** @brief Sets mouse handler for the specified window 2 3 @param winname Name of the window. 4 @param onMouse Callback function for mouse events. See OpenCV samples on how to specify and use the callback. 5 @param userdata The optional parameter passed to the callback. 6 */ 7 8 CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
ˇ參數1:winname即為在哪一個窗口調用該函數
ˇ參數2:onMouse是一個函數指針
ˇ參數3:用戶傳遞的數據
其中第二個參數即為我們對鼠標實際操作的地方,在主函數調用的話正常定義調用就可以了,但是當在自定義類中定以回調函數時,便會報參數類型與形參類型不匹配,來看一下回調函數的原型:
1 /** @brief Callback function for mouse events. see cv::setMouseCallback 2 @param event one of the cv::MouseEventTypes constants. 3 @param x The x-coordinate of the mouse event. 4 @param y The y-coordinate of the mouse event. 5 @param flags one of the cv::MouseEventFlags constants. 6 @param userdata The optional parameter. 7 */ 8 9 typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);
這里是一個宏定義,將一個函數指針定義宏名為MouseCallback,為了解決參數類型與形參(cv::MouseCallback)不匹配問題,在private中定義一個友元函數,當然也有使用全局變量的方法,但我更傾向於這種方法。

1 class App 2 { 3 public: 4 App(); 5 ~App(); 6 void setWin(const std::string& _winname); 7 ... 8 private: 9 void on_mouse_internal(int ev, int x, int y); 10 11 std::string winname; 12 13 friend void on_mouse(int ev, int x, int y, int, void* obj); 14 ... 15 }; 16 void on_mouse(int ev, int x, int y, int, void* obj) 17 { 18 App* app = static_cast<App*>(obj); 19 if (app) 20 app->on_mouse_internal(ev, x, y); 21 } 22 23 App::App() 24 { 25 ... 26 } 27 28 App::~App() 29 { 30 ... 31 } 32 33 void App::setWin(const std::string& _winname) 34 { 35 cv::namedWindow(_winname); 36 this->winname = _winname; 37 cv::setMouseCallback(winname, on_mouse, this); 38 } 39 40 void App::on_mouse_internal(int ev, int x, int y) 41 { 42 std::cout << "X:" << x << ";Y:" << y << std::endl; 43 // here you can specify class members 44 } 45 ...
當然這里友元函數要記得聲明
ε=(´ο`*)))唉 學習之路永無止境