opencv鼠标事件

#include<opencv2/opencv.hpp>
#include<iostream>

bool down = false;
int i = 0;

void onMouse(int event, int x, int y, int flags, void* param) //鼠标回调函数
{
    /*  鼠标事件发生时,自动执行
    Event是整数,表示鼠标事件的类型
    X和Y为事件发生时鼠标的坐标,用像素坐标表示
    flags表示事件发生时按下鼠标的那个键
    param是指向任意对象的指针,作为附件的参数发送给函数

    */

    cv::Mat* im = reinterpret_cast<cv::Mat*>(param);
    //im事件发生时鼠标所指的图像指针

    if (event== cv::EVENT_LBUTTONDOWN) {   //如果按下了鼠标左键
        std::cerr << "你按下了鼠标左键x=" << x << ",     y=" << y << std::endl << std::endl;
        down = true;

    }
    if (event == cv::EVENT_LBUTTONUP) {  //如果释放了鼠标左键
        std::cerr << "你释放了鼠标左键x=" << x << ",     y=" << y << std::endl << std::endl;
        down = false;

    }
    if (event == cv::EVENT_MOUSEMOVE && down==true) {   //如果按下左键并移动
        std::cerr << "你按下了鼠标左键并移动 x=" << x << ",     y=" << y << std::endl << std::endl;
    }
       
        
        /*
        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_MOUSEMOVE=0,         鼠标移动
        cv::EVENT_MOUSEWHEEL=10,       滚轮滚动
        cv::EVENT_MOUSEHWHEEL=11       横向滚轮滚动

        */
        


    if (flags == cv::EVENT_FLAG_LBUTTON) {    //左键拖拽
        std::cerr << "你拖拽了鼠标左键 x=" << x << ",     y=" << y << std::endl << std::endl;
    }

    if (flags == 8) {    
        std::cerr << "按住CTRL拖拽 i=" << i++ << std::endl << std::endl;
    }


    /*
    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

    */

}


int main(int argc, char** argv) {

    cv::Mat image = cv::imread("D:/bb/tu/1.jpg");
    if (image.empty()) {
        std::cout << "图像读取失败..." << std::endl;
        return 0;
    }

    cv::namedWindow("Original Image");
    cv::imshow("Original Image", image);

    cv::setMouseCallback("Original Image", onMouse, reinterpret_cast<void*>(&image));//处理鼠标动作
    /*
    参数1:窗口的名字
    参数2:onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针
    参数3:userdate:传给回调函数的参数【鼠标所指的图像】

    */
    cv::waitKey(0);
    return 0;
}

原文地址:https://www.cnblogs.com/liming19680104/p/15693564.html