文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-850897.html
// 包含OpenCV庫(kù)的高GUI模塊和圖像處理模塊的頭文件
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
// 包含標(biāo)準(zhǔn)輸入輸出流的頭文件
#include <iostream>
// 使用命名空間cv和std,這樣我們就可以直接使用OpenCV和標(biāo)準(zhǔn)庫(kù)的功能,而不需要每次都指定命名空間
using namespace cv;
using namespace std;
// 一個(gè)靜態(tài)函數(shù),用于顯示幫助信息
static void help()
{
// 輸出程序的幫助信息,告訴用戶(hù)程序功能和使用方法
cout << "This program demonstrates finding the minimum enclosing box, triangle or circle of a set\n"
<< "of points using functions: minAreaRect() minEnclosingTriangle() minEnclosingCircle().\n"
<< "Random points are generated and then enclosed.\n\n"
<< "Press ESC, 'q' or 'Q' to exit and any other key to regenerate the set of points.\n\n";
}
// main函數(shù),程序的入口
int main( int /*argc*/, char** /*argv*/ )
{
// 調(diào)用幫助信息函數(shù)
help();
// 創(chuàng)建一個(gè)500x500像素的黑色空?qǐng)D像
Mat img(500, 500, CV_8UC3, Scalar::all(0));
// 獲取隨機(jī)數(shù)生成器的引用
RNG& rng = theRNG();
// 無(wú)限循環(huán)直到用戶(hù)決定退出(按下ESC或'q'鍵)
for(;;)
{
int i, count = rng.uniform(1, 101); // 隨機(jī)生成點(diǎn)的數(shù)量,范圍1到100
vector<Point> points; // 用來(lái)存儲(chǔ)隨機(jī)點(diǎn)的向量
// 生成一組隨機(jī)點(diǎn)
for( i = 0; i < count; i++ )
{
Point pt; // 創(chuàng)建一個(gè)點(diǎn)結(jié)構(gòu)
// 點(diǎn)的x坐標(biāo)在圖像寬度的1/4到3/4之間隨機(jī)生成
pt.x = rng.uniform(img.cols/4, img.cols*3/4);
// 點(diǎn)的y坐標(biāo)在圖像高度的1/4到3/4之間隨機(jī)生成
pt.y = rng.uniform(img.rows/4, img.rows*3/4);
// 將生成的點(diǎn)添加到向量中
points.push_back(pt);
}
// 找到包圍點(diǎn)的最小面積矩形框
Point2f vtx[4]; // 聲明一個(gè)存儲(chǔ)矩形四個(gè)頂點(diǎn)的數(shù)組
// 使用minAreaRect()計(jì)算點(diǎn)集可以包圍的最小矩形區(qū)域和角度
RotatedRect box = minAreaRect(points);
// 將計(jì)算的矩形區(qū)域的四個(gè)頂點(diǎn)賦值給vtx數(shù)組
box.points(vtx);
// 找到包圍點(diǎn)的最小面積三角形
vector<Point2f> triangle; // 創(chuàng)建向量存儲(chǔ)三角形的頂點(diǎn)
// 使用minEnclosingTriangle()計(jì)算可以包圍點(diǎn)集的最小三角形
minEnclosingTriangle(points, triangle);
// 找到包圍點(diǎn)的最小面積圓形
Point2f center; // 圓心
float radius = 0; // 半徑
// 使用minEnclosingCircle()計(jì)算可以包圍點(diǎn)集的最小圓形及其半徑
minEnclosingCircle(points, center, radius);
// 將圖像重置為黑色
img = Scalar::all(0);
// 在圖像上畫(huà)出這些點(diǎn)
for( i = 0; i < count; i++ )
// 以點(diǎn)為中心,半徑為3,紅色,實(shí)心填充,抗鋸齒方式畫(huà)圓
circle( img, points[i], 3, Scalar(0, 0, 255), FILLED, LINE_AA );
// 畫(huà)出矩形框
for( i = 0; i < 4; i++ )
// 用綠色線(xiàn)條將矩形的四個(gè)頂點(diǎn)連接起來(lái),形成邊框
line(img, vtx[i], vtx[(i+1)%4], Scalar(0, 255, 0), 1, LINE_AA);
// 畫(huà)出三角形
for( i = 0; i < 3; i++ )
// 用黃色線(xiàn)條將三角形的三個(gè)頂點(diǎn)連接起來(lái),形成邊框
line(img, triangle[i], triangle[(i+1)%3], Scalar(255, 255, 0), 1, LINE_AA);
// 畫(huà)出圓形
// 以計(jì)算得到的圓心,半徑,用青色線(xiàn)條畫(huà)出圓形
circle(img, center, cvRound(radius), Scalar(0, 255, 255), 1, LINE_AA);
// 顯示最終繪制的圖像
imshow( "Rectangle, triangle & circle", img );
// 等待鍵盤(pán)輸入
char key = (char)waitKey();
if( key == 27 || key == 'q' || key == 'Q' ) // 檢查是否是退出鍵'ESC'
break; // 如果是則退出循環(huán)
}
return 0; // 程序成功結(jié)束
}
此段代碼的主要功能是:利用OpenCV庫(kù)生成隨機(jī)點(diǎn)集,并計(jì)算并展示這些點(diǎn)的最小外包矩形、三角形和圓形。用戶(hù)可以通過(guò)按鍵重新生成不同的隨機(jī)點(diǎn)集,或者按ESC/Q退出程序。程序中利用了OpenCV的隨機(jī)數(shù)生成函數(shù)、繪圖函數(shù)以及幾何形狀的計(jì)算函數(shù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-850897.html
到了這里,關(guān)于【opencv】示例-minarea.cpp 如何尋找一組隨機(jī)生成的點(diǎn)的最小外接矩形、三角形和圓...的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!