airsim-使用Image api保存机载摄像机的图片

使用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 array
    airsim.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):
        raise

for 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 format
        print("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 array
        print("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))
        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 4 channel image array H X W X 3
        cv2.imwrite(os.path.normpath(filename + '.png'), img_rgb) # write to png

对代码的部分解释:

  1. client.simSetSegmentationObjectID("[\w]*", 12, True)

    这个函数是对于分割图来说的,如果你没有用到分割图,就可以删掉这个函数。

    这句话的意思是对所有的物体的分割ID 全部设置为12,每个id都对应一个颜色

  2. airsim.ImageRequest函数

    (相机ID,图片类型,是否使用pixels_as_float(pfm格式),是否使用压缩图片)

  3. 相机ID

    front_center,0

    front_right,1

    front_left,2

    bottom_center,3

    back_center,4

  4. 图片类型

    Scene=0; 彩色图

    DepthPlanner=1; 深度图

    DepthPerspective = 2;

    DepthVis = 3

    DisparityNormalized = 4

    Segmentation = 5 分割图

    SurfaceNormals = 6 三维重建图

    Infrared = 7 红外图

你可能感兴趣的:(工程类)