airsim
使用python编程,将飞机上携带的摄像机的图片保存下来。
首先完成我的上一篇文章airsim手动控制无人机
.
在Epicgame Editor中点击运行后,然后在spyder
编译器中运行如下代码:
python代码如下:
# manul UAV
import airsim
import os
import time
import tempfile
import numpy as np
import cv2# connect to the airsim simulator
client = airsim.MultirotorClient()
client.confirmConnection()# setup segmentation
found = client.simSetSegmentationObjectID("[\w]*", 12, True); # --- all objectID = 12 color=[242, 107, 146]
found = client.simSetSegmentationObjectID("UAV[\w]",19,True); # all UAV objectID = 19 color=[0, 53, 65]# initialize the UAV
name = "UAV"+str(1)
client.enableApiControl(True,name)
client.armDisarm(True,name)time.sleep(2)# take images
# get camera images from the car
responses = client.simGetImages([#airsim.ImageRequest("0", airsim.ImageType.DepthVis), #depth visualization image#airsim.ImageRequest("1", airsim.ImageType.DepthPerspective, True), #depth in perspective projection#airsim.ImageRequest("1", airsim.ImageType.Scene), #scene vision image in png format#airsim.ImageRequest("1", airsim.ImageType.Scene, False, False) #scene vision image in uncompressed RGBA arrayairsim.ImageRequest("0",airsim.ImageType.Scene, True, True)])print('Retrieved images: %d' % len(responses))tmp_dir = os.path.join(os.getcwd(), "picture")
print ("Saving images to %s" % tmp_dir)
try:os.makedirs(tmp_dir)
except OSError:if not os.path.isdir(tmp_dir):raisefor idx, response in enumerate(responses):filename = os.path.join(tmp_dir, str(idx))if response.pixels_as_float:print("Type %d, size %d" % (response.image_type, len(response.image_data_float)))airsim.write_pfm(os.path.normpath(filename + '.pfm'), airsim.get_pfm_array(response))elif response.compress: #png formatprint("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))airsim.write_file(os.path.normpath(filename + '.png'), response.image_data_uint8)else: #uncompressed arrayprint("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))img1d = np.fromstring(response.image_data_uint8, dtype=np.uint8) # get numpy arrayimg_rgb = img1d.reshape(response.height, response.width, 3) # reshape array to 4 channel image array H X W X 3cv2.imwrite(os.path.normpath(filename + '.png'), img_rgb) # write to png
对代码的部分解释:
-
client.simSetSegmentationObjectID("[\w]*", 12, True)
这个函数是对于分割图来说的,如果你没有用到分割图,就可以删掉这个函数。
这句话的意思是对所有的物体的分割ID 全部设置为12,每个id都对应一个颜色
-
airsim.ImageRequest函数
(相机ID,图片类型,是否使用pixels_as_float(pfm格式),是否使用压缩图片)
-
相机ID
front_center,0
front_right,1
front_left,2
bottom_center,3
back_center,4
-
图片类型
Scene=0; 彩色图
DepthPlanner=1; 深度图
DepthPerspective = 2;
DepthVis = 3
DisparityNormalized = 4
Segmentation = 5 分割图
SurfaceNormals = 6 三维重建图
Infrared = 7 红外图
airsim
使用python编程,将飞机上携带的摄像机的图片保存下来。
首先完成我的上一篇文章airsim手动控制无人机
.
在Epicgame Editor中点击运行后,然后在spyder
编译器中运行如下代码:
python代码如下:
# manul UAV
import airsim
import os
import time
import tempfile
import numpy as np
import cv2# connect to the airsim simulator
client = airsim.MultirotorClient()
client.confirmConnection()# setup segmentation
found = client.simSetSegmentationObjectID("[\w]*", 12, True); # --- all objectID = 12 color=[242, 107, 146]
found = client.simSetSegmentationObjectID("UAV[\w]",19,True); # all UAV objectID = 19 color=[0, 53, 65]# initialize the UAV
name = "UAV"+str(1)
client.enableApiControl(True,name)
client.armDisarm(True,name)time.sleep(2)# take images
# get camera images from the car
responses = client.simGetImages([#airsim.ImageRequest("0", airsim.ImageType.DepthVis), #depth visualization image#airsim.ImageRequest("1", airsim.ImageType.DepthPerspective, True), #depth in perspective projection#airsim.ImageRequest("1", airsim.ImageType.Scene), #scene vision image in png format#airsim.ImageRequest("1", airsim.ImageType.Scene, False, False) #scene vision image in uncompressed RGBA arrayairsim.ImageRequest("0",airsim.ImageType.Scene, True, True)])print('Retrieved images: %d' % len(responses))tmp_dir = os.path.join(os.getcwd(), "picture")
print ("Saving images to %s" % tmp_dir)
try:os.makedirs(tmp_dir)
except OSError:if not os.path.isdir(tmp_dir):raisefor idx, response in enumerate(responses):filename = os.path.join(tmp_dir, str(idx))if response.pixels_as_float:print("Type %d, size %d" % (response.image_type, len(response.image_data_float)))airsim.write_pfm(os.path.normpath(filename + '.pfm'), airsim.get_pfm_array(response))elif response.compress: #png formatprint("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))airsim.write_file(os.path.normpath(filename + '.png'), response.image_data_uint8)else: #uncompressed arrayprint("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))img1d = np.fromstring(response.image_data_uint8, dtype=np.uint8) # get numpy arrayimg_rgb = img1d.reshape(response.height, response.width, 3) # reshape array to 4 channel image array H X W X 3cv2.imwrite(os.path.normpath(filename + '.png'), img_rgb) # write to png
对代码的部分解释:
-
client.simSetSegmentationObjectID("[\w]*", 12, True)
这个函数是对于分割图来说的,如果你没有用到分割图,就可以删掉这个函数。
这句话的意思是对所有的物体的分割ID 全部设置为12,每个id都对应一个颜色
-
airsim.ImageRequest函数
(相机ID,图片类型,是否使用pixels_as_float(pfm格式),是否使用压缩图片)
-
相机ID
front_center,0
front_right,1
front_left,2
bottom_center,3
back_center,4
-
图片类型
Scene=0; 彩色图
DepthPlanner=1; 深度图
DepthPerspective = 2;
DepthVis = 3
DisparityNormalized = 4
Segmentation = 5 分割图
SurfaceNormals = 6 三维重建图
Infrared = 7 红外图