基于OpenCV检测前方车辆像素宽度:水平线提取优化咨询
问题:提取车辆宽度对应的优质水平线以检测前方车辆像素宽度
我需要检测前方车辆的像素宽度,尝试通过提取对应车辆宽度的水平线来实现,以下是我的实现方案:
输入图片

步骤1:边缘检测
import cv2 from google.colab.patches import cv2_imshow import numpy as np image = cv2.imread('croopped.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 50, 250, apertureSize=3) cv2_imshow(edges)

步骤2:腐蚀操作
kernel = np.ones((1,5)) linh = cv2.erode(edges,kernel) cv2_imshow(linh)

步骤3:霍夫直线检测
lines = cv2.HoughLinesP(linh, 1, np.pi/180, 10, maxLineGap= 50, minLineLength = 50) if lines is not None: for line in lines: x1, y1, x2, y2 = line[0] cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 3) cv2_imshow(image)

如您所见,提取的水平线不符合预期,无法得到对应车辆宽度的优质水平线,预期效果如下:
请问如何调优现有方案或采用其他方法以获取更优质的水平线?
解决方案
一、调优现有霍夫直线检测方案
- 过滤非水平线:在绘制直线前,判断直线是否接近水平——计算直线斜率,只保留斜率绝对值小于0.1(可根据场景调整)的直线,过滤倾斜或垂直干扰线
if lines is not None: for line in lines: x1, y1, x2, y2 = line[0] # 避免除零错误,过滤非水平直线 if x2 != x1: slope = abs((y2 - y1) / (x2 - x1)) if slope < 0.1: cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 3) cv2_imshow(image)
调整霍夫参数:
- 提高
minLineLength至80左右,过滤短干扰线段; - 降低
maxLineGap至20左右,让同一条水平线上的断点更容易连接; - 提高霍夫检测阈值(第三个参数)至20左右,减少误检测直线。
- 提高
优化预处理步骤:
- 替换腐蚀为水平方向膨胀:用
cv2.dilate配合(1,5)的核,连接水平方向边缘断点,更利于提取完整水平线; - 增加高斯模糊:在Canny边缘检测前加入
gray = cv2.GaussianBlur(gray, (5,5), 0),减少噪声干扰,获得更干净的边缘。
- 替换腐蚀为水平方向膨胀:用
二、替代方案:基于轮廓检测提取车辆宽度
- 核心逻辑:提取图像中车辆的轮廓,通过外接矩形直接获取车辆宽度,同时可绘制矩形上下边作为目标水平线
- 示例代码:
import cv2 from google.colab.patches import cv2_imshow import numpy as np image = cv2.imread('croopped.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 高斯模糊去噪 gray = cv2.GaussianBlur(gray, (5,5), 0) # 二值化突出前景 _, thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV) # 提取外部轮廓 contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: area = cv2.contourArea(cnt) # 过滤小轮廓,阈值根据实际场景调整 if area > 5000: x, y, w, h = cv2.boundingRect(cnt) # 绘制车辆宽度对应的水平线 cv2.line(image, (x, y), (x+w, y), (0,255,0), 3) cv2.line(image, (x, y+h), (x+w, y+h), (0,255,0), 3) cv2_imshow(image)
三、进阶方案:目标检测模型
如果场景复杂、干扰较多,传统图像处理鲁棒性不足,可使用YOLO、Faster R-CNN等目标检测模型,直接检测车辆边界框,框的宽度即为车辆像素宽度,精度和稳定性更高。
内容的提问来源于stack exchange,提问作者Mohamed Abduljawad
相关产品推荐
相关产品推荐

