对于学校项目,我尝试使用python和opencv识别视频捕获中的六边形。问题是,当我使用这个代码时,它永远不会找到六边形。我还没有找到工作原因,所以我希望有人可以帮助我。
代码:
import numpy as np
import cv2
stop_cascade = cv2.CascadeClassifier('cascade.xml')
cap = cv2.VideoCapture(0)
while(True):
ret, img = cap.read()
lower = np.array([0,0,0])
upper = np.array([20,20,20])
mask = cv2.inRange(img, lower, upper)
contours, h = cv2.findContours(mask, 1, 2)
contours.sort(key = len)
for contour in contours[-3:]:
approx = cv2.approxPolyDP(contour,0.1*cv2.arcLength(contour,True),True)
if len(approx) == 6:
print "hexagon"
cv2.imshow('image', mask)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
提前致谢
编辑: 更具体一点。我尝试了多种不同的六边形,但是当我打印len(大约)时,它永远不会高于4.这是我的对象中的错误还是我找不到轮廓的错误我不会知道吗?
答案 0 :(得分:0)
看起来你的程序简化了你想要的轮廓。所以 approxPolyDP 进一步将六边形简化为正方形或三角形。这也可以解释为什么 len(约)永远不会返回大于4的值。尝试更改传递给 approxPolyDP 的 epsilon 的值。这些是我建议的变化:
0.1*cv2.arcLength(contour,True)
中的倍增因子从0.01更改为0.1 另一种方法是使用六边形的凸包而不是轮廓,然后应用 approxPolyDP 函数。理想情况下,如果你的图像足够锐利,只需检查凸包中的点数就足以告诉你形状是否是六边形。进一步简化船体应该可以帮助您对噪声图像更加稳健。但是,再次选择正确的乘法因子将非常重要。
答案 1 :(得分:0)
使用此:
approx = cv2.approxPolyDP(contour,0.03*cv2.arcLength(contour,True),True)
您将获得理想的结果。