无人驾驶--交通标志检测实战(付源码)
前言
做完项目后写了个技术小结,为他人学习提供参考。
另外建了一个无人驾驶方面的微信交流群,有兴趣的朋友可以加我微信:wxl609278502 请注明: 姓名-单位/学校
项目描述:
使用opencv实时处理车载摄像机采集的道路图像,检测道路交通标志牌,并对交通标志牌进行形状分类,为下一步的交通标志识别提供检测基础。
此项目使用的传统计算机视觉的方法,针对的是没有GPU设备的项目。相对深度学习的交通标志检测和分类存在鲁棒性不够高的问题。
基于深度学习的交通标志牌的检测和分类 会在后续博文中进行整理。
项目代码GitHub地址:https://github.com/xlwang123/Self-Driving_Projects
付几张交通标志检测的效果图:
![]() |
![]() |
---|---|
原图 | 增强图 |
![]() |
![]() |
---|---|
阈值处理 | 几何判断 |
测试地点:南京
软硬件要求
- 普通车载记录仪(要求畸变不严重,对于畸变严重的需要进行图片校正)
- 工控机(带GPU更好,没有GPU也无所谓)
- Ubuntu16.04 + opencv3.2
交通标志牌检测流程
- 基于红黄蓝三色的交通标志牌图像增强
- 基于颜色筛选感兴趣目标
- MSER 最大极值稳定区域
- 基于几何不变矩的颜色筛选
- 结果输出
图像增强
基于三色颜色增强算法,对交通标志牌特有的颜色进行增强,非交通标志牌的颜色进行抑制。
def color_enhance(img):
height = img.shape[0]
weight = img.shape[1]
channels = img.shape[2]
print("weight : %s, height : %s, channel : %s" % (weight, height, channels))
for row in range(height):
for col in range(weight):
r = img[row, col, 0]
g = img[row, col, 1]
b = img[row, col, 2]
if ((r > 100) & (g > 100) & (b > 100)) | ((abs(r - b) < 25) & (abs(r - g) < 25) & (abs(g - b) < 25) | (
(b > g) & (b > r) & (r < g) & (r > 2 * b))):
img[row, col, :] = 0
if (2 * (r - g) < (r - b)) & (b > g) & (r > b):
img[row, col, :] = 0
return img
颜色增强效果前后对比如图所示:
![]() |
![]() |
---|---|
增强前 | 增强后 |
颜色阈值筛选
基于红色、黄色、蓝色的HSV阈值进行交通标志的筛选。
def color_select(img):
lower_blue = np.array([100,40,40])
upper_blue = np.array([130,255,255])
lower_yellow = np.array([15,55,55])
upper_yellow = np.array([50,255,255])
lower_red1 = np.array([0, 43, 46])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([156, 43, 46])
upper_red2 = np.array([180, 255, 255])
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper