cv.convexityDefects在该示例中执行失败的原因是什么?是否属于Bug?
cv.convexityDefects在该示例中执行失败的原因是什么?是否属于Bug?
我来给你拆解这段代码跑崩的原因,这绝对不是OpenCV的Bug,完全是参数不符合函数要求导致的!
主要问题有两个,核心原因是第一个:
- 轮廓点的数据类型不匹配:你定义轮廓时用了
dtype='f4'(也就是float32浮点类型),但cv.convexityDefects对输入轮廓有硬性要求——轮廓的坐标必须是整数类型(比如np.int32)。这个函数的底层是基于像素级的整数几何逻辑设计的,OpenCV会严格校验输入参数的类型,浮点坐标直接过不了校验,自然触发报错。 - 额外潜在问题:就算你把类型改对了,当前轮廓里的浮点坐标(比如
[0.5, 0.2])转成整数后会变成[0, 0],这会导致轮廓出现重复点或者形状异常,甚至可能因为凸包的有效点数不足3个,再次触发cv.convexityDefects的报错(该函数要求凸包至少有3个不同的点才能计算缺陷)。
给你个修正后的代码示例,你可以试试:
import numpy as np, cv2 as cv # 改用整数类型的轮廓点 contour = np.array([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]], dtype='int32') # 若必须用浮点坐标,先做取整转换 # contour = np.array([[0, 0], [1, 0], [1, 1], [0.5, 0.2], [0, 0]], dtype='f4').astype(np.int32) hull = cv.convexHull(contour, returnPoints=False) # 加个判断,确保凸包有足够点数再计算缺陷 if len(hull) >= 3: defects = cv.convexityDefects(contour, hull) print(defects) else: print("凸包点数不足,无法计算缺陷")
总结下:这段代码的报错完全是违反了函数的参数规范,和OpenCV的Bug没有关系,只要把轮廓改成整数类型,同时保证凸包有至少3个有效点,就能正常运行了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

