python - convexityDefects 错误的输出(没有足够的缺陷!)
问题描述
我正在处理一个关于圆检测的问题,我已经达到了一些合并的结构,比如下一个(希望它不会失去质量):
https://cdn1.imggmi.com/uploads/2020/4/17/6c447e49890278d40c9a44d109772b87-full.png
我的想法是通过首先使用 hullConvex 函数来查找这些交点,以查找凸包络,然后使用 convexityDefects 来查找作为缺陷的凸点。然而,convexityDefects 似乎失败了,因为我得到了这个:
https://cdn1.imggmi.com/uploads/2020/4/17/1ab59bfaaaa5a2e6f4e054dfd798d301-full.png
在这里,我们有黄色的原始轮廓,蓝色的船体轮廓和模型发现的红色缺陷。
不相交的点很容易通过缺陷的深度过滤去除,但我错过了上面的两个相交点。而且我确实认为它们应该在理论上出现。我在这里分享我的代码:
def roi_contour(roi):
drawing = np.zeros((roi.shape[0], roi.shape[1], 3), np.uint8)
cntsSorted, hierarchy = cv2.findContours(roi, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#cntsSorted = sorted(sub_cb, key=lambda x: cv2.contourArea(x),reverse=True)
hull = []
for i_x in range(len(cntsSorted)):
hull.append(cv2.convexHull(cntsSorted[i_x]))
cv2.drawContours(drawing, cntsSorted, 0, (255, 255, 255), -1, 8, hierarchy)
cv2.drawContours(drawing, cntsSorted, 0, (0, 255, 255), 2, 8, hierarchy)
cv2.drawContours(drawing, hull, 0, (255,0,0), 2, 8, hierarchy)
cnt = cntsSorted[0]
env = cv2.convexHull(cnt,returnPoints = False)
defectos = cv2.convexityDefects(cnt,env)
points_def = []
try:
for k in range(defectos.shape[0]):
i,f,l,d = defectos[k,0]
maslejano = tuple(cnt[l][0])
#if d>6000:
points_def.append(maslejano)
cv2.circle(drawing,maslejano,3,[0,0,255],-1)
except:
pass
我什至考虑过它们在数学上是非凸的可能性,但我很确定(特别是因为较低的几乎相等)这不是问题......
我对这个函数有什么误解还是openCV的库失败?
非常感谢您的帮助,伙计们!
解决方案
推荐阅读
- javascript - PayPal REST SDK:删除送货地址和付款授权,使其进入待处理状态
- docker - PyCharm 无法在本地 docker-machine 中使用解释器
- twitter-bootstrap - 为什么没有类限制宽度的div
- python - Scrapy:ImportError:没有名为 scrapy_proxies 的模块
- cloud - 寻找与 jira 集成进行外部通信的工具
- javascript - 无法启用表单元素
- c# - 来自 label.text 奇怪行为的字符串
- c++ - 从文件中读取的冒泡排序生成随机数
- javascript - 如果 form.submit 到不同的站点,我们可以处理网络故障吗?
- javascript - 当我单击一个切换时,所有 JQuery SlideToggle 都在打开