You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)

霍夫直线检测结果

如您所见,提取的水平线不符合预期,无法得到对应车辆宽度的优质水平线,预期效果如下:
预期效果

请问如何调优现有方案或采用其他方法以获取更优质的水平线?


解决方案

一、调优现有霍夫直线检测方案

  1. 过滤非水平线:在绘制直线前,判断直线是否接近水平——计算直线斜率,只保留斜率绝对值小于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)
  1. 调整霍夫参数:

    • 提高minLineLength至80左右,过滤短干扰线段;
    • 降低maxLineGap至20左右,让同一条水平线上的断点更容易连接;
    • 提高霍夫检测阈值(第三个参数)至20左右,减少误检测直线。
  2. 优化预处理步骤:

    • 替换腐蚀为水平方向膨胀:用cv2.dilate配合(1,5)的核,连接水平方向边缘断点,更利于提取完整水平线;
    • 增加高斯模糊:在Canny边缘检测前加入gray = cv2.GaussianBlur(gray, (5,5), 0),减少噪声干扰,获得更干净的边缘。

二、替代方案:基于轮廓检测提取车辆宽度

  1. 核心逻辑:提取图像中车辆的轮廓,通过外接矩形直接获取车辆宽度,同时可绘制矩形上下边作为目标水平线
  2. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:40:24