在自定義類中使用setMouseCallBack


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 ...
View Code

當然這里友元函數要記得聲明

ε=(´ο`*)))唉 學習之路永無止境


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM