The HOUGH lines (RED and WHITE) I get vary from one frame of video to the next even though the scene is static.
There is also lots of variation in the Canny results from frame to frame. This problem is not so bad here with my test case but for a real street scene, the Canny detected edges really go nuts from frame to frame.
As can be seen, many lines also simply get missed.
I realize that the noise is different from frame to frame but the conversion to grayscale and subsequent blur make the input images very close (at least to my eye).
What is going on and is there any way to fix this?
# Python 2/3 compatibility
import sys
PY3 = sys.version_info[0] == 3
if PY3:
xrange = range
import numpy as np
import cv2
import math
from time import sleep
cap = cv2.VideoCapture(0)
if __name__ == '__main__':
SLOPE = 2.0
while(True):
sleep(0.2)
ret, src = cap.read()
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
gray_blur = cv2.medianBlur(gray, 5)
gray_blur_canny = cv2.Canny(gray_blur, 25, 150)
cv2.imshow("src", src)
cv2.imshow("gray_blur", gray_blur)
cv2.imshow("gray_blur_canny", gray_blur_canny)
cimg = src.copy() # numpy function
lines = cv2.HoughLinesP(
gray_blur_canny,
1,
math.pi/180.0,
40,
np.array([]),
50,
10)
if lines is not None:
a,b,c = lines.shape
for i in range(a):
numer = lines[i][0][3] - lines[i][0][1] + 0.001;
denom = lines[i][0][2] - lines[i][0][0];
if (denom == 0):
denom = 0.001;
slope = abs(numer/denom);
print slope
if (slope > SLOPE):
cv2.line(
cimg,
(lines[i][0][0], lines[i][0][1]),
(lines[i][0][2], lines[i][0][3]),
(0, 0, 255),
3,
cv2.LINE_AA)
if (slope < (1.0/SLOPE)):
cv2.line(
cimg,
(lines[i][0][0], lines[i][0][1]),
(lines[i][0][2], lines[i][0][3]),
(200, 200, 200),
3,
cv2.LINE_AA)
cv2.imshow("hough lines", cimg)
ch = cv2.waitKey(1)
if ch == 27:
break
cv2.destroyAllWindows()