OpenCV 轮廓的凸性

一、概括

理解物体形状或轮廓的另外一种有用的方法是计算一个物体的凸包(convex hull)然后计算其凸缺陷(convexity defects)。很多复杂物体的特性能很好的被这种缺陷表现出来。

二、相关函数

1、发现点集的凸外形

CvSeq* cvConvexHull2( const CvArr* input, void* hull_storage=NULL,

int orientation=CV_CLOCKWISE,
int return_points=0 );

points

2D 点集的序列或数组,32-比特整数或浮点数坐标

hull_storage

输出的数组(CvMat*) 或内存缓存 (CvMemStorage*),用以存储凸外形。 如果是数组,则它应该是一维的,而且与输入的数组/序列具有同样数目的元素。输出时,通过修改头结构将数组裁减到凸外形的尺寸。

orientation

凸外形的旋转方向: 逆时针或顺时针 (CV_CLOCKWISE or CV_COUNTER_CLOCKWISE)

return_points

如果非零,hull_storage 为数组情况下,点集将以外形 (hull) 存储,而不是顶点形式 (indices)。如果 hull_storag 为内存存储模式下则存储为点集形式(points)。

函数 cvConvexHull2 使用 Sklansky 算法计算 2D 点集的凸外形。如果 hull_storage 是内存存储仓, 函数根据 return_points 的值,创建一个包含外形的点集或指向这些点的指针的序列。

2、测试轮廓的凸性

int cvCheckContourConvexity( const CvArr* contour );

contour

被测试轮廓 (点序列或数组).

函数 cvCheckContourConvexity 输入的轮廓是否为凸的。必须是简单轮廓,比如没有自交叉。

3、发现轮廓凸形缺陷

CvSeq* cvConvexityDefects( const CvArr* contour, const CvArr* convexhull,

CvMemStorage* storage=NULL );

contour

输入轮廓

convexhull

用 cvConvexHull2 得到的凸外形,它应该包含轮廓的定点的指针或下标,而不是外形点的本身,即cvConvexHull2 中的参数 return_points 应该设置为 0.

storage

凸性缺陷的输出序列容器。如果为 NULL, 使用轮廓或外形的存储仓。

函数 cvConvexityDefects 发现输入轮廓的所有凸性缺陷,并且返回 CvConvexityDefect 结构序列。

时间: 2024-10-11 00:26:32

OpenCV 轮廓的凸性的相关文章

[转载]转载,opencv轮廓查找,匹配以及特征提取,实例

已有 9450 次阅读 2012-3-15 20:50 |系统分类:科研笔记|关键词:opencv 轮廓 轮廓的查找.表达.绘制.特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match) 作者:王先荣 前言    轮廓是构成任何一个形状的边界或外形线.前面讲了如何根据色彩及色彩的分布(直方图对比和模板匹配)来进行匹配,现在我们来看看如何利用物体的轮廓.包括以下内容:轮廓的查找.表达方式.组织方式.绘制.特性.匹

OpenCV —— 轮廓

把检测出的边缘像素组装成轮廓  --  cvFindContours   OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储器可以通过四个函数访问 : cvCreateMemStorage(创建一个内存存储器,0采用默认大小)    cvReleaseMemStorage   cvClearMemStorage(和通常释放内存的函数区别 -- 只是将释放的内存返还给内存存储器,而并不返还给系统 -- 可以重复使用内存

OpenCV轮廓检测,计算物体旋转角度

效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include <opencv2/core/core.h

Opencv轮廓计数(学习)

#include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/xfeatures2d.hpp> using namespace std;using namespace cv;using namespace cv::xfeatures2d; Mat img1, img2, img3, img4, img5, img6, img_result, img_gray1, img_gray2, img_gray

OpenCV 轮廓矩

一.概述 我们在实际中如何应用这些轮廓呢?比如,有两个轮廓如何进行比较匹配,或者如何比较一个轮廓和一个抽象模板.比较两个轮廓最简洁的方式是比较它们的轮廓矩.矩是通过对轮廓上所有点进行积分运算(或者认为是求和运算)而得到的一个粗略特征. 二.矩及Hu矩的结构体 typedef struct CvMoments { double  m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;   /* spatial moments */ double  mu2

OpenCV 轮廓基本特征

一.概述 我们通过cvFindContours( )函数获取得图像轮廓有何作用呢?一般来说,我们对轮廓常用的操作有识别和处理,另外相关的还有多种对轮廓的处理,如简化或拟合轮廓,匹配轮廓到模板,等等. 我们在轮廓处理中经常需要对轮廓变化一些特征进行概括,比如长度或者一些反映轮廓整体大小的度量.另外轮廓矩也是概括轮廓的特征的重要方法. 二.常见特征函数 1.多边形逼近 CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemSt

opencv 轮廓点的坐标大小的修改

std::vector> allcontourpoint; //点集的数据集 for(int i=0; iopencv 轮廓点的坐标大小的修改 原文地址:https://www.cnblogs.com/rjjhyj/p/11479774.html

opencv 轮廓的外围多边形提取或者删除最小最大轮廓

std::vector resultpoly; cv::approxPolyDP(contours[0], resultpoly,4, true);//轮廓contours[0] ,resultpoly多边形的点集 cv::polylines(src, resultpoly, true, 150, 1);//画多边形的外轮廓 cv::imshow("detected polyLines", src);//显示多边形的外轮廓 //相关链接https://www.cnblogs.com/d

opencv 轮廓排序

vector>contours ; vectorhierarchy; //找到轮廓 findContours(image, contours, hierarchy,CV_RETR_CCOMP ,CV_CHAIN_APPROX_SIMPLE );//查找轮廓//CV_RETR_EXTERNAL 外轮廓 //CV_CHAIN_APPROX_NONE //轮廓上所有点 //CV_RETR_CCOMP 所有轮廓 //CV_CHAIN_APPROX_SIMPLE //轮廓上部分点 //轮廓排序 stati