1

即使场景是静态的,我得到的 HOUGH 线(红色和白色)从一帧视频到下一帧都不同。

帧与帧之间的 Canny 结果也有很多变化。对于我的测试用例,这个问题在这里并不算太糟糕,但对于真实的街景,Canny 检测到的边缘真的从一帧到另一帧都发疯了。

可以看出,许多行也只是被遗漏了。

我意识到噪声因帧而异,但转换为灰度和随后的模糊使输入图像非常接近(至少在我看来)。

发生了什么事,有什么办法可以解决这个问题?

相同的场景 - 不同的结果

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

0 回答 0