当我们查找到一个轮廓进行形状分析时,通常需要使用多边形来逼近一个轮廓,使得顶点数变少,OpenCV的approxPolyDP函数就可以实现这个功能。

approxPolyDP函数使用了Douglas-Peucker算法:

1、先从轮廓中找出两个最远的点,将两点相连,即b-c;

2、在原来的轮廓上查找一个离线段距离最远的点,将该点加入逼近后的新轮廓中,即c-d;

3、然后重复前面的算法,不断迭代,将最远的点添加进来,直到所有的点到多边形的最短距离小于指定的精度。

函数原型

void approxPolyDP( InputArray curve,OutputArray approxCurve,double epsilon, bool closed );

参数解析:

  • curve:存储在std :: vector或Mat中的2D点的输入向量,一般是轮廓点的集合。
  • approxCurve:输出拟合的多边形点集, 类型应与输入曲线的类型相同。
  • epsilon:指定近似精度的参数, 这是原始曲线和它的近似之间最大距离。
  • closed:如果为true,则闭合近似曲线(其第一个和最后一个顶点为连接的);否则,不闭合。

关键代码

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;//定义颜色常量
const cv::Scalar RED = cv::Scalar(0, 0, 255);                  //红色
const cv::Scalar PINK = cv::Scalar(230, 130, 255);             //粉色
const cv::Scalar BLUE = cv::Scalar(255, 0, 0);                 //蓝色
const cv::Scalar LIGHTBLUE = cv::Scalar(255, 255, 160);            //亮蓝色
const cv::Scalar GREEN = cv::Scalar(0, 255, 0);                    //绿色
const cv::Scalar YELLOW = cv::Scalar(175, 255, 255);           //黄色
const cv::Scalar DEEP_SKYBLUE = cv::Scalar(0, 191, 255);       //深天空蓝
const cv::Scalar ORCHID = cv::Scalar(218, 112, 214);           //兰花
const cv::Scalar WHITE = cv::Scalar(255, 255, 255);                //白色int main()
{Mat srcImage, grayImage, binaryImage;srcImage = imread("OpenCV.jpg",1);resize(srcImage, srcImage,Size(srcImage.cols/2,srcImage.rows/2));Mat dstImage_3(srcImage.size(), CV_8UC3, Scalar::all(0));Mat dstImage_5(srcImage.size(), CV_8UC3, Scalar::all(0));Mat dstImage_8(srcImage.size(), CV_8UC3, Scalar::all(0));cvtColor(srcImage, grayImage,COLOR_RGB2GRAY);imshow("grayImage", grayImage);threshold(grayImage, binaryImage,200,255, THRESH_BINARY_INV);imshow("binaryImage", binaryImage);vector<vector<Point>> contours;findContours(binaryImage, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE, cv::Point(0, 0));vector<vector<Point>> contours_ploy(contours.size());for (int i=0;i<contours.size();i++){drawContours(srcImage, contours, i, Scalar(230, 130, 255), 1, CV_AA);//epsilon==3approxPolyDP(Mat(contours[i]), contours_ploy[i], 3, true);drawContours(dstImage_3, contours_ploy, i, PINK, 1, CV_AA);//epsilon==5approxPolyDP(Mat(contours[i]), contours_ploy[i], 5, true);drawContours(dstImage_5, contours_ploy, i, LIGHTBLUE, 1, CV_AA);//epsilon==8approxPolyDP(Mat(contours[i]), contours_ploy[i], 8, true);drawContours(dstImage_8, contours_ploy, i, YELLOW, 1, CV_AA);}imshow("srcImage", srcImage);imshow("dstImage_3", dstImage_3);imshow("dstImage_5", dstImage_5);imshow("dstImage_8", dstImage_8);waitKey(0);destroyAllWindows();return 0;
}

从以上结果可以看出,设置的精度越小,多边形越拟合。

OpenCV:多边形逼近轮廓相关推荐

  1. opencv多边形逼近

    import cv2 import numpy as npimg = cv2.imread('./hand.png')#变成灰度图 gray = cv2.cvtColor(img, cv2.COLOR ...

  2. OpenCV精进之路(八):图像轮廓和图像分割修复——轮廓查询和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  3. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(三)使用多边形将轮廓包围

    8.3 使用多边形将轮廓包围 8.3.1 将轮廓包围的多边形函数 1.返回外部边界:boundingRect()函数 (1)作用:返回指定点集最外面的边界矩形(四个顶点) (2)函数原型:Rect b ...

  4. 【学习OpenCV】给轮廓画出矩形和圆形边界

    OpenCV支持大量的轮廓.边缘.边界的相关函数,相应的函数有moments.HuMoments.findContours.drawContours.approxPolyDP.arcLength.bo ...

  5. opencv多边形轮廓等距缩放

    opencv多边形按像素放大或缩小,可用于缩放提取后的轮廓 代码示例如下: #!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @File : 多边 ...

  6. OpenCV+python:轮廓发现与对象测量

    1,轮廓发现 当通过阈值分割提取到图像中的目标物体后,就需要通过边缘检测来提取目标物体的轮廓,使用这两种方法基本能够确定物体的边缘或者前景.接下来,通常需要做的是拟合这些边缘的前景,如拟合出包含前景或 ...

  7. OpenCV-Python 中文教程15——OpenCV 中的轮廓

    OpenCV-Python 中文教程15--OpenCV 中的轮廓 一.初识轮廓 目标 • 理解什么是轮廓 • 学习找轮廓,绘制轮廓等 • 函数: cv2.findContours(), cv2.dr ...

  8. OpenCV图像的轮廓

    查找轮廓 轮廓到底是什么?一个轮廓一般对应一系列的点,也就是图像中的一条曲线.表示的方法可能根据不同情况而有所不同.有多重方法可以表示曲线.在openCV中一般用序列来存储轮廓信息.序列中的每一个元素 ...

  9. opencv 多边形近似物体形状

    前面我们学习过最小外接矩和最小外接圆,那么可以用一个最小的多边形包围物体吗?当然可以: 其中 cv.approxPolyDP() 的参数1是源图像的某个轮廓:参数2(epsilon)是一个距离值,表示 ...

最新文章

  1. 展望:模型驱动的深度学习
  2. ZooKeeper Dynamic Reconfiguration (dynamicConfigFile) ZooKeeper动态配置
  3. sql2008 sql服务_SQL即服务
  4. java 栈空间_初学JAVA——栈空间堆空间的理解
  5. python图例重复显示_python – 具有两个标记的多行的自定义图例,用于相同的文本...
  6. 【CV】如何使用Tensorflow提供的Object Detection API--4--开始训练模型
  7. dubbo-Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
  8. P1879 [USACO06NOV]玉米田Corn Fields
  9. 北京科技大学计算机控制实验报告,北科大计组原理实验报告.docx
  10. 【FPGA黑金开发板】Verilog HDL那些事儿--串口模块(十一)
  11. CGI与Servlet的介绍以及区别
  12. python给成绩表加上姓名列_Python Pandas 基本操作教学之成绩表
  13. EXCEL2016打开不显示内容(灰色的)如何解决?
  14. 禅道CMS 11.6漏洞
  15. iOS 在地图上绘制出你运动的轨迹
  16. 【数据结构】无向图(构造+遍历)
  17. 临汾PHP,「山西临汾seo推广团队」:ubuntu16.4 deepin 15.3添加PPA源 安装php5.6
  18. 华为快应用 - web标签无法加载部分网页
  19. 漏洞修复:HTML5: CORS Functionality Abuse
  20. bobsmith电路阻抗原理_网口接口电路的EMC设计.ppt

热门文章

  1. 中国网:防火墙之父发声
  2. 获取网易云音乐播放链接
  3. 使用MiKTeX和TeXstudio编辑latex
  4. Android-UI 开源控件
  5. Excel,ppt学习课后总结
  6. 用Meta标签代码让360双核浏览器默认极速模式
  7. C/C++二维数组总结
  8. 华为Mate20系列赢得各界盛誉,棋圣聂卫平也对其AI性能称赞
  9. 三、SpringSecurity 动态权限访问控制
  10. ANSYS - 表格加载方法