【图像处理】OpenCV系列三十七 --- 多边形拟合appro
2019-05-20 本文已影响26人
307656af5a04
1、函数原型
void approxPolyDP(InputArray curve,
OutputArray approxCurve,
double epsilon,
bool closed)
2、函数功能
对图像轮廓点拟合多边形;
该函数用另一条曲线或具有较少顶点的多边形逼近曲线或多边形,使它们之间的距离小于或等于指定的精度;
3、参数详解
(1) 第一个参数,InputArray curve,一般是由图像的轮廓点组成的点集;
(2) 第二个参数,OutputArray approxCurve,表示输出的多边形点集;
(3) 第一个参数,double epsilon,主要表示输出的精度;这是原始曲线与其近似之间的最大距离;
(4) 第二个参数,bool closed,表示输出的多边形是否封闭;true表示封闭,false表示不封闭;
4、实验实例
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void main()
{
// 载入原始图像
Mat srcImg = imread("y.png");
if(srcImg.empty())
{
cout << "image error!" << endl;
return ;
}
// 显示原始图像
imshow("src", srcImg);
// 创建一幅纯黑图像
Mat dstImg(srcImg.size(), CV_8UC3, Scalar::all(0));
// 彩色图像转换为灰度图像
cvtColor(srcImg, srcImg, COLOR_BGR2GRAY);
// 对图像进行反向二值化
threshold(srcImg, srcImg, 230, 255, THRESH_BINARY_INV);
// 保存图像的轮廓
vector<vector<Point>> contours;
// 保存轮廓的层级关系
vector<Vec4i> hierarcy;
// 查找图像的轮廓
findContours(srcImg, contours, hierarcy,
RETR_LIST , 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], 3, true);
//绘制
drawContours(dstImg, contours_poly, i,
Scalar(0, 255, 255), 2, 8);
}
// 显示拟合之后的图像
imshow("approx", dstImg);
waitKey(0);
}
5、实验结果
原图 epsilon = 3时拟合的多边形 epsilon = 8时拟合的多边形epsilon越小,拟合的多边形与原图越像;
我是奕双,现在已经毕业将近两年了,从大学开始学编程,期间学习了C语言编程,C++语言编程,Win32编程,MFC编程,毕业之后进入一家图像处理相关领域的公司,掌握了用OpenCV对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!