【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
*/
这个程序就验证了我的想法:
- contours数组只有一组轮廓,所以只有一行
- 虽然contours数组只有一行,但是里面有多少个点是不知道的,但是我们可以输出contours[0].size()来查看,这里它是564
经过approxPolyDP(Mat(contours[i]), contours_poly[i], 20, true);
这个函数就把相差20的点保留下来存放在contours_poly[i]数组里,在经过approxPolyDP()函数处理后我在输出contours_poly[0].size()可以发现它的点只有8