1. 程式人生 > >opencv 滑鼠操作 setMouseCallback

opencv 滑鼠操作 setMouseCallback

版權宣告:本文為博主原創文章,未經博主允許不得轉載。

網上有很多關於setMouseCallback的引數列表和使用方法,但是都是藉助全域性變數來使用的。並且有人說函式形參沒有用。這裡使用了opencv的兩個引數來實現函式形參的資料傳遞。


OpenCV中的滑鼠響應的函式是setMouseCallback(),可以實現畫圖的功能。

    c++: void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)

  • winname:視窗的名字
  • onMouse:滑鼠響應函式,回撥函式。指定窗口裡每次滑鼠時間發生的時候,被呼叫的函式指標。 這個函式的原型應該為void on_Mouse(int event, int x, int y, int flags, void* param);
  • userdate:傳給回撥函式的引數 
          void on_Mouse(int event, int x, int y, int flags, void* param);
  • event是 CV_EVENT_*變數之一
  • x和y是滑鼠指標在影象座標系的座標(不是視窗座標系) 
  • flags是CV_EVENT_FLAG的組合,
  • param是使用者定義的傳遞到setMouseCallback函式呼叫的引數。

我的理解是param和userdata是相互賦值的,是溝通setMousecallbackon_Mouse的橋樑,不過需要注意的是,這個橋樑是一個viod型別的指標,所以在on_Mouse中需要強制型別轉換一下。下面是我使用它傳遞字串的一個例子。

#include<opencv.hpp>
#include<iostream> using namespace std;
using namespace cv; void leftClick(int event, int x, int y, int flag, void* param)
{
 if (event  != EVENT_LBUTTONDOWN)
 {
  return;
 }  string  *  ptr  =(string  *) param;
 cout << *ptr;
 *ptr = "textFromCallback";
} int main()
{
 string p_click ="textFromMain";//最好加static, 避免有時資料賦值後被釋放  
 cout << p_click;
 //讀取圖片  
 const char* imagename = "C:/Capture001.png";
 Mat img  = cv::imread(imagename);
 if (img.empty())
 {
  fprintf(stderr,"Can not load image %s\n",imagename);
 }
 if (!img.data)
  //顯示視窗  
  namedWindow("image");//不能省略,否則setMouseCallback不執行  
 imshow("image",img);
 waitKey(30);
  setMouseCallback("image", leftClick, &p_click);
  waitKey(); }



附event:

#defineCV_EVENT_MOUSEMOVE      0

#defineCV_EVENT_LBUTTONDOWN    1

#defineCV_EVENT_RBUTTONDOWN    2

#defineCV_EVENT_MBUTTONDOWN    3

#defineCV_EVENT_LBUTTONUP      4

#defineCV_EVENT_RBUTTONUP      5

#defineCV_EVENT_MBUTTONUP      6

#defineCV_EVENT_LBUTTONDBLCLK  7

#defineCV_EVENT_RBUTTONDBLCLK  8

#defineCV_EVENT_MBUTTONDBLCLK  9

 

#defineCV_EVENT_FLAG_LBUTTON   1

#defineCV_EVENT_FLAG_RBUTTON   2

#defineCV_EVENT_FLAG_MBUTTON   4

#defineCV_EVENT_FLAG_CTRLKEY   8

#defineCV_EVENT_FLAG_SHIFTKEY  16

#defineCV_EVENT_FLAG_ALTKEY    32