1. 程式人生 > >OpenCV找出最小外接矩形

OpenCV找出最小外接矩形

慣例先放結果吧

測試圖片盜取自:  地址  (2333)

其實就一行關鍵的程式碼:

RotatedRect rect = minAreaRect(contours[i]);


下面就是簡單粗暴的程式碼啦~~

#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
	Mat 原圖 = imread("1.jpg");
	imshow("原圖", 原圖);
	Mat 灰度圖,二值圖;
	cvtColor(原圖, 二值圖, CV_BGR2GRAY);
	//blur(灰度圖, 二值圖, Size(5, 5));//模糊一下,可以不要
	threshold(二值圖, 二值圖, 0, 255, CV_THRESH_OTSU);//自適應二值化
	二值圖 = 255 - 二值圖;//顏色反轉
	//imshow("二值圖", 二值圖);

	//尋找最外層輪廓  
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(二值圖, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE, Point());

	Mat 畫布 = Mat::zeros(二值圖.size(), CV_8UC1); //最小外接矩形畫布  
	for (int i = 0; i<contours.size(); i++)
	{
		//繪製輪廓  
		drawContours(畫布, contours, i, Scalar(255), 1, 8, hierarchy);

		//繪製輪廓的最小外結矩形  
		RotatedRect rect = minAreaRect(contours[i]);
		//rectangle(畫布,rect.boundingRect(),Scalar(55));
		Point2f P[4];

		rect.points(P);
		for (int j = 0; j <= 3; j++)
		{
			line(原圖, P[j], P[(j + 1) % 4], Scalar(0,0,255), 1);
			line(畫布, P[j], P[(j + 1) % 4], Scalar(111), 2);
		}

        /*
		//繪製輪廓的最小外結圓  
		Point2f center; float radius;
		minEnclosingCircle(contours[i], center, radius);
		circle(畫布1, center, radius, Scalar(255), 2);
        */

	}
	//imshow("最小外接矩形", 畫布);
	imshow("標註出矩形", 原圖);
	waitKey(0);
	return 0;
}