【OpenCV筆記 15-2】OpenCV尋找物體最小包圍矩形和最小包圍圓
阿新 • • 發佈:2019-02-14
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; }