2012-07-02 51 views
3

我想我已經找到了問題。我正在使用IP攝像頭流,做一個canny邊緣和hough變換。然後顯示疊加變換和原始圖像。所以幾乎看起來像正常的網絡攝像頭,但水平線突出顯示。 我正在尋找圖像中的水平線。只要有水平線,它就可以工作。如果我開始凸輪和沒有任何水平線,我得到的錯誤:從網絡攝像頭做Hough變換時Python OpenCV崩潰

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

顯然cv2.HoughLinesP返回None時,有沒有線。

在第16行,您嘗試訪問lines[0],實際上它調用lines.__getitem__。由於lines類型爲NoneType,因此它沒有__getitem__方法。

爲了解決這個問題,比如,你可以檢查訪問其項目線is not None前:

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

(請注意,它也將檢查行是不是空表)

+0

我試過了但現在我得到一個新的錯誤:第16行,在 if lines:ValueError:具有多個元素的數組的真值是不明確的。使用a.any()或a.all() – JDD

+2

現在明白了..我使用如果行數是無:並且工作。謝謝 – JDD

+0

@JDD你的意思是'如果行不是無:'否則只有在沒有時纔會繼續,並且會返回與第一個註釋中相同的錯誤。 – WuerfelDev