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