深度学习-推荐系统-CV-NLPOpenCv散文

【图像处理】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对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!


上一篇下一篇

猜你喜欢

热点阅读