【OpenCV 学习之路】approxPolyDP()函数验证

先看效果图:
【OpenCV 学习之路】approxPolyDP()函数验证

Talk is cheap,show you the code.

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

using namespace std;
using namespace cv;

void main()
{
	Mat srcImg(600,600, CV_8UC3, Scalar::all(255));//纯黑图像
	Mat dstImg(600, 600, CV_8UC3, Scalar::all(0));
	circle(srcImg,Point(299,299),100,Scalar(0,0,255));
	cvtColor(srcImg, srcImg, CV_BGR2GRAY);
	threshold(srcImg, srcImg, 200, 255, CV_THRESH_BINARY_INV);
	vector<vector<Point>> contours;
	vector<Vec4i> hierarcy;
	findContours(srcImg, contours, hierarcy, 0, CV_CHAIN_APPROX_NONE);

	vector<vector<Point>> contours_poly(contours.size());//用于存放折线点集

	for (int i = 0; i<contours.size(); i++)
	{
		approxPolyDP(Mat(contours[i]), contours_poly[i], 20, true);
		
	}

	cout << endl<< "contours[0].size() = " << contours[0].size() << endl 
		<< "contours_poly[0].size() = " << contours_poly[0].size();

	for (int i = 0; i<contours.size(); i++)
	{
		drawContours(dstImg, contours_poly, i, Scalar(0, 255, 255), 2, 8);  //绘制
	}
	imshow("approx", dstImg);
	imshow("srcImg", srcImg);
	waitKey(0);
}
/*
这个程序就验证了我的想法:
1.contours数组只有一组轮廓,所以只有一行
2.虽然contours数组只有一行,但是里面有多少个点是不知道的,但是我们可以输出contours[0].size()来查看,这里它是564
经过approxPolyDP(Mat(contours[i]), contours_poly[i], 20, true);
这个函数就把相差20的点保留下来存放在contours_poly[i]数组里,在经过approxPolyDP()函数处理后我在输出contours_poly[0].size()可以发现它的点只有8
*/

这个程序就验证了我的想法:

  1. contours数组只有一组轮廓,所以只有一行
  2. 虽然contours数组只有一行,但是里面有多少个点是不知道的,但是我们可以输出contours[0].size()来查看,这里它是564
    经过approxPolyDP(Mat(contours[i]), contours_poly[i], 20, true);
    这个函数就把相差20的点保留下来存放在contours_poly[i]数组里,在经过approxPolyDP()函数处理后我在输出contours_poly[0].size()可以发现它的点只有8

参考

  1. OpenCV 中 approxPolyDP () 函数