滑鼠事件(setMouseCallback)

OpenCV用setMouseCallback()函式處理滑鼠事件,能夠偵測使用者滑鼠的行為,並呼叫我們寫的函式來做相關的處理,使用setMouseCallback()時要一個函式名當參數,且這個函式要有一定的引數格式(int event, int x, int y, int flags, void* param),名稱則可以自己定義。


void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata=0)

  • winname:滑桿的視窗名稱。
  • onMouse:自定義函式的名稱,當發生滑鼠事件時,會呼叫此函式。
  • userdata:選擇性要傳給onMouse自定義函式的參數。

我們透過自定義的函式onMouse(),來得到滑鼠事件的資訊。

void onMouse(int event, int x, int y, int flags, void* param)

  • event:事件代號,代表滑鼠的動作。
  • x:事件發生的x座標。
  • y:事件發生的y座標。
  • flags:旗標代號,代表拖曳事件。
  • param:事件代號名稱,自己定義的事件ID。

event有以下幾種:

  • CV_EVENT_MOUSEMOVE:滑動
  • CV_EVENT_LBUTTONDOWN:左鍵點擊
  • CV_EVENT_RBUTTONDOWN:右鍵點擊
  • CV_EVENT_MBUTTONDOWN:中鍵點擊
  • CV_EVENT_LBUTTONUP:左鍵放開
  • CV_EVENT_RBUTTONUP:右鍵放開
  • CV_EVENT_MBUTTONUP:中鍵放開
  • CV_EVENT_LBUTTONDBLCLK:左鍵雙擊
  • CV_EVENT_RBUTTONDBLCLK:右鍵雙擊
  • CV_EVENT_MBUTTONDBLCLK:中鍵雙擊

flags有以下幾種:

  • CV_EVENT_FLAG_LBUTTON:左鍵拖曳
  • CV_EVENT_FLAG_RBUTTON:右鍵拖曳
  • CV_EVENT_FLAG_MBUTTON:中鍵拖曳
  • CV_EVENT_FLAG_CTRLKEY:Ctrl不放事件
  • CV_EVENT_FLAG_SHIFTKEY:Shift不放事件
  • CV_EVENT_FLAG_ALTKEY:Alt不放事件

以下程式碼示範setMouseCallback()的使用,先在視窗內秀出影像,當使用者在影像上拖曳矩形,此時在滑鼠點擊拖曳的地方,會畫出藍色邊框的矩形:

#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;

void onMouse(int Event,int x,int y,int flags,void* param);
Point VertexLeftTop(-1,-1);
Point VertexRightDown(-1,-1);

int main(){
    Mat src = imread("lena.jpg",CV_LOAD_IMAGE_UNCHANGED);
    namedWindow("image",0);
    setMouseCallback("image",onMouse,NULL);

    while(true){
        if(VertexLeftTop.x==-1 && VertexRightDown.x==-1){
            imshow("image", src);
        }
        if(VertexLeftTop.x!=-1 && VertexRightDown.x!=-1){
            rectangle(src, Rect(VertexLeftTop,VertexRightDown),Scalar(255,0,0),2);
            VertexLeftTop.x = -1;
            VertexLeftTop.y = -1;
            VertexRightDown.x = -1;
            VertexRightDown.y = -1;
            imshow("image", src);
        }
        if(cvWaitKey(33)==27){
            break;
        }
    }
    return 0;
}

void onMouse(int Event,int x,int y,int flags,void* param){
    if(Event==CV_EVENT_LBUTTONDOWN){
        VertexLeftTop.x = x;
        VertexLeftTop.y = y;
    }
    if(Event==CV_EVENT_LBUTTONUP){
        VertexRightDown.x = x;
        VertexRightDown.y = y;
    }
}

setMouseCallback

回到首頁

回到OpenCV教學