如何在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
相关产品推荐
相关产品推荐

