1. 程式人生 > >【OpenCV筆記 15-2】OpenCV尋找物體最小包圍矩形和最小包圍圓

【OpenCV筆記 15-2】OpenCV尋找物體最小包圍矩形和最小包圍圓

OpenCV尋找物體最小包圍矩形 minAreaRect()和最小包圍圓minEnclosingCircle()

運用到的知識點:

1.尋找最小包圍矩形
2.尋找最小包圍圓
3.定義和輸出vector容器點座標

程式碼示例:

//尋找最小包圍矩形
//尋找最小包圍圓
//定義和輸出vector容器點座標

#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <vector>
using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
	Mat testImage(600, 600, CV_8UC3);//畫布大小600x600
	RNG& rng = theRNG();
	//按回車鍵一直更新
	while (1)
	{
		testImage = Scalar::all(0);//將畫布設定為黑色,每次按鍵後可更新
		//int count = (unsigned)rng % 100 + 8;//隨機生成點的數量
		int count = rng.uniform(5, 20);//隨機產生點的個數
		cout << "凸包包含 " << count << " 個點" << endl;
		cout << "各點座標如下:" << endl;//輸出產生隨機點個數

		vector<Point>points;//vector容器存放點座標

		for (int i = 0; i < count; i++)
		{
			Point point;
			//點座標隨機產生
			point.x = rng.uniform(testImage.cols / 5, testImage.cols * 4 / 5); //橫座標x在範圍(600/1,600*4/5)隨機產生
			point.y = rng.uniform(testImage.rows / 4, testImage.rows * 3 / 4);//縱座標y在範圍(600/4,600*3/4)隨機產生
			points.push_back(point);
			cout << "Point" << i + 1 << ": " << point << endl;//依次輸出隨機產生每個點的座標
		}

		//輸出並標記各點座標
		cout << "基於Mat的vector:\n" << Mat(points) << endl;//基於Mat類的vector將以矩陣形式輸出座標
		for (int i = 0; i < count; i++)
			circle(testImage, points[i], 5, Scalar(255, 0, 255), -1, 4);//以隨機點為圓心,畫出半徑為5的實心圓
		
		//=============【1】尋找最小包圍矩形================
		RotatedRect minRect = minAreaRect(Mat(points));
		Point2f vertex[4];//用於存放最小矩形的四個頂點
		minRect.points(vertex);//返回矩形的四個頂點給vertex
		//繪製最小面積包圍矩形
		for (int i = 0; i < 4; i++)
			line(testImage, vertex[i], vertex[(i + 1) % 4], Scalar(0, 0, 255), 1, 8);//非常巧妙的表示式
		//=============【2】尋找最小包圍圓================
		Point2f center;//變數圓心座標
		float radius = 0;//初始化圓半徑
		minEnclosingCircle(Mat(points), center, radius);//尋找最小包圍圓
		circle(testImage, center, cvRound(radius), Scalar(0, 255, 0), 1, 8);//繪製最小包圍圓,cvRound對半徑進行四捨五入
	
		//輸出
		imshow("凸包繪製檢測", testImage);
		char key;
		key = (char)waitKey();
		if (key == 27 || key == 'q' || key == 'Q')//按下ESC 或q 或 Q 退出
			break;
	}
	return 0;
}

執行結果:

結果1


結果2