3

私は問題を理解したと思います。私はIPWebカメラストリームを使用しており、キャニーエッジとハフ変換を行っています。次に、オーバーレイされた変換と元の画像を表示します。通常のWebカメラとほとんど同じように見えますが、水平線が強調表示されています。画像で横線を探しています。水平線がある限り、問題なく動作します。カムを開始し、水平線がない場合、エラーが発生します。

 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__linesタイプのようNoneTypeに、それはメソッドを持っていません__getitem__

この問題を解決するには、たとえばis not None、アイテムにアクセスする前にその行を確認します。

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

(行が空のリストではないこともチェックすることに注意してください)

于 2012-07-03T00:13:22.450 に答える