OpenCV(c++版)在一个图上画多个ROI

C++与OpenCV助力人工智能
#include <opencv2/opencv.hpp>
#include <vector>
//在一个图上绘制多个roi区域
class draw_rects
{
public:

	cv::Point pat1, pat2;//定义roi的对角点
	bool drawing = false;
	cv::Mat image;
	std::vector<cv::Rect> rois;
//void draw_roi(int event, int x, int y, int flags, draw_rects* userdata)
void draw_roi(int event, int x, int y, int flags, void* userdata)
 {
	
	if (event == cv::EVENT_LBUTTONDOWN)//鼠标左键被按下
	{
		pat1 = cv::Point(x, y);//获取当前鼠标的起始点
		drawing = true;
	}
	else if (event == cv::EVENT_MOUSEMOVE && drawing)//鼠标在移动,实时显示画方框过程用
	{
		//只有event == cv::EVENT_MOUSEMOVE和drawing为真时,才实时显示画方框过程
		pat2 = cv::Point(x, y);//获取当前坐标
		cv::Mat tempImage = image.clone();  // 克隆图像用于实时绘制,克隆图像是为了更好的显示画方框
		cv::rectangle(tempImage, pat1, pat2, cv::Scalar(0, 255, 0),4);//用于在鼠标移动的时候也显示方框
		cv::imshow("Draw ROIs", tempImage);
	}
	else if (event == cv::EVENT_LBUTTONUP)
	{
		//用于在原始图像上显示ROI区域
		pat2 = cv::Point(x, y);
		drawing = false;
		rois.push_back(cv::Rect(pat1, pat2));
		cv::rectangle(image, pat1, pat2, cv::Scalar(0, 255, 0),4);
		cv::imshow("Draw ROIs", image);
	}
 }


};
int main()
{
	cv::Mat image;
	image = cv::imread("D:\\Code\\123.png"); // 请替换为你自己的图像路径
	// 创建一个窗口
	cv::namedWindow("Draw ROIs");

	draw_rects drawer;//类要先实例化
	drawer.image = image;//传递图像数据



	// 设置鼠标回调函数
	// cv::setMouseCallback 函数期望一个回调函数,该回调函数应该是一个函数指针,或者是一个成员函数时,应该正确地绑定对象实例。
	// 将draw_rects类的成员函数draw_roi作为鼠标回调函数绑定到OpenCV的cv::setMouseCallback中,以便在鼠标事件发生时能够调用该成员函数。
	cv::setMouseCallback(
		"Draw ROIs",
		[](int event, int x, int y, int flags, void* userdata) {

			//将 userdata(void* 类型的指针)转换为 draw_rects* 类型的指针,便于访问 draw_rects 类的成员函数。
			//reinterpret_cast 是 C++ 中的一种强制类型转换运算符,它用于在指针或引用之间进行不安全的转换,通常用于不同类型之间的低级别转换。
			// 将userdata转换为draw_rects类指针
			draw_rects* drawer = reinterpret_cast<draw_rects*>(userdata);
			drawer->draw_roi(event, x, y, flags, userdata);//通过指针 drawer 调用 draw_rects 类中的成员函数 draw_roi。
		},//鼠标事件的回调函数
		&drawer // 传递对象指针作为userdata
	);

	// 显示图像
	cv::imshow("Draw ROIs", image);

	// 等待按键,直到按下 'q' 键退出
	while (true) {
		char key = cv::waitKey(1);
		if (key == 'q') {
			break;  // 按 'q' 键退出
		}
	}
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值