在本篇文章中,我们将利用在 Carla自动驾驶仿真环境 2 – 用Python跟仿真环境交互中学到的知识做一个很有趣的小项目,那就是利用摄像头传感器采集回来的图像,从图像中识别出汽车,并用蓝色的框框出来,然后在我们安装摄像头的汽车的不停的移动中,实时输出当前看到的图像,并标记图像中的汽车。
使用Carla库创建客户端并连接到服务器,然后我们加载名为Town02的地图并获得world对象,为了提高识别率方便演示,我们将天气设置为晴朗无云的白天。
|
|
有了world对象有,我们就可以从蓝图库从找到我们需要用到的演员了,在这个项目中,我们需要一台安装有摄像头的车,我们选择了特斯拉Model 3作为我们的试验车,并加载了一个RGB摄像头的蓝图。
|
|
如上一篇文章中介绍,蓝图提供了Actor目标,因此我们可以针对性的进行一些属性配置,比如我们将model3的颜色设置成了(255,255,255)即白色。另外,我们把摄像头采集到的图像尺寸设置为1028x720。
接下来,就可以使用蓝图来生成试验车了。
|
|
我们利用numpy的随机函数,随机选择了一个可能的汽车生成点,并在该位置生成白色的Model 3。而摄像头camera则是附着在Model 3上边的,提供的位置为摄像头在Model 3这台车的坐标系的位置,x轴代表前后,y轴为左右,z轴代表上下,x=0, y=0, z=0 在车子底盘中心位置,而我们使用的x=-5.5, z=2.5的位置在车子的后上方(并通过角度指定,实现类似于赛车游戏中的第三视角)。
根据 Carla自动驾驶仿真环境 2 – 用Python跟仿真环境交互 的介绍,摄像头的图像将通过listen函数绑定的回调函数获得,那么如果我们想利用摄像头的图像来识别路上的车子,则需要在该回调函数中实现我们的算法。
我们给摄像头添加了一个名为parse_image的回调函数,回调函数的参数就是摄像头采集到的数据,数据的raw_data属性是一个一维的数据缓存,因为图片数据实质上是一个大的矩阵,根据官方文档raw_date的数据类型是bytes,代表的是Array of BGRA 32-bit pixels,也就是说针对一个像素点,它有4个值,即BGRA,除了3原色外,A代表_alpha channel_,意思是该像素点的透明度,我们目前拿到的所有像素点的A值都是255,即不透明,在后续的处理中,我们要删除掉这一值。
为了能够对raw_data进行操作,我们先将其转换为一个numpy array,并将一维数组转换为一般图像的矩阵表示,对于我们1028x720的尺寸,该矩阵的形状为:1028x720x3,即1028x720个 像素点,每个像素点有RGB三种颜色的不同强度。
|
|
有了图像数据以后,就可以对图像中的车辆进行识别了,我们使用opencv中的haarcascades算法进行车辆识别,haarcascades算法需要通过大量的带有标签的数据来训练模型,我们这里提供了一个已经训练好的模型(训练好的模型文件为xml格式),模型的GitHub仓库在这里:https://github.com/duyetdev/opencv-car-detection,大家可以直接加载这个模型。
为了提高运算效率,我们使用了灰度的图像数据作为模型的输入(灰度图像,相当于把RBG 3维的数据转换为了1维的黑白数据,可以大量的降低复杂度,提高模型训练和识别速度)。
最后,通过Car_Cascade识别出来的车辆的坐标会存放在Cars里边,如果有多台车,则Cars里边存放的是一个列表。
在 Carla自动驾驶仿真环境 2 – 用Python跟仿真环境交互 中,我们提供了从Carla服务器UI来观察车辆的方式,但其实,那并不是一个很好的方法,而且还需要引入一个观察者,一个更好的做法是,直接观察某个摄像头采集回来的图像。
我们本篇文章中的项目同时还想要在图像上标记被识别的车辆,用Carla服务器UI加观察者的方法是没办法实现的。
|
|
通过上述代码,我们使用opencv提供的imshow方法可以将一个图像显示出来,在显示摄像头采集到的图像之前,如果图像中有汽车的话,我们需要通过rectangle方法在该图像上有车的位置画上蓝色的框。
最后,waitKey方法用于检测用户是否按下了q键(代表退出),如果有q键被按下则退出程序,防止程序一直在循环运行。
到这里,我们的代码就全部写完了,可以运行看看效果了。如下边视频所示,整个运行的效果还是很不错的,读者可以通过这样一个简单的小项目来熟练对Carla的的使用。
熟练了以后,可以组合利用Carla提供的其他各种传感器实现更多更复杂的算法,满足工作,科研和学习需求。
本文中使用到的代码放置在GitHub仓库:https://github.com/pythonlibrary/carla-tutorials,文件名为:tutorial-3.py
Python之所以如此流行,在于它有强大的生态,使用各种各种的库可以帮助用户最快速的解决问题。Python酷致力于输出高质量的Python库相关教程及技术性文章,帮助用户更好更快速的解决问题