2012-07-02 3 views
3

문제점을 발견했다고 생각합니다. 저는 IP 웹캠 스트림을 사용하고 있습니다. 그런 다음 오버레이 된 변환과 원본 이미지를 보여줍니다. 따라서 보통 웹캠처럼 보이지만 수평선이 강조 표시됩니다. 저는 이미지에서 수평선을 찾고 있습니다. 그 안에 수평선이있는 한 잘 작동합니다. 캠을 시작하고 수평선이 없으면 오류가 발생합니다.웹캠에서 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은 더 라인이없는 경우.

온라인에서 lines[0]에 액세스하려고 시도합니다. 실제로는 lines.__getitem__이 호출됩니다. linesNoneType 유형이므로 __getitem__ 메서드가 없습니다. 나는 것을 시도

+0

(빈리스트가 아닌 그것은 또한 그 라인을 확인합니다주의)

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

:

는 예를 들어 라인 is not None 해당 항목에 액세스하기 전에 확인 할 수 있습니다,이 문제를 해결하려면 하지만 지금은 새로운 오류가 발생합니다 : line 16, in if lines : ValueError : 둘 이상의 요소가있는 배열의 진리 값이 모호합니다. a.any() 또는 a.all()을 사용하십시오. – JDD

+2

지금 얻었습니다. If lines is None : 그 것이 효과가있었습니다. 감사합니다 – JDD

+0

@ JDD 만약'lines이 None이 아니라면'을 의미합니다. 그렇지 않으면'none '이 아니고 첫 번째 주석에 쓰여진 것과 같은 오류를 반환 할 때만 계속됩니다. – WuerfelDev

관련 문제