vs 2017 c++ OpenCV 要如何用鼠标实现多边形框选图片中的兴趣区域,举例子详细说明
时间: 2023-06-08 16:05:51 浏览: 191
您好,对于您的问题,可以使用OpenCV提供的鼠标回调函数来实现多边形框选图片中的兴趣区域。具体步骤如下:
1. 定义一个绘制多边形的函数,该函数通过鼠标左键点击不断添加多边形的顶点坐标,并通过cv::fillPoly函数将该多边形填充为白色。
```C++
cv::Mat img;
std::vector<cv::Point> points;
bool isDrawing = false;
// 鼠标回调函数
void onMouse(int event, int x, int y, int flags, void* param)
{
if (event == cv::EVENT_LBUTTONDOWN)
{
if (isDrawing == false)
{
isDrawing = true;
points.push_back(cv::Point(x, y));
}
}
else if (event == cv::EVENT_MOUSEMOVE)
{
if (isDrawing == true)
{
cv::line(img, points.back(), cv::Point(x, y), cv::Scalar(0, 0, 255), 2);
cv::imshow("image", img);
}
}
else if (event == cv::EVENT_LBUTTONUP)
{
if (isDrawing == true)
{
isDrawing = false;
points.push_back(cv::Point(x, y));
std::vector<std::vector<cv::Point>> pts{points};
cv::fillPoly(img, pts, cv::Scalar(255, 255, 255));
cv::imshow("image", img);
points.clear();
}
}
}
```
2. 在主函数中加载图片并创建显示窗口,然后使用cv::setMouseCallback函数注册鼠标回调函数。
```C++
int main(int argc, char** argv)
{
// 加载图片
img = cv::imread("image_path");
// 创建显示窗口
cv::namedWindow("image", cv::WINDOW_NORMAL);
cv::imshow("image", img);
// 注册鼠标回调函数
cv::setMouseCallback("image", onMouse, nullptr);
cv::waitKey();
return 0;
}
```
3. 运行程序,使用鼠标左键依次点击多边形的顶点,最后回车键结束绘制多边形。绘制完成后,可以使用cv::bitwise_and函数将原始图片和多边形区域的交集提取出来。
```C++
// 按回车键结束绘制
cv::waitKey(0);
// 提取兴趣区域
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8UC1);
cv::cvtColor(img, mask, cv::COLOR_BGR2GRAY);
cv::threshold(mask, mask, 1, 255, cv::THRESH_BINARY);
cv::Mat roi;
cv::bitwise_and(img, img, roi, mask);
cv::imshow("ROI", roi);
cv::waitKey();
```
这样就可以使用鼠标实现多边形框选图片中的兴趣区域了。希望能够帮到您!
阅读全文