3

我想我已经找到了问题所在。我正在使用 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
4

1 回答 1

4

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

在第 16 行,您尝试访问lines[0]实际调用lines.__getitem__. 与linestypeNoneType一样,它没有__getitem__方法。

is not None为了解决这个问题,您可以在访问其项目之前检查这些行:

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

(请注意,它还会检查行不是空列表)

于 2012-07-03T00:13:22.450 回答