1. 程式人生 > >在OpenCV中呼叫滑鼠事件

在OpenCV中呼叫滑鼠事件

需要用到這個函式:cvSetMouseCallback

cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse,
                                void* param CV_DEFAULT(NULL));

第一個引數為視窗名,第二個為用於處理的函式。

那個用於處理的函式如下:

typedef void (CV_CDECL *CvMouseCallback )(int event, int x, int y, int flags, void* param);

event為所發生的事件名
x,y為滑鼠在圖片上的座標

然後,這是全部的事件

enum
{
    CV_EVENT_MOUSEMOVE      =0,   //滑鼠移動
    CV_EVENT_LBUTTONDOWN    =1,   //按下左鍵
    CV_EVENT_RBUTTONDOWN    =2,   //按下右鍵
    CV_EVENT_MBUTTONDOWN    =3,   //按下中鍵
    CV_EVENT_LBUTTONUP      =4,   //放開左鍵
    CV_EVENT_RBUTTONUP      =5,   //放開右鍵
    CV_EVENT_MBUTTONUP      =6,   //放開中鍵
    CV_EVENT_LBUTTONDBLCLK  =7
, //左鍵雙擊 CV_EVENT_RBUTTONDBLCLK =8, //右鍵雙擊 CV_EVENT_MBUTTONDBLCLK =9, //中鍵雙擊 CV_EVENT_MOUSEWHEEL =10, //滾輪滾動 CV_EVENT_MOUSEHWHEEL =11 //橫向滾輪滾動(還好我滑鼠是G502可以這麼幹) }; enum { CV_EVENT_FLAG_LBUTTON =1, //左鍵拖拽 CV_EVENT_FLAG_RBUTTON =2, //右鍵拖拽 CV_EVENT_FLAG_MBUTTON =4
, //中鍵拖拽 CV_EVENT_FLAG_CTRLKEY =8, //按住CTRL拖拽 CV_EVENT_FLAG_SHIFTKEY =16, //按住Shift拖拽 CV_EVENT_FLAG_ALTKEY =32 //按住ALT拖拽 };

下面是我自己寫的按下右鍵畫圖的程式碼:

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <stdio.h>
#include "opencv2/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/core/ocl.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/imgproc.hpp"
#include"opencv2/flann.hpp"
#include"opencv2/xfeatures2d.hpp"
#include"opencv2/ml.hpp"

using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
using namespace cv::ml;

Mat src;
bool down = false;
Point prept = Point(-1, -1);
Point curpt = Point(-1, -1);
void on_mouse(int event, int x, int y, int flags, void* ustc)
{

    if (event == CV_EVENT_LBUTTONDOWN)    //右鍵按下
    {
        prept = Point(x, y);
        down = true;
    }
    else if (event == CV_EVENT_LBUTTONUP)     //右鍵放開
        down = false;

    if (down ==true&&event == CV_EVENT_MOUSEMOVE)    //右鍵按下且滑鼠移動
    {
        curpt = cvPoint(x, y);
        line(src, prept, curpt, Scalar(255, 0, 0), 5);
        waitKey(5);        //可以解決畫圖時卡頓的問題
        imshow("src", src);
        prept = curpt;
    }
}

int main()
{
    src = imread("7f6a384c510fd9f9da3ee67b232dd42a2834a40d.jpg");

    cvNamedWindow("src");
    cvSetMouseCallback("src", on_mouse, 0);

    imshow("src", src);
    cvWaitKey(0);
    cvDestroyAllWindows();
    return 0;
}

效果圖
這裡寫圖片描述