Hough Lines Detection inconsistent from frame to frame

586 views Asked by At

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?

Same Scene - Different Results

# 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()
0

There are 0 answers