具体实现的程序如下:
#include <iostream>
#include <opencv2/opencv.hpp>
void on_MouseHandle(int event, int x, int y, int flags, void* param); //鼠标响应函数
cv::Mat frame; //定义一个全局的Mat变量,用于存储图像
int main(int argc, char** argv)
{
cv::namedWindow("picture", cv::WINDOW_NORMAL);
cv::setMouseCallback("picture", on_MouseHandle); //关联鼠标响应函数
frame = cv::imread("other9.jpg"); //读取图片
imshow("picture", frame); //显示图片
cv::waitKey(0); //直到有按键按下
return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
static cv::Point pt1, pt2;
static int start = 0;
cv::Mat img;
frame.copyTo(img); //这样复制两个变量不会使用同一幅图像
switch (event)
{
case cv::EVENT_LBUTTONDOWN: //左键按下消息
{
start = 1;
pt1 = cv::Point(x, y);
std::cout << "start: (" << pt1.x << ", " << pt1.y << ")" << std::endl;
break;
}
case cv::EVENT_MOUSEMOVE: //鼠标移动事件
{
pt2 = cv::Point(x, y);
if (start == 1)
{
cv::rectangle(img, pt1, pt2, cv::Scalar(0, 0, 255), 10, 80, 0);
imshow("picture", img); //显示当前已画矩形的图片
}
break;
}
case cv::EVENT_LBUTTONUP: //鼠标左键弹起事件
{
start = 0;
pt2 = cv::Point(x, y);
std::cout << "end: (" << pt2.x << ", " << pt2.y << ")" << std::endl;
break;
}
}
}