繪製最小包圍圓,旋轉矩陣,以及多邊擬合曲線

在這裏插入圖片描述

#include <iostream>
#include <opencv2/opencv.hpp>


using namespace cv;
using namespace std;



#define window "【原始圖】"
#define windowx "【結果圖1】"
#define windowy "[結果圖2]"
//繪製最小包圍圓,旋轉矩陣,以及多邊擬合曲線。。

Mat edge;
Mat src;
Mat result;
int thresh = 50;


void on_thresh(int,void*);
int main()
{
	
	
	//1.read map
	Mat image=imread("牧馬.jpg",0);
	resize(image,image,Size(0,0),0.6,0.6);
	//2.blur
	
	blur(image,src,Size(3,3));
	
	//3.thresh
	namedWindow(windowx);
	
	createTrackbar("thresh",windowx,&thresh,255,on_thresh);




	cv::waitKey(0);
	return 0;

}

void on_thresh(int, void*)
{
	threshold(src, edge, thresh, 255, THRESH_BINARY);
	//3.findcontours
	vector<vector<Point>> contours;
	vector<Vec4i> h;
	findContours(edge,contours,h,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
	//4.circle,rotate rect,appro_poly
	result=Mat::zeros(src.size(),CV_8UC3);
	drawContours(result,contours,-1,Scalar(255,0,0));

	vector<vector<Point>> appr_points(contours.size());//........................................................一定要帶上空間大小。
	for (int i = 0; i < contours.size(); ++i)
	{
		Point2f center;
		float radius;
		minEnclosingCircle(contours[i],center,radius);
		circle(result,center,radius,Scalar(0,0,255));
		
		RotatedRect rect=minAreaRect(contours[i]);
		Point2f re[4];
		rect.points(re);
		Point2f pre = re[3];
		for (int j = 0; j < 4; ++j)
		{
			line(result,pre,re[j],Scalar(0,255,0));
			pre = re[j];
		}

		
		
		approxPolyDP(Mat(contours[i]),appr_points[i],15,true);
		drawContours(result,appr_points,i,Scalar(255,255,0),1,8);//...................。。。。。。。。.....注意這裏appr_points 爲arry of arry。

	}
	imshow(windowx, result);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章