#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;
}
OpenCV(c++版)在一个图上画多个ROI
最新推荐文章于 2025-09-13 14:43:37 发布
794

被折叠的 条评论
为什么被折叠?



