python opencv形状检测

python opencv形状检测,python,opencv,Python,Opencv,在学校的一个项目中,我试图使用python和opencv识别视频捕获中的六边形。问题是,当我使用这段代码时,它从未找到六边形。我还没有找到它不起作用的原因,所以我希望有人能帮助我 守则: import numpy as np import cv2 stop_cascade = cv2.CascadeClassifier('cascade.xml') cap = cv2.VideoCapture(0) while(True): ret, img = cap.read() lo

在学校的一个项目中,我试图使用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()
提前谢谢

编辑:
更具体一点。我尝试了多种不同的六边形,但当我打印透镜(近似值)时,它永远不会高于4。这是我的对象中的错误,还是我在查找不知道的轮廓时出错?

看起来您的程序正在简化轮廓,超出了您想要的范围。所以approxPolyDP进一步简化了六边形为正方形或三角形。这也解释了为什么len(近似值)从不返回大于4的值。尝试更改传递给approxPolyDP的epsilon值。以下是我的建议:

  • 请在approxPolyDP中尝试epsilon的一个值范围。将
    0.1*cv2.arcLength(等高线,True)
    中的乘法因子从0.01更改为0.1
  • 使用drawContours实际显示近似曲线。这将帮助您选择最佳的乘法因子

  • 另一种方法是使用六边形的凸包而不是轮廓,然后应用approxPolyDP函数。理想情况下,如果您的图像足够清晰,只需检查凸面外壳中的点数就足以告诉您形状是否为六边形。进一步简化船体将有助于增强对噪声图像的鲁棒性。但是,选择正确的乘法因子也很重要

    看起来你的程序正在简化轮廓,超出了你想要的范围。所以approxPolyDP进一步简化了六边形为正方形或三角形。这也解释了为什么len(近似值)从不返回大于4的值。尝试更改传递给approxPolyDP的epsilon值。以下是我的建议:

  • 请在approxPolyDP中尝试epsilon的一个值范围。将
    0.1*cv2.arcLength(等高线,True)
    中的乘法因子从0.01更改为0.1
  • 使用drawContours实际显示近似曲线。这将帮助您选择最佳的乘法因子
  • 另一种方法是使用六边形的凸包而不是轮廓,然后应用approxPolyDP函数。理想情况下,如果您的图像足够清晰,只需检查凸面外壳中的点数就足以告诉您形状是否为六边形。进一步简化船体将有助于增强对噪声图像的鲁棒性。但是,选择正确的乘法因子也很重要

    使用以下命令:

    approx = cv2.approxPolyDP(contour,0.03*cv2.arcLength(contour,True),True) 
    
    您将获得所需的结果。

    使用以下方法:

    approx = cv2.approxPolyDP(contour,0.03*cv2.arcLength(contour,True),True) 
    

    您将获得所需的结果。

    您在实际调试程序的过程中做了哪些工作,而不是说“我还没有找到它不起作用的原因,所以我希望有人能帮助我?”请有一个具体的问题,而不是“请调试这个…”我为不够具体而感到抱歉。我所做的调试代码是在相机前面保持不同的六边形,而程序打印了透镜(近似值),但它从未显示高于4的数字。我之所以这样解决这个问题,是因为我的物体(纸上的一个六边形图像)还是因为我找不到轮廓?你能附上样本输入吗?@ZdaR样本只是一张纸上画的一个简单的黑色六边形。你在实际调试程序时做了什么,而不是说什么“我还没有找到它不起作用的原因,所以我希望有人能帮助我?”请有一个具体的问题,而不是“请调试这个…”我很抱歉不够具体。我所做的调试代码是在相机前保持不同的六边形,而程序打印透镜(大约)但它从来没有显示出高于4的数字。我之所以这样做是因为我的物体(纸上的一个六边形图像),还是因为我在寻找轮廓时出错?你能附上样本输入吗?@ZdaR样本只是在一张纸上画的一个简单的黑色六边形