使用opencv 画任意形状roi区域

效果

roi
鼠标每点一次左键就落下一个点,当发现当前落点和第一个点比较接近的时候,就视为画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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值