强化学习系列文章(二十三):AirSim Python API图像与图像处理

参考网址:https://microsoft.github.io/AirSim/image_apis/#segmentation

1.simGetImage函数

使用0号相机得到单张图像。返回值是PNG格式的图像。

import airsim #pip install airsim# for car use CarClient()
client = airsim.MultirotorClient()png_image = client.simGetImage("0", airsim.ImageType.Scene)
# do something with image

2.simGetImages函数

simGetImages函数提供了更多可能性,如选择不同相机位置,得到不同类型图像等等,例如单通道的浮点数图像或者三通道的uint8图像。

import airsim #pip install airsim# for car use CarClient()
client = airsim.MultirotorClient()responses = client.simGetImages([# png formatairsim.ImageRequest(0, airsim.ImageType.Scene),  # 相机名称,图像类型,是否浮点数,是否压缩图像(默认压缩)# uncompressed RGB array bytesairsim.ImageRequest(1, airsim.ImageType.Scene, False, False),# floating point uncompressed imageairsim.ImageRequest(1, airsim.ImageType.DepthPlanner, True)])# do something with response which contains image data, pose, timestamp etc

ImageRequest函数源代码:

class ImageRequest(MsgpackMixin):camera_name = '0'image_type = ImageType.Scenepixels_as_float = Falsecompress = Falsedef __init__(self, camera_name, image_type, pixels_as_float = False, compress = True):# todo: in future remove str(), it's only for compatibility to pre v1.2self.camera_name = str(camera_name)self.image_type = image_typeself.pixels_as_float = pixels_as_floatself.compress = compress

常用的ImageType有:

airsim.ImageType.Scene                # = 0 最普通的场景,主界面的图像
airsim.ImageType.DepthPlanner         # = 1
airsim.ImageType.DepthPerspective     # = 2
airsim.ImageType.DepthVis             # = 3 景深图像
airsim.ImageType.DisparityNormalized  # = 4
airsim.ImageType.Segmentation         # = 5 目标分割图像
airsim.ImageType.SurfaceNormals       # = 6
airsim.ImageType.Infrared             # = 7

3.AirSim图像转Numpy格式

首先获取无压缩的图像,并按如下方式转成Numpy:

responses = client.simGetImages([airsim.ImageRequest("0", airsim.ImageType.Scene, False, False)]) # 第2个False表示不压缩
response = responses[0]# get numpy array
img1d = np.fromstring(response.image_data_uint8, dtype=np.uint8) # reshape array to 4 channel image array H X W X 4
img_rgb = img1d.reshape(response.height, response.width, 3)# original image is fliped vertically
img_rgb = np.flipud(img_rgb)# write to png
airsim.write_png(os.path.normpath(filename + '.png'), img_rgb)

4.不同ImageType之含义

可用的ImageType如上所述,一共有8种,分别是:

Scene = 0,
DepthPlanner = 1,
DepthPerspective = 2,
DepthVis = 3,
DisparityNormalized = 4,
Segmentation = 5,
SurfaceNormals = 6,
Infrared = 7

下面分别介绍其含义。

4.1 DepthPlanner & DepthPerspective

通常设置pixels_as_float = true 以及ImageType = DepthPlannerImageType = DepthPerspective 来得到浮点数的深度图像。根据官方文档的介绍,这两种深度图像似乎是计算景深的方式不一样,DepthPlanner似乎是以摄像机所在平面为基准来计算景深的,而DepthPerspective似乎是以摄像机镜头(一个点)为基准来计算景深的。但是我对计算成像学的了解太过浅薄,具体含义请参见https://microsoft.github.io/AirSim/image_apis/#depthplanner-and-depthperspective。

4.2 DepthVis

使用ImageType=DepthVis表示:输出的景深图像的每一个像素值都表示该像素点距离摄像机所处平面的距离,单位是米。即,越白表示距离越远,纯白表示100m或100m开外;越黑表示距离越近,纯黑表示距离0m。

4.3 DisparityNormalized

通常可以采用pixels_as_float = true 以及ImageType = DisparityNormalized的设置来得到归一化的浮点数图像,也就是每个像素取值为[0,1][0,1][0,1]。归一化公式(Xl - Xr)/Xmax,不过没看懂。

4.4 Segmentation

ImageType = Segmentation可以得到对当前场景进行真实分割的图像。AirSim通过为场景中的每一个格点(Mesh)赋以[0,255]的值来实现分割功能。每一个值都对应一个RGB颜色,对照表参见https://microsoft.github.io/AirSim/seg_rgbs.txt。

另外还可以用如下代码修改某个格点对应的ObjectID号:

success = client.simSetSegmentationObjectID("Ground", 20);

获取目标分割图像的推荐代码如下,注意不要压缩图像,即ImageRequest的第二个False

responses = client.simGetImages([ImageRequest(0, AirSimImageType.Segmentation, False, False)])
img1d = np.fromstring(response.image_data_uint8, dtype=np.uint8) #get numpy array
img_rgb = img1d.reshape(response.height, response.width, 3) #reshape array to 3 channel image array H X W X 3
img_rgb = np.flipud(img_rgb) #original image is fliped vertically#find unique colors
print(np.unique(img_rgb[:,:,0], return_counts=True)) #red
print(np.unique(img_rgb[:,:,1], return_counts=True)) #green
print(np.unique(img_rgb[:,:,2], return_counts=True)) #blue

4.5 Infrared(红外图像)

在目前,所谓的红外线图像,只是将ObjectID映射到[0,255]的像素值,例如,ObjectID=42,则该像素点被映射为(42,42,42)。 有关如何设置ObjectID的更多详细信息,请参见Segmentation部分。 通常可以添加噪声应用于此图像类型,以获得稍微更逼真的效果。 AirSim团队仍在开发其他红外伪像的图像功能,所以该图像类型还不太完善。

5.选择摄像机

通过不同的名字可以选择不同方位的摄像机摄取图像。如front_centerfront_rightfront_leftbottom_centerback_center。也可以用01234来代替上述字符串。

6.“计算机视觉”模式

在AirSim中可以使用所谓的“计算机视觉”模式,也就是关闭物理引擎,关闭载具,只保留摄像机,可以使用方向键控制摄像机来回移动,并保存图像。在我的Ubuntu18.04操作系统中,在/home/xxx/Documents/AirSim/settings.json中,添加:

{"SettingsVersion": 1.2,"SimMode": "ComputerVision"
}

就可以打开“计算机视觉“模式,下面是一份操作”计算机视觉“模式的示例代码。

import setup_path
import airsimimport pprint
import os
import time
import math
import tempfilepp = pprint.PrettyPrinter(indent=4)client = airsim.VehicleClient()
client.confirmConnection()airsim.wait_key('Press any key to set camera-0 gimbal to 15-degree pitch')
camera_pose = airsim.Pose(airsim.Vector3r(0, 0, 0), airsim.to_quaternion(math.radians(15), 0, 0)) #radians
client.simSetCameraPose("0", camera_pose)airsim.wait_key('Press any key to get camera parameters')
for camera_name in range(5):camera_info = client.simGetCameraInfo(str(camera_name))print("CameraInfo %d:" % camera_name)pp.pprint(camera_info)# 创建保存图像的文件夹
tmp_dir = os.path.join(tempfile.gettempdir(), "airsim_cv_mode")
print ("Saving images to %s" % tmp_dir)
try:os.makedirs(tmp_dir)
except OSError:if not os.path.isdir(tmp_dir):raiseairsim.wait_key('Press any key to get images')
for x in range(3): # do few timesz = x * -20 - 5 # some random numberclient.simSetVehiclePose(airsim.Pose(airsim.Vector3r(z, z, z), airsim.to_quaternion(x / 3.0, 0, x / 3.0)), True)responses = client.simGetImages([airsim.ImageRequest("0", airsim.ImageType.DepthVis),airsim.ImageRequest("1", airsim.ImageType.DepthPerspective, True),airsim.ImageRequest("2", airsim.ImageType.Segmentation),airsim.ImageRequest("3", airsim.ImageType.Scene),airsim.ImageRequest("4", airsim.ImageType.DisparityNormalized),airsim.ImageRequest("4", airsim.ImageType.SurfaceNormals)])for i, response in enumerate(responses):filename = os.path.join(tmp_dir, str(x) + "_" + str(i))if response.pixels_as_float:print("Type %d, size %d, pos %s" % (response.image_type, len(response.image_data_float), pprint.pformat(response.camera_position)))airsim.write_pfm(os.path.normpath(filename + '.pfm'), airsim.get_pfm_array(response))else:print("Type %d, size %d, pos %s" % (response.image_type, len(response.image_data_uint8), pprint.pformat(response.camera_position)))airsim.write_file(os.path.normpath(filename + '.png'), response.image_data_uint8)pose = client.simGetVehiclePose()pp.pprint(pose)time.sleep(3)# currently reset() doesn't work in CV mode. Below is the workaround
client.simSetVehiclePose(airsim.Pose(airsim.Vector3r(0, 0, 0), airsim.to_quaternion(0, 0, 0)), True)

7.设置摄像机参数和图像参数

同样是修改settings.json文件,可以修改AirSim摄像机保存图像的尺寸等参数。示例如下:

{"SettingsVersion": 1.2,"CameraDefaults": {"CaptureSettings": [{"ImageType": 0,"Width": 256,"Height": 144,"FOV_Degrees": 90,"AutoExposureSpeed": 100,"MotionBlurAmount": 0}]},"SimMode": "ComputerVision"
}

settings.json可以控制的参数非常之多,具体请参见https://microsoft.github.io/AirSim/settings/。

强化学习系列文章(二十三):AirSim Python API图像与图像处理相关推荐

  1. 强化学习系列文章(二十七):VPG+Beta分布在CartPoleContinuous环境中的应用

    强化学习系列文章(二十七):VPG+Beta分布在CartPoleContinuous环境中的应用 在第七篇笔记(https://blog.csdn.net/hhy_csdn/article/deta ...

  2. 强化学习系列文章(二十八):进化强化学习EvoRL的预实验

    强化学习系列文章(二十八):进化强化学习EvoRL的预实验 最近在研究强化学习解决离散空间的组合优化问题时,接触到了很多进化算法,实际体验也是与RL算法不相上下.进化算法也常用于优化神经网络的参数,C ...

  3. Reinforcement Learning强化学习系列之二:MC prediction

    引言 这几个月一直在忙找工作和毕业论文的事情,博客搁置了一段时间,现在稍微有点空闲时间,又啃起了强化学习的东西,今天主要介绍的是强化学习的免模型学习free-model learning中的最基础的部 ...

  4. RTKLIB2.4.3中一些问题的修复---RTKLIB学习系列文章(二)

    RTKLIB2.4.3中一些问题的修复 1 RTKPLOT的Map View 和 NTRIP Browser无法正常工作 问题详情: 地图视图没有响应或在RTKLIB/bin/leaflet/leaf ...

  5. 强化学习系列之翻译OpenAI用户手册(一)

    强化学习系列文章 第一章 强化学习入门 第二章 翻译OpenAI用户手册(一) 第三章 翻译OpenAI用户手册(二) 第四章 翻译OpenAI用户手册(三) 目录 用户手册 1.简介 1.1 这是什 ...

  6. 强化学习系列(一):强化学习简介

    一.强化学习是什么? 首先,我们思考一下学习本身,当一个婴儿在玩耍时可能会挥舞双手,左看右看,没有人来指导他的行为,但是他和外界直接通过了感官进行连接.感知给他传递了外界的各种信息,包括知识等.学习的 ...

  7. 强化学习系列(十三):Policy Gradient Methods

    这是PG的基础篇,在深度强化学习系列中,有结合例子和监督学习的深刻理解PG的进阶篇. 一.前言 之前我们讨论的所有问题都是先学习action value,再根据所得的action value 来选择a ...

  8. spring配置文件_SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件...

    SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件 一.概述 Spring Boot允许多种配置来源,官网是这样说的: Spring Boot使用一种非常特殊的Property ...

  9. Docker系列(二十三)——Docker实例五Docker安装MongoDB实例

    < Docker实例三Docker安装MongoDB实例 > 前言 在前面一篇文章种,完成了 < Docker安装MySQL实例 >,本篇将继续镜像安装教程,并完成Docker ...

最新文章

  1. R语言使用pwr包的pwr.f2.test函数对线性回归模型(Linear models)进行效用分析(power analysis)的语法
  2. android自定义水波纹,Android自定义View——实现水波纹效果类似剩余流量球(示例代码)...
  3. 理解标准输出流方法:WriteLine和Write
  4. 十进制与二进制八进制十六进制的相互转换
  5. JQuery 插件之Ajax Autocomplete(ajax自动完成)
  6. VLAN的分类与实验
  7. UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测
  8. Java程序性能优化:让你的Java程序更快、更稳定
  9. 倾斜摄影——3维建模软件PhotoScan教程(附安装包+教学视频)
  10. web项目缺少web组件才能与vs一起运行,带razor语法的 asp.net web pages 2.0.0.1
  11. regester正则用法_Regester(正则表达式测试器)官方版
  12. python 键盘输入负数_python输入负数
  13. 如何批量下载知乎回答图片
  14. 实习期间的一些思考整理(1)2018.4.8~4.9
  15. Java23种设计模式——2.创建型模式之原型模式
  16. Linux 串口终端kermit安装和使用
  17. 2022年武汉市人工智能领域技术成果征集内容及申报条件
  18. python 词云 教程
  19. PyCharm代码格式化插件
  20. win10系统怎么无线连接投影仪,win10笔记本无线连接

热门文章

  1. 宠物、计划生育、宜特居
  2. 此数据库没有有效所有者,因此无法安装数据库关系图支持对象--解决办法
  3. Android中通过访问本地相册或者相机设置用户头像
  4. Ubuntu 20.04 VNC server 搭建及客户端访问
  5. VS项目中目录结构混乱
  6. 我的世界手机版制作服务器指令大全,我的世界手机版服务器指令大全(18)
  7. 软件测试一般流程及方法
  8. 【转】关于手机号注册的一些思考
  9. html与css中em怎么用,css中em什么意思
  10. 基于javaweb的调查问卷管理系统(java+springboot+vue+elementui+mysql)