
#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;
}
