OpenCV:多边形逼近轮廓
当我们查找到一个轮廓进行形状分析时,通常需要使用多边形来逼近一个轮廓,使得顶点数变少,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:多边形逼近轮廓相关推荐
- opencv多边形逼近
import cv2 import numpy as npimg = cv2.imread('./hand.png')#变成灰度图 gray = cv2.cvtColor(img, cv2.COLOR ...
- OpenCV精进之路(八):图像轮廓和图像分割修复——轮廓查询和多边形包围轮廓
Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...
- 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(三)使用多边形将轮廓包围
8.3 使用多边形将轮廓包围 8.3.1 将轮廓包围的多边形函数 1.返回外部边界:boundingRect()函数 (1)作用:返回指定点集最外面的边界矩形(四个顶点) (2)函数原型:Rect b ...
- 【学习OpenCV】给轮廓画出矩形和圆形边界
OpenCV支持大量的轮廓.边缘.边界的相关函数,相应的函数有moments.HuMoments.findContours.drawContours.approxPolyDP.arcLength.bo ...
- opencv多边形轮廓等距缩放
opencv多边形按像素放大或缩小,可用于缩放提取后的轮廓 代码示例如下: #!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @File : 多边 ...
- OpenCV+python:轮廓发现与对象测量
1,轮廓发现 当通过阈值分割提取到图像中的目标物体后,就需要通过边缘检测来提取目标物体的轮廓,使用这两种方法基本能够确定物体的边缘或者前景.接下来,通常需要做的是拟合这些边缘的前景,如拟合出包含前景或 ...
- OpenCV-Python 中文教程15——OpenCV 中的轮廓
OpenCV-Python 中文教程15--OpenCV 中的轮廓 一.初识轮廓 目标 • 理解什么是轮廓 • 学习找轮廓,绘制轮廓等 • 函数: cv2.findContours(), cv2.dr ...
- OpenCV图像的轮廓
查找轮廓 轮廓到底是什么?一个轮廓一般对应一系列的点,也就是图像中的一条曲线.表示的方法可能根据不同情况而有所不同.有多重方法可以表示曲线.在openCV中一般用序列来存储轮廓信息.序列中的每一个元素 ...
- opencv 多边形近似物体形状
前面我们学习过最小外接矩和最小外接圆,那么可以用一个最小的多边形包围物体吗?当然可以: 其中 cv.approxPolyDP() 的参数1是源图像的某个轮廓:参数2(epsilon)是一个距离值,表示 ...
最新文章
- 展望:模型驱动的深度学习
- ZooKeeper Dynamic Reconfiguration (dynamicConfigFile) ZooKeeper动态配置
- sql2008 sql服务_SQL即服务
- java 栈空间_初学JAVA——栈空间堆空间的理解
- python图例重复显示_python – 具有两个标记的多行的自定义图例,用于相同的文本...
- 【CV】如何使用Tensorflow提供的Object Detection API--4--开始训练模型
- dubbo-Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
- P1879 [USACO06NOV]玉米田Corn Fields
- 北京科技大学计算机控制实验报告,北科大计组原理实验报告.docx
- 【FPGA黑金开发板】Verilog HDL那些事儿--串口模块(十一)
- CGI与Servlet的介绍以及区别
- python给成绩表加上姓名列_Python Pandas 基本操作教学之成绩表
- EXCEL2016打开不显示内容(灰色的)如何解决?
- 禅道CMS 11.6漏洞
- iOS 在地图上绘制出你运动的轨迹
- 【数据结构】无向图(构造+遍历)
- 临汾PHP,「山西临汾seo推广团队」:ubuntu16.4 deepin 15.3添加PPA源 安装php5.6
- 华为快应用 - web标签无法加载部分网页
- 漏洞修复:HTML5: CORS Functionality Abuse
- bobsmith电路阻抗原理_网口接口电路的EMC设计.ppt