Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv Hough线检测在帧与帧之间不一致_Opencv_Hough Transform_Canny Operator - Fatal编程技术网

Opencv Hough线检测在帧与帧之间不一致

Opencv Hough线检测在帧与帧之间不一致,opencv,hough-transform,canny-operator,Opencv,Hough Transform,Canny Operator,即使场景是静态的,我得到的HOUGH线(红色和白色)在视频的一帧到下一帧之间也会有所不同 每一帧的Canny结果也有很多变化。在我的测试用例中,这个问题并没有那么严重,但对于真实的街道场景,精明地检测到的边缘确实会在帧与帧之间发疯 正如可以看到的那样,许多行也只是错过了 我意识到每一帧的噪声是不同的,但是转换成灰度和随后的模糊使得输入图像非常接近(至少离我的眼睛很近) 发生了什么事,有没有办法解决这个问题 #Python 2/3兼容性 导入系统 PY3=系统版本信息[0]==3 如果PY3:

即使场景是静态的,我得到的HOUGH线(红色和白色)在视频的一帧到下一帧之间也会有所不同

每一帧的Canny结果也有很多变化。在我的测试用例中,这个问题并没有那么严重,但对于真实的街道场景,精明地检测到的边缘确实会在帧与帧之间发疯

正如可以看到的那样,许多行也只是错过了

我意识到每一帧的噪声是不同的,但是转换成灰度和随后的模糊使得输入图像非常接近(至少离我的眼睛很近)

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

#Python 2/3兼容性
导入系统
PY3=系统版本信息[0]==3
如果PY3:
xrange=范围
将numpy作为np导入
进口cv2
输入数学
从时间上导入睡眠
cap=cv2.视频捕获(0)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
斜率=2.0
虽然(正确):
睡眠(0.2)
ret,src=cap.read()
灰色=cv2.CVT颜色(src、cv2.COLOR\u BGR2GRAY)
灰色模糊=cv2.medianBlur(灰色,5)
灰度模糊canny=cv2.canny(灰度模糊,25150)
cv2.imshow(“src”,src)
cv2.imshow(“灰色模糊”,灰色模糊)
cv2.imshow(“灰色模糊精明”,灰色模糊精明)
cimg=src.copy()#numpy函数
线条=cv2.HoughLinesP(
灰色模糊精明,
1.
math.pi/180.0,
40, 
np.array([]),
50, 
10)
如果行不是无:
a、 b,c=线条
对于范围(a)中的i:
数值=行[i][0][3]-行[i][0][1]+0.001;
denom=行[i][0][2]-行[i][0][0];
如果(denom==0):
denom=0.001;
斜率=绝对值(单位/单位);
打印坡度
如果(坡度>坡度):
cv2.2线(
cimg,
(第[i][0][0]行,第[i][0][1]行),
(第[i][0][2]行,[i][0][3]行),
(0, 0, 255), 
3.
cv2.线路(AA)
如果(坡度<(1.0/坡度)):
cv2.2线(
cimg,
(第[i][0][0]行,第[i][0][1]行),
(第[i][0][2]行,[i][0][3]行),
(200, 200, 200), 
3.
cv2.线路(AA)
cv2.imshow(“霍夫线”,cimg)
ch=cv2.等待键(1)
如果ch==27:
打破
cv2.destroyAllWindows()

即使在同一帧上,也可以得到不同的结果。
HoughLinesP
中的
P
代表概率。并不是所有的值都进行了测试,那些值是随机选择的。但无论哪种方式,您都应该能够获得更多的结果,并且应该能够获得大量的重叠。放大二值图像可能有助于在hough结果中获得更多点击。您还可以为
HoughLinesP()
方法尝试不同的
rho
theta
参数。请尝试使用lineSegmentDetector,它会产生非常一致的结果(但由于噪声,大多数方法可能有点不一致)。即使在同一帧上,您也可以获得不同的结果。
HoughLinesP
中的
P
代表概率。并不是所有的值都进行了测试,那些值是随机选择的。但无论哪种方式,您都应该能够获得更多的结果,并且应该能够获得大量的重叠。放大二值图像可能有助于在hough结果中获得更多点击。您还可以为
HoughLinesP()
方法尝试不同的
rho
theta
参数。请尝试lineSegmentDetector,它会产生非常一致的结果(但由于噪声,大多数方法可能有点不一致)。
# 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()