盲人路口通行辅助及数据追踪研究

(整期优先)网络出版时间:2022-12-18
/ 4

盲人路口通行辅助及数据追踪研究

董思危,张志海,王嘉华,贾志成,陈国明

(上海工程技术大学 上海 201600)

摘要:本文主要依据乔治亚大学的研究人员发明的搭载人工智能设备辅助盲人通行的背包,展示了基于python opencv编程语言提高一般十字路口的红绿灯,斑马线识别率的方法[1],并设法增加该背包的性能(远程定位与通信),本文讨论了通过keilμVison5软件配以c语言进行串口远程通信编程,在XCOM V2.0模拟远程通讯软件中进行远程打字通信仿真,和基于GPS远程追踪器实现远程定位

关键词:python opencv 红绿灯斑马线识别 串口远程通信仿真 GPS远程定位

  1. 引言

1.1研究背景

近期,来自乔治亚大学的研究人员发明了搭载人工智能设备的背包(图1),旨在替代视障者的导盲犬和手杖,助其出行更加便利。这款背包装有一个可以在笔记本电脑上运行的人工智能系统,并配有能够隐藏在背心和腰包里的OAK-D相机,腰包里装有系统电池。在外出和出行时,该系统可以直接检测人行横道、红绿灯、路边海拔的变化、以及其他行人,还有街道设施如盲道、花篮、垃圾桶。然后通过蓝牙耳机提醒佩戴者这些潜在物体的存在[2],但是现有问题是马线和红绿灯的识别率很低,其中原因如下:(1)一般路口的斑马线颜色为白色且可能因为长期使用出现褪漆,因为边角磨损出现感应能力差(2)行人车辆通过遮住了斑马线的轮廓形态降低了识别率(3)红绿灯系统受太阳光反射等影响出现反光、颜色淡化等降低了识别率。

dbae5be31a2cca9c49951f381891770

图1.乔治亚大学的研究人员发明了搭载人工智能设备的背包运行效果图

1.2项目创新点与意义

本项目通过引进python opencv等语句编程,突出斑马线的白色并尽可能去除干扰斑马线识别的因素由此提高斑马线识别率,对红绿灯识别中,我们通过RGB颜色空间转HSV空间,并引入ROI识别(Region of Interest)对于红绿灯区域截取并中值过波去噪提高红绿灯识别率,并将识别的红绿灯以图片反馈,我们还会增加远程定位和通信:通过STM32开发板和串口远程通信原理进行远程打字通信仿真,通过GPS定位结合电子地图进行远程定位仿真。从而实现盲人通信辅助和数据定位的功能,让盲人通过十字交通信号口更方便,更能让盲人的亲属,家人们在盲人独自外出时可以随时远程通信和定位防止盲人迷路。

  1. 基于python opencv语句提高路口斑马线识别率的方法

2.1斑马线难以识别的原因分析及解决对策

如上文所提,斑马线难以识别的主要原因是斑马线褪漆和行人车辆的干扰,对此我们提出了以下解决方案:通过图像灰度化、高斯滤波、

阈值分割、形态学运算腐蚀和膨胀等突出斑马线的白色提高反射率并尽可能去除干扰斑马线识别的因素由此提高斑马线识别率,本项目采用所截的斑马线检测测试图和其经算法放大调整的图片由分别由下图2显示。

1668320279422

图2.本项目斑马线检测的原图

2.2图像灰度化

所谓图像灰度化,就是将彩色托盘去色彩转成灰色基调[3],其操作类似于美图秀秀中将彩色图片转为黑白照片,由于白色在所有色系中明度最高,没有任何色彩,故其受灰度化操作的影响最低,即“白色通过灰度化仍然是白色”。本项目中灰度化操作可以去掉斑马线周围物体的色彩干扰,并可以在灰白的颜色空间中及大范围地突出斑马线的白色,提高识别率。

2.3 高斯滤波

高斯滤波是一种线性平滑的波,广泛运用于图像处理,目的是为了去除图片的干扰因素,视频中噪声等,通过扫描图像像素,确定图像加权平均灰度值并代替中心像素点值[4]。

2.4阈值分割

将图像像素点分类,在本项目中可以区分目标物体斑马线和其他干扰干扰因素,在本项目中能显著提升斑马线识别率。

2.5形态学运算腐蚀和膨胀

形态学的运算一般用于灰度化图片中目标白色物体的识别中,腐蚀可以使白色物体“变瘦”,膨胀可以使白色物体“变胖”,在形态学运算中先腐蚀后膨胀可以消除原图片中白色杂质[5],并通过膨胀操作来扩大目标斑马线的形态提高识别率,本项目识别为代码运行效果图如下图3展现:

2.6完整代码和运行效果

import cv2

import numpy as np

kernel_Ero = np.ones((3,1),np.uint8)

kernel_Dia = np.ones((5,1),np.uint8)

img = cv2.imread("E:\\car\\6.JPG")

copy_img = img.copy()

copy_img = cv2.resize(copy_img,(1600,800))

cv2.imshow('copy_img',copy_img)

cv2.waitKey(0)

# 图像灰度化

gray=cv2.cvtColor(copy_img,cv2.COLOR_BGR2GRAY)

cv2.imshow('gray',gray)

cv2.waitKey(0)[5]

# 高斯滤波

imgblur=cv2.GaussianBlur(gray,(5,5),10)

cv2.imshow('imgblur',imgblur)

cv2.waitKey(0)

#阈值处理

ret,thresh=cv2.threshold(imgblur,200,255,cv2.THRESH_BINARY)

cv2.imshow('thresh',thresh)

cv2.waitKey(0)[6]

#腐蚀

img_Ero=cv2.erode(thresh,kernel_Ero,iterations=3)

cv2.imshow('img_Ero',img_Ero)

cv2.waitKey(0)

#膨胀

img_Dia=cv2.dilate(img_Ero,kernel_Dia,iterations=1)

cv2.imshow('img_Dia',img_Dia)

cv2.waitKey(0)

#轮廓检测

contouts,h = cv2.findContours(img_Dia,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

cnt = contouts

# img=cv2.drawContours(copy_img, cnt, -1, (0, 255, 0), 2)

# cv2.imshow('img',img)

# cv2.waitKey(0)

for i in cnt:

#坐标赋值

x,y,w,h = cv2.boundingRect(i)

print(x,y,w,h)

if x>1000 and w>50 and h>10:

out=cv2.drawContours(copy_img,i,-1,(0,255,0),3)

cv2.imshow('out',out)

cv2.waitKey(0)

最终运行效果如下图3中所示,整个测试过程中,识别大约在10秒内,虽然检测环境中斑马线的轮廓一点也不完整,且周围受外部环境如交通标志,行人车辆等干扰因素大,但仍可以正确识别,可见,该算法可大大提升斑马线识别率:

1668321006290

图3.最终识别效果图

  1. 提高红绿灯识别率的方法

3.1红绿灯识别原理

识别红绿灯的原理是RGB和HSV两个空间,所谓RGB空间:通常指拍摄的图像颜色空间,图片的像素点是由R、G、B分量来表示肉眼所看到的颜色,比如:红色为(255,0,0),黄色为(255,255,0),绿色(0,255,0)。

进行红绿灯识别时,需要转换到HSV空间:H(色调)、S(饱和度)、V(亮度)来进行信号灯识别,HSV空间更便于由亮度对信号灯区域进行识别。

3.2 ROI识别与操作

在图像识别中,我们可以通过设置自己感兴趣的的目标区域(ROI region of interest),直接简单获取目标,也就是通过圈定目标区域的重点进行读取,减少识别和处理时间,增加图片识别率,其代码如下:

ROI = img[]

   cv2.namedWindow("ROI",)

   cv2.resizeWindow("ROI",)

   cv2.imshow("ROI", ROI)[7]

3.3完整代码及运行效果

import cv2

import numpy as np

   import glob

# 图片批量处理,并读取

a=0;

for files in glob.glob(r'D:\pycharm\*.jpeg'):

   img = cv2.imread(files)

   a=a+1;

   # 读取图片:注意imread读的图是RGB格式的

   # 显示原图

   cv2.imshow("红绿灯", img)

   #显示ROI区域:这个区域是在原图中截取的

   ROI = img[400:500, 560:720]

   cv2.namedWindow("ROI", 0)

   cv2.resizeWindow("ROI", 400, 300)

   cv2.imshow("ROI", ROI)

   # 等待显示

   cv2.waitKey(0)

   cv2.destroyAllWindows()

   # 把截取的图片另存

   cv2.imwrite('D:\pycharm\save_test'+str(a)+'.jpg', ROI)

   hsv = cv2.cvtColor(ROI, cv2.COLOR_BGR2HSV)

   # 红色hsv颜色分量范围

   lb_hsv_red = np.array([125, 49, 138])

   up_hsv_red = np.array([180, 255, 255])

   mask_red = cv2.inRange(hsv, lowerb=lb_hsv_red, upperb=up_hsv_red)[8]

   # 中值滤波,去除噪点

   red_blur = cv2.medianBlur(mask_red, 7)

   #取最大值255

   r_color = np.max(red_blur)

   # 绿色hsv颜色分量范围

   lb_hsv_g = np.array([49, 79, 137])

   up_hsv_g = np.array([90, 255, 255])

   mask_g = cv2.inRange(hsv, lowerb=lb_hsv_g, upperb=up_hsv_g)

   # 中值滤波,去除噪点

   g_blur = cv2.medianBlur(mask_g, 7)

   #取最大值255

   g_color = np.max(g_blur)

   # 黄色hsv颜色分量范围

   lb_hsv_y = np.array([11, 67, 127])

   up_hsv_y = np.array([34, 255, 255])

   mask_y = cv2.inRange(hsv, lowerb=lb_hsv_y, upperb=up_hsv_y)

   # 中值滤波,去除噪点

   y_blur = cv2.medianBlur(mask_y, 7)

   #取最大值255

   y_color = np.max(y_blur)

   # 判断

   if r_color == 255:

       print('红灯亮')

  # 因为图像是二值的图像,所以如果图像出现白点,也就是255,也就是红色

   elif g_color == 255:

       print('绿灯亮')

  # 因为图像是二值的图像,所以如果图像出现白点,也就是255,也就是绿色

   elif y_color == 255:

       print('黄灯亮')

  # 因为图像是二值的图像,所以如果图像出现白点,也就是255,也就是黄色

   else:

       print('都不是')

   #调整显示窗口大小

   cv2.namedWindow("red_hsv", 0)

   cv2.resizeWindow("red_hsv", 400, 300)

   cv2.namedWindow("green_hsv", 0)

   cv2.resizeWindow("green_hsv", 400, 300)

   cv2.namedWindow("yellow_hsv", 0)

   cv2.resizeWindow("yellow_hsv", 400, 300)

   # 显示

   cv2.imshow("red_hsv", mask_red)

   cv2.imshow("green_hsv", mask_g)

   cv2.imshow("yellow_hsv", mask_y)

   cv2.waitKey(0)

   cv2.destroyAllWindows()

上述代码运行的效果图分别由下图4,5中所示:

6f9f02b67bd5bb318aa4606b277450e

图4.原视频所截取的信号灯

288eb0d285d4aff7c0855e0e1ea702b

图5.对识别的结果进行输出反馈

  1. 远程通讯仿真

4.1远程通信原理及实施流程

本项目通过ALIENTEK精英STM32开发板在keilμVison5虚拟仿真软件和XCOM V2.0模拟远程通讯软件实现串口和上位机的信息反馈,理想的远程通讯是:与上位机相连的STM32开发板的串口接收到盲人发来的消息后,将信号反馈给上位机。

理想中的实施流程和串口远程通信示意图如下流程图6所示。

wps图6.本项目理想中的实施流程

4.2 仿真操作流程流程及运行效果

首先我们将本项目需要用到的串口USART1与电脑的USB接口通过跳线帽相连接,这里将P3的PA9与RXD(接受外部数据的引脚)相连,PA10与TXD(发送外部数据的引脚)相连,连接图如下图10所示。随后通过新建工程文件、调用库函数、编写主程序和相应的子程序、编译工程文件、下载程序到开发板中和调试完成仿真。运行效果如下图7中所示,假设盲人身处离笔记本电脑的远程环境中,在智能背包连接的盲人键盘输入信息“上海工程技术大学”,与笔记本电脑相连的STM32开发板上串口接收消息LED信号灯闪烁后会立刻将信息反馈到主屏幕,当盲人按回车键,发送消息会结束。

65d57e78bdfd4215d9d618ce317f782

图7.远程通信仿真效果图

5.远程定位GPS功能和远程语言交流的实现

5.1 GPS定位原理

GPS系统定位的基本原理是利用卫星测距交会确定点位,并让GPS接收机的可能位置构成一个球面[9];当使用两颗卫星探测GPS的接收器位置时,GPS的接收器所有可能位置即为两个球面的重合部分—圆,依次类推,加入第三颗卫星时,GPS的接受器位置轨迹为两个点,加入第四颗或四颗以上卫星,可将GPS的位置精确到一个具体点。

5.2 远程定位数据追踪实现方法

首先我们需要通过购置GPS定位模块进行组装连接并插入SIM移动流量卡使目标定位追踪器运行,然后我们打开手机or电脑蓝牙与定位追踪器连接并将追踪器和各大地图软件相连,从而可以通过观察电脑设备可了解盲人所在的精确位置,本项目中,我方不仅实现了盲人出行时的远程定位,也可以通过购置后组装的GPS模块观察盲人的行踪轨迹和行走状态等,项目运行效果如下图8所示:

d7b6a81c3532f1da0a91417a5e86e20

图8.GPS定位模块运行效果图

6.总结

本项目在斑马线识别上采用了基于Python Opencv的图像处理语句,对于红绿灯识别中,基于了红绿灯识别的RGB转HSV空间原理,并采用了便捷好用,对CPU配置要求不高的ROI识别,提高两者识别率以优化便可辅助盲人们在路口同行。同时,我方在学习了串口远程通信原理后用STM32开发板在keil软件的开发环境下用c语言进行串口的通信编程,实现了盲人与远程检测者的打字通信仿真。并学习了GPS定位原理后购置GPS定位模块,与地图软件相连,使远程监测者可以远程定位盲人所在位置同时远程观察盲人的行动路程轨迹,实现真正意义上的数据追踪。我方希望计划后期搭建神经网络建立红绿灯和斑马线的数据库训练集[10]以进一步提高红绿灯和斑马线识别率,借此可以进一步帮助盲人路口的通信辅助和数据追踪。

7.参考文献

[1] 工程教育专业认证背景下数字电子技术课程改革探索与实践——以倒计时交通灯项目设计为例[J].电子制作,2021(8).

[2] OAK中国.用AI导盲背包替代导盲犬?用OAK相机做的这款方案值得围观[J].OAK运用指南,2022(3).

[3] 程晨.掌握Python人工智能之机器视觉[M].北京:科学出版社,2021.53.

[4] 张德丰.Python计算机视觉实战[M].北京:清华大学出版社,2021.88.

[5] 李立宗.OpenCV轻松入门面向Python[M].北京:电子工业出版社,2021.64.

[6] Joe Minichino.Joseph Howse.OpenCV3计算机视觉Python语言实现

vision with Python[M].北京:机械工业出版社,2016.86.

[7] 吴鹏飞;常君明.基于计算机视觉的标签定位检测[J].江汉大学学报(自然科学版),2018(4):71-73.

[8] 谭思奇.关于交通信号灯检测和识别综述[D].重庆交通大学,2021,12-16.

[9] 邱致和.王万义.GPS原理与应用[M].北京:电子工业出版社,2002(4).

[10] Kazemi V. Sullivan J. One Millisecond Face Alignment with an Ensemble of Regression Trees[D].IEEE:Computer Vision and Pattern Recognition,

2014:1867-1874.