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 结构序列。

 


 

 

 

### OpenCV轮廓获取方法 #### 使用 `cv.mean()` 函数计算平均颜色或强度 为了获得图像中特定区域的颜色或灰度值的平均值,可以使用 `cv.mean()` 函数。此函数接受两个参数:一个是输入图像,另一个是可选的掩码(mask),用于指定要处理的像素范围。 ```python import cv2 as cv # 计算带有掩码的图像均值 mean_val = cv.mean(image, mask=mask)[^1] ``` 这段代码会返回四个浮点数构成的元组 `(B,G,R,A)` 表示蓝色、绿色、红色通道以及透明度通道的平均值;如果图像是单通道,则只返回一个数值作为该通道的平均亮度。 #### 查找并分析轮廓包及缺陷 对于更复杂的形状描述符,比如检测物体是否有凹陷部分,可以通过查找轮廓包来完成,并进一步识别这些结构中的异常情况即所谓的“缺陷”。这涉及到两个重要的操作: - **构建包**:通过调用 `cv.convexHull()` 方法得到给定轮廓集合形成的最小多边形表示形式。 ```python hull = cv.convexHull(contour, returnPoints=False)[^2] ``` 这里设置 `returnPoints` 参数为 `False` 可以让函数输出索引列表而不是实际坐标点集,这对于后续计算更加高效。 - **定位缺陷**:一旦获得了上述提到的壳数据之后,就可以利用 `cv.convexityDefects()` 来寻找那些偏离理想化几何形态的地方。 ```python defects = cv.convexityDefects(contour, hull) ``` 当遍历由 `defects` 返回的结果数组时,每一个条目都包含了起始点、结束点、最远端点和距离信息,这些都是用来描绘潜在问题位置的关键要素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值