OpenCV如何筛选出最小外接矩形
时间: 2023-08-17 17:06:03 浏览: 110
在OpenCV中,筛选出最小外接矩形可以通过以下步骤实现:
1. 使用findContours函数查找轮廓。
2. 对于每个轮廓,使用minAreaRect函数计算最小外接矩形。
3. 可选的,可以使用boundingRect函数计算包围轮廓的矩形,然后比较它与最小外接矩形的面积,从而筛选出符合条件的轮廓。
以下是一个示例代码,演示了如何使用OpenCV筛选出最小外接矩形:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(){
// 读取图片
Mat image = imread("test.jpg");
// 转为灰度图
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 二值化处理
Mat binary;
threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 查找轮廓
vector<vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 筛选最小外接矩形
vector<RotatedRect> rects;
for (size_t i = 0; i < contours.size(); i++){
// 计算最小外接矩形
RotatedRect rect = minAreaRect(contours[i]);
// 计算包围轮廓的矩形
Rect bounding_rect = boundingRect(contours[i]);
// 比较面积
if (rect.size.area() > bounding_rect.area() * 0.5){
rects.push_back(rect);
}
}
// 画出最小外接矩形
Mat result = image.clone();
for (size_t i = 0; i < rects.size(); i++){
Point2f points[4];
rects[i].points(points);
for (int j = 0; j < 4; j++){
line(result, points[j], points[(j + 1) % 4], Scalar(0, 255, 0), 2);
}
}
// 显示结果
imshow("Result", result);
waitKey(0);
return 0;
}
```
上述代码中,首先读取一张测试图片,然后将其转换为灰度图,并进行二值化处理。接着使用findContours函数查找轮廓,并使用minAreaRect函数计算轮廓的最小外接矩形。然后使用boundingRect函数计算包围轮廓的矩形,并比较最小外接矩形和包围矩形的面积,从而筛选出符合条件的最小外接矩形。最后使用line函数画出最小外接矩形的四条边。最终将结果显示在一个窗口中。
阅读全文