OpenCV中approxPolyDP()函数

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

@param curve Input vector of a 2D point stored in std::vector or Mat
@param approxCurve Result of the approximation. The type should match the type of the input curve.
@param epsilon Parameter specifying the approximation accuracy. This is the maximum distance
between the original curve and its approximation.
@param closed If true, the approximated curve is closed (its first and last vertices are
connected). Otherwise, it is not closed.

The function cv::approxPolyDP approximates a curve or a polygon with another curve/polygon with less
vertices so that the distance between them is less or equal to the specified precision. It uses the
Douglas-Peucker algorithm <http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm>

主要功能是把一个连续光滑曲线折线化:

参数有4个:

InputArray curve:输入曲线,数据类型可以为vector<Point>。

OutputArray approxCurve:输出折线,数据类型可以为vector<Point>。

double epsilon:判断点到相对应的line segment 的距离的阈值。(距离大于此阈值则舍弃,小于此阈值则保留,epsilon越小,折线的形状越“接近”曲线。)

bool closed:曲线是否闭合的标志位。

程序示例:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

void main()
{
	Mat srcImg = imread("01.jpg");
	imshow("src", srcImg);
	Mat dstImg(srcImg.size(), CV_8UC3, Scalar::all(0));//纯黑图像

	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], 15, true);
		drawContours(dstImg, contours_poly, i, Scalar(0, 255, 255), 2, 8);  //绘制
	}
	imshow("approx", dstImg);

	waitKey(0);
}

  图像“01.jpg”:

epsilon为15:

epsilon为5:

时间: 2024-10-09 21:21:05

OpenCV中approxPolyDP()函数的相关文章

Opencv+Python(3):在Opencv中绘制函数

在OpenCV中绘制函数 目标 学习使用OpenCV绘制不同的几何形状 你将学习这些函数:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText()等 码 在所有上述功能中,您将看到如下所示的一些常见参数: img:想要绘制形状的图像 颜色:形状的颜色.对于BGR,将它作为元组传递,例如:(255,0,0)for blue.对于灰度,只需传递标量值即可. 厚度:线或圆的厚度等.如果像圆圈这样的闭合数字传递-1,它将填充形

Opencv中直方图函数calcHist

calcHist函数在Opencv中是极难理解的一个函数,一方面是参数说明晦涩难懂,另一方面,说明书给出的实例也不足以令人完全搞清楚该函数的使用方式.最难理解的是第6,7,8个参数dims.histSize和ranges.以前一直都是想当然认为,该函数可以一次统计多张图片每个通道的灰度值数据,实际上calcHist函数一次只能统计一个通道上的直方图.我估计许多同学都犯过和我类似的错误,认为第5个参数hist,可以根据dims设定维度,比如dims=3,则输出的hist的维度就是3,并且会想当然的

5. openCV中常用函数学习

一.前言 经过两个星期的努力,一边学习,一边写代码,初步完成的毕业论文系统的界面和一些基本功能,主要包括:1 数据的读写和显示,及相关的基本操作(放大.缩小和移动):2 样本数据的选择:3 数据归一化处理:4 绘制光谱曲线:5 获取波段信息.接下来的工作主要是完成遥感影像分类的相关算法.这部分主要是数学计算,尤其是矩阵的相关运算和操作.为此,系统的学习和了解了openCV库中常用的矩阵操作函数,记录下来,方便以后查阅. 二.openCV函数 1 reshape 1 C++: Mat Mat::r

【短道速滑一】OpenCV中cvResize函数使用双线性插值缩小图像到长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。

今天,一个朋友想使用我的SSE优化Demo里的双线性插值算法,他已经在项目里使用了OpenCV,因此,我就建议他直接使用OpenCV,朋友的程序非常注意效率和实时性(因为是处理视频),因此希望我能测试下我的速度和OpenCV相比到底那一个更有速度优势,恰好前一段时间也有朋友有这方面的需求,因此我就随意编写了一个测试程序,如下所示: IplImage *T = cvLoadImage("F:\\1.JPG"); IplImage *SrcImg = cvCreateImage(cvSiz

openCV中cvSnakeImage()函数代码分析

/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // // By downloading, copying, installing or using the software you agree to this licen

opencv 边界确定函数

多边形逼近,用嘴贴切的多边形标识 void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed): InputArray curve:输入的点集 OutputArray approxCurve:输出的点集,当前点集是能最小包容指定点集的.draw出来即是一个多边形: double epsilon:指定的精度,也即是原始曲线与近似曲线之间的最大距离. bool closed:若为tr

图像边缘检测--OpenCV之cvCanny函数

图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 ); image单通道输入图像.edges单通道存储边缘的输出图像threshold1第一个阈值threshold2第二个阈值aperture_sizeSobel 算子内核大小 (见 cvSobel). 函数 cvCa

由lib引发的血案(opencv找不函数问题)

在使用opencv中的函数时,连续两次遇到函数找不到的问题,第一次查时按照他人说的包含进一个头文件后,果真还真解决了:然而第二次在调用cvInpaint函数时包含进对应头文件,编译通过但运行不成功还是未定义标识符.在网上搜了之后才真正理解了原因,某个函数找不到主要是由于debug和release库文件没有选择完全. 解决办法:先加入debug和release缺少的库文件后,然后再include进包含该函数声明的头文件即可调用.eg:cvInpaint找不到. 在配置属性的时候,在连接器->输入

[OpenCV-Python] OpenCV 中的图像处理 部分 IV (六)

部分 IVOpenCV 中的图像处理 23 图像变换 23.1 傅里叶变换目标本小节我们将要学习: ? 使用 OpenCV 对图像进行傅里叶变换 ? 使用 Numpy 中 FFT(快速傅里叶变换)函数 ? 傅里叶变换的一些用处 ? 我们将要学习的函数有:cv2.dft(),cv2.idft() 等原理 傅里叶变换经常被用来分析不同滤波器的频率特性.我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性.实现 DFT 的一个快速算法被称为快速傅里叶变换(FFT).关于傅里叶变换的细节知