I think I’ve figured out the problem. I’m using a IP webcam stream, doing a canny edge and hough transform. Then showing the overlayed transform and the original image. So pretty much just looks like the normal web cam but the horizontal lines are highlighted.
and I’m looking for horizontal lines in the image. It works just fine as long as there are horizontal lines in it. If I start the cam and there aren’t any horizontal lines, I get the error:
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__'
Here’s the whole code. I’m very new to python and opencv so I’m not sure how to fix this. I’d like it to just show the blank image when there aren’t any horizontal lines so I can have a continuous stream.
Also my next task is to try and save the images into a video. Any help on that part would be greatly appreciated. thanks!
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
Apparently
cv2.HoughLinesPreturnsNonewhen there are no lines.On line 16, you try to access
lines[0], which actually callslines.__getitem__. Aslinesis of typeNoneType, it doesn’t have a__getitem__method.To solve the problem, you can for example check that lines
is not Nonebefore accessing its items:(note that it will also check that lines is not an empty list)