OpenCV学习三十:approxPolyDP 多边拟合函数

approxPolyDP 主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。

原理图:对比之前黑点连线,之后蓝色连线:


C++: void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)

参数详解;

InputArray curve:一般是由图像的轮廓点组成的点集

OutputArray approxCurve:表示输出的多边形点集

double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数,5,6,7,,8,,,,,

bool closed:表示输出的多边形是否封闭


#include     
#include     
#include     
#include   


using namespace cv;  
using namespace std;  


int main(int argc, char** argv)  
{  
	Mat img = imread("4.jpg", -1);
	pyrDown(img, img, Size(img.cols/2, img.rows/2), 4);
	imshow("img", img);imwrite("img.jpg", img);

	//通过canny算法找轮廓,这样 findcontours 的结果会好些
	Mat canny_out;
	Canny(img, canny_out, 45, 127, 3, false);
	imshow("canny_out", canny_out);imwrite("canny_out.jpg", canny_out);

	//寻找轮廓
	vector> contours;
	vector hierachy;
	findContours(canny_out, contours, hierachy, RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(-1,-1));
	drawContours(img, contours, -1, Scalar(0,0,255), 1, 8, hierachy);
	
	//定义圆形、方形、旋转矩形、椭圆的存储容器
	vector> contours_ploy(contours.size());
	vector rects_ploy(contours.size());
	vector circle_centers(contours.size());
	vector circle_radius(contours.size());
	vector RotatedRect_ploy;//注意:由于下面赋值的过程中有个点数大于5的条件,所以这里没有直接初始化,才有下面pushback的方法添加值。
	vector ellipse_ploy;//注意,这里是画椭圆,但是容器类型是 RotatedRect

	//将结果放到各自的容器中
	for (size_t i = 0; i< contours.size(); i++)
	{
		approxPolyDP(contours[i], contours_ploy[i], 5, true);
		rects_ploy[i] = boundingRect(contours_ploy[i]);
		minEnclosingCircle(contours_ploy[i], circle_centers[i], circle_radius[i]);

		if (contours_ploy[i].size() >5)
		{
			RotatedRect temp1 = minAreaRect(contours_ploy[i]);
			RotatedRect_ploy.push_back(temp1);

			RotatedRect temp2 = fitEllipse(contours_ploy[i]);
			ellipse_ploy.push_back(temp2);
		}
	}

	//定义最终绘图的图片
	Mat draw_rect(img.size(), img.type(), Scalar::all(0)), 
		draw_rotateRect(img.size(), img.type(), Scalar::all(0)), 
		draw_circle(img.size(), img.type(), Scalar::all(0)), 
		draw_ellipse(img.size(), img.type(), Scalar::all(0));

	//绘图圆形、矩形
	RNG rng(12345);
	for (size_t i = 0; i
OpenCV学习三十:approxPolyDP 多边拟合函数_第1张图片


OpenCV学习三十:approxPolyDP 多边拟合函数_第2张图片

OpenCV学习三十:approxPolyDP 多边拟合函数_第3张图片

OpenCV学习三十:approxPolyDP 多边拟合函数_第4张图片

OpenCV学习三十:approxPolyDP 多边拟合函数_第5张图片

OpenCV学习三十:approxPolyDP 多边拟合函数_第6张图片


你可能感兴趣的:(OpenCV)