cv::convexityDefects()详解

参考链接:详解OpenCV的函数convexHull()和函数convexityDefects(),并利用它们)做凸包(凸壳)检测及凸包(凸壳)的缺陷检测-CSDN博客

 

void convexityDefects( InputArray contour, InputArray convexhull, OutputArray convexityDefects );

三个参数说明如下:

contour---生成凸包的轮廓点集,一般就是轮廓检测函数findContours()的输出。

convexhull----函数convexHull()的输出,里面存储的是凸包信息,在这里只能是int类型(即vector<vector<int>>类型),而不能是vector<vector<Point>>类型。

convexityDefects ----类型为vector<vector<Vec4i>>类型,每一个凸包缺陷由若干个Vec4i来描述,每一个Vec4i由四个整型数据构成,这四个整型数据的名称分别为:start_index, end_index, farthest_pt_index, fixpt_depth。具体意义用下面这张图来说明。

上面的黄色数字标的①②③④⑤⑥六个部分实际上就描述了手的轮廓凸包的六个凸包缺陷。这里以⑥为例说明start_index, end_index, farthest_pt_index, fixpt_depth的意义。

start_index:凸包缺陷的起点,上图⑥中的A或B就代表起点,A或B都位于轮廓上。

end_index: 凸包缺陷的终点,上图⑥中的A或B就代表终点,A或B都位于轮廓上。

farthest_pt_index:凸包缺陷中轮廓与凸包相距的最远点,上图⑥中的C点就是凸包缺陷中轮廓与凸包相距的最远点,C点也位于轮廓上。

​fixpt_depth:上图中C点距离凸包的距离。它以8位定点小数来近似表示,所以如果要换成浮点数,应该除以256,即the floating-point value=fixpt_depth/256.0。

这个错误信息 "error: (-215:Assertion failed) hpoints > 0 in function 'cv::convexityDefects'" 出现在OpenCV库中,它表示在计算凸包缺陷(Convexity Defects)时遇到了问题,函数 `cv::convexityDefects` 验证到用于分析形状的顶点点数 (hpoints) 少于或等于0。 `convexityDefects` 函数通常用于找出轮廓内部的凹陷区域,如果输入的轮廓(contour)数据不满足条件(即非零且至少有三个顶点),那么就会抛出这个异常。 解决此问题的一般步骤包括: 1. **检查轮廓数据**:确保你在调用 `cv::convexityDefects` 之前,轮廓(contour)不是空的并且包含至少3个顶点。你可以通过 `cv::contoursArea()` 和 `cv::approxPolyDP()` 函数检查轮廓的有效性。 ```cpp if (cv::contoursArea(contour) > 0 && contour.size() >= 3) { std::vector<cv::Vec4i> defects = cv::convexityDefects(contour); } ``` 2. **处理异常**:使用异常处理结构(如 C++ 的 `try-catch`)来捕获并处理这个错误,避免程序崩溃。 ```cpp try { std::vector<cv::Vec4i> defects = cv::convexityDefects(contour); } catch (const cv::Exception& e) { // 处理错误,比如记录日志或返回默认值 std::cout << "Convexity defect calculation failed: " << e.what() << std::endl; } ``` 3. **数据预处理**:如果可能的话,确保输入的数据是正确的,例如从图像中正确检测和提取轮廓。 如果你使用的是CSDN的“C知道”,请记住提供实际代码片段以便更好地诊断问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值