一、主要函數(shù)
cv::RotatedRect cv::minAreaRect(
const cv::Mat& points
);
? emspminAreaRect
函數(shù)用于計(jì)算給定點(diǎn)集的最小外接矩形。該矩形的長(zhǎng)和寬是可以任意旋轉(zhuǎn)的,因此被稱(chēng)為旋轉(zhuǎn)矩形。
-
points
:是一個(gè)包含點(diǎn)集的 Mat 對(duì)象。點(diǎn)集可以是二維點(diǎn)集或三維點(diǎn)集,但是只有前兩個(gè)坐標(biāo)被使用。返回值是一個(gè) RotatedRect 對(duì)象,表示最小外接矩形。
該函數(shù)的實(shí)現(xiàn)基于最小面積矩形算法,該算法的基本思路如下:
- 找到包含點(diǎn)集的最小矩形,其邊與 X 軸和 Y 軸平行;
- 對(duì)于每個(gè)矩形,計(jì)算它的面積;
- 對(duì)于所有矩形中面積最小的矩形,旋轉(zhuǎn)它使得其邊可以任意旋轉(zhuǎn)。
??在計(jì)算最小矩形時(shí),可以使用不同的算法。OpenCV 中提供了兩種算法:旋轉(zhuǎn)卡殼算法和基于凸包的算法。旋轉(zhuǎn)卡殼算法的時(shí)間復(fù)雜度為 O ( n 2 ) O(n^2) O(n2),而基于凸包的算法復(fù)雜度為 O ( n l o g n ) O(nlogn) O(nlogn)。因此,當(dāng)點(diǎn)集較大時(shí),建議使用基于凸包的算法。
??最后需要注意的是,當(dāng)點(diǎn)集中只有兩個(gè)點(diǎn)時(shí),minAreaRect 函數(shù)會(huì)返回一個(gè)包含這兩個(gè)點(diǎn)的最小外接矩形。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-454180.html
二、代碼實(shí)現(xiàn)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 生成一些帶有噪聲的數(shù)據(jù),用于擬合矩形
vector<Point2f> points;
for (int i = 0; i < 100; i++)
{
float x = rand() % 200 + 50;
float y = rand() % 200 + 50;
points.push_back(Point2f(x, y));
}
// 最小外接矩形
RotatedRect rect = minAreaRect(points);
// 在圖像中繪制矩形
Mat image = Mat::zeros(300, 300, CV_8UC3);
Point2f vertices[4];
rect.points(vertices);
for (int i = 0; i < 4; i++)
{
line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2);
}
// 繪制結(jié)果
for (int i = 0; i < points.size(); i++)
{
circle(image, points[i], 5, cv::Scalar(255, 255, 0), -1);
}
// 顯示圖像
imshow("Rect", image);
waitKey(0);
return 0;
}
三、結(jié)果展示
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-454180.html
到了這里,關(guān)于OpenCV——最小外接矩形的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!