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

如何在OpenCV中检测自定义道路指示箭头形状?

道路指示箭头检测问题

问题

我尝试检测图像中的道路指示箭头,这些箭头尺寸和形状固定,但可能呈现不同朝向。需要检测的五种箭头类型如下:

  • 仅直行
  • 仅左转
  • 仅右转
  • 直行或右转
  • 直行或左转

道路标线图像

已尝试方案

方案1:使用TM_CCORR_NORMED的cv.matchTemplate

使用TM_CCORR_NORMED参数的cv.matchTemplate仅在图像与模板朝向一致且无预处理时有效。有趣的是,对图像和模板同时应用相同预处理步骤(如Canny检测)会降低cv.matchTemplate的相关性。此外,matchTemplate不具备旋转不变性,无法检测旋转后的箭头。

方案2:参考Stack Overflow帖子

由于我的箭头为自定义形状,帖子中的代码无法生效。

方案3:霍夫直线变换与轮廓检测

我在此方案中遇到瓶颈,无法编写代码来检测这五种组合的箭头,当前代码如下:

import cv2
import numpy as np

# Load Image
img = cv2.imread('path_to_image')

# Preprocessing
processed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
processed = cv2.bilateralFilter(processed, 11, 75, 75)
processed = cv2.Canny(processed, 50, 150)
kernel = np.ones((3, 3), np.uint8)
processed = cv2.morphologyEx(processed, cv2.MORPH_CLOSE, kernel, iterations=1)

# Hough Line Transform 
lines = cv2.HoughLinesP(processed, 1, np.pi/180, threshold=50, minLineLength=30, maxLineGap=10)
if lines is not None:
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)

# Contour Detection 
contours, _ = cv2.findContours(processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    approx = cv2.approxPolyDP(cnt, 0.02 * cv2.arcLength(cnt, True), True)
    if len(approx) > 5:  # Rough filter for arrow shapes
        cv2.drawContours(img, [approx], 0, (255, 0, 0), 2)

# Display Results
cv2.imshow('Detected Arrows', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

附加背景

  • 提供的图像是8000×8000像素大图的放大版,原图包含更多噪声(如其他道路标线和交叉口),但目标箭头标线与其他元素区分度较高,单个箭头裁剪后约7KB。
  • 我接受针对五种箭头分别设计检测算法的方案,而非通用方案。
  • 我也接受非OpenCV的方案,但无标注数据,因时间限制无法创建训练数据集。

内容的提问来源于stack exchange,提问作者J01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:21:09