【问题标题】:Python OpenCV crashes when doing a Hough transform from webcam从网络摄像头进行霍夫变换时,Python OpenCV 崩溃
【发布时间】:2012-07-02 23:39:40
【问题描述】:

我想我已经找到了问题所在。我正在使用 IP 网络摄像头流,进行精明的边缘和霍夫变换。然后显示叠加的变换和原始图像。所以几乎看起来就像普通的网络摄像头,但水平线被突出显示。 我正在寻找图像中的水平线。只要其中有水平线,它就可以正常工作。如果我启动凸轮并且没有任何水平线,我会收到错误:

 Traceback (most recent call last):
  File "/home/Desktop/hough.py", line 16, in <module>
  for line in lines[0]:
  TypeError: 'NoneType' object has no attribute '__getitem__'

这是整个代码。我对 python 和 opencv 很陌生,所以我不知道如何解决这个问题。当没有任何水平线时,我希望它只显示空白图像,这样我就可以有一个连续的流。

我的下一个任务是尝试将图像保存到视频中。对此部分的任何帮助将不胜感激。谢谢!

import cv2
import urllib
import math


cv2.namedWindow('edge')


while True:
    urllib.urlretrieve("http://192.168.5.1:8080/shot.jpg", 'cam.jpg')
    img = cv2.imread('cam.jpg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 80, 120, apertureSize=3)

    lines = cv2.HoughLinesP(edges, 1, math.pi/2, 2, None, 30, 1)
    for line in lines[0]:
            pt1 = (line[0],line[1])
            pt2 = (line[2],line[3])
            cv2.line(img, pt1, pt2, (0,0,255), 3)

    cv2.imwrite("road2.jpg", img)
    cv2.imshow('edge', img)
    ch = cv2.waitKey(5)
    if ch == 27:
            break

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    显然cv2.HoughLinesP 在没有行时返回None

    在第 16 行,您尝试访问lines[0],它实际上调用了lines.__getitem__。由于linesNoneType 类型,它没有__getitem__ 方法。

    要解决此问题,您可以在访问其项目之前检查 is not None 行:

    if lines:
        for line in lines[0]
            [...]
    

    (注意它还会检查行是否为空列表)

    【讨论】:

    • 我试过了,但现在我得到一个新错误:第 16 行,在 if lines:ValueError: 具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
    • 现在知道了。我使用了 If lines is None: 并且有效。谢谢
    • @JDD 你的意思是if lines is not None: 否则只有当它是none时它才会继续,并且会返回与第一条评论中写的相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2012-06-16
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多