效果
鼠标每点一次左键就落下一个点,当发现当前落点和第一个点比较接近的时候,就视为画roi结束
#include <iostream>
#include <sstream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <thread>
#include <vector>
using namespace cv;
using namespace std;
#define MAX_POINT 100
bool isFinish = false;
vector<Point> points;
cv::Point lasePoint;
//opencv 的颜色格式是 BGR
//cv::Scalar lineColor(0, 0, 255);//红
//cv::Scalar lineColor(255,0,0);//蓝
cv::Scalar lineColor(0, 255, 0);//绿
double calculateDistance(Point& p1, Point& p2) { return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2)); }
void onmouse(int event, int x, int y, int flag, void* img)//鼠标事件回调函数,鼠标点击后执行的内容应在此
{
if (!isFinish) {
static int index = 0;
switch (event)
{
case EVENT_LBUTTONDOWN://鼠标左键按下事件
points.push_back(cv::Point(x, y));
if (calculateDistance(points.front(), lasePoint) < 7 && points.size() >= 5) {
points.pop_back();
isFinish = true;
}
break;
case EVENT_MOUSEMOVE://鼠标移动事件
lasePoint = cv::Point(x, y);
break;
case EVENT_LBUTTONUP://鼠标左键松开事件
break;
default:
break;
}
}
}
int main()
{
VideoCapture capture;
Mat frame;
frame = capture.open("G:\\Desktop\\行车记录仪2022090608~1.mp4");
if (!capture.isOpened())
{
printf("can not open ...\n");
return -1;
}
namedWindow("output", WINDOW_AUTOSIZE);
setMouseCallback("output", onmouse, &frame);
while (capture.read(frame))
{
for (int i = 0; i < points.size(); i++) {
int j = i + 1;
if (j < points.size())
cv::line(frame, points[i], points[j], lineColor);
else {
if (isFinish)
cv::line(frame, points[i], points.front(), lineColor);
}
}
if (points.size() && !isFinish) {
cv::line(frame, points.back(), lasePoint, lineColor);
}
imshow("output", frame);
waitKey(10);
}
capture.release();
return 0;
}