【AirSim】图像API的使用
参考链接: 【AirSim】
具体效果可以关注博主的小红书: 42891122102,上面有效果视频
一、基本信息与AirSim图像API的简单demo
Image API.py
import airsim
import numpy as np
import cv2
# 连接到AirSim模拟器
client = airsim.MultirotorClient()
client.confirmConnection()
# 一次获取一张图片
# response = client.simGetImage(camera_name, image_type, vehicle_name='')
# 无人机摄像头编号及含义(camera_name)
'''
摄像机0:无人机的前方视角
摄像机1:无人机的后方视角
摄像机2:无人机的底部视角,可以用于检测地面和障碍物
摄像机3:无人机的顶部视角,可以用于拍摄俯视图或进行目标跟踪
摄像机4:无人机的左侧视角
摄像机5:无人机的右侧视角
'''
# 使用图像API能够获取到的8种图像类型
'''
Scene:场景视图图片,即俯视图,可以看到整个场景的情况。 airsim.ImageType.Scene
DepthPlanar:平面深度图片,可以获取场景中每个像素点到相机的距离。 airsim.ImageType.DepthPlanar
DepthPerspective:透视深度图片,可以获取场景中每个像素点到相机的距离。 airsim.ImageType.DepthPerspective
DepthVis:深度可视化图片,可以将深度图像转换为RGB图像,方便观察。 airsim.ImageType.DepthVis
DisparityNormalized:视差归一化图片,可以获取场景中每个像素点的视差值,用于计算深度信息。 airsim.ImageType.DisparityNormalized
Segmentation:分割图片,可以将场景中的不同物体或区域分别标记出来,方便进行目标检测和分割。 airsim.ImageType.Segmentation
SurfaceNormals:表面法线图片,可以获取场景中每个像素点的法线方向,用于计算光照和阴影效果。 airsim.ImageType.SurfaceNormals
Infrared:红外线图片,可以获取场景中的红外线图像,用于热成像和红外线探测等应用。 airsim.ImageType.Infrared
'''
# 1.直接使用simGetImage获取PNG格式的彩色图,并保存成 .png 格式的图片文件。
# response = client.simGetImage('0', airsim.ImageType.Scene, vehicle_name='Drone')
# f = open('screen/scene.png', 'wb')
# f.write(response)
# f.close()
# 2.使用 simGetImages 获取PNG格式的分割图,并保存成 .png 格式的图片文件。
# responses = client.simGetImages(
# [airsim.ImageRequest(0, airsim.ImageType.Segmentation, pixels_as_float=False, compress=True)])
# f = open('screen/seg.png', 'wb')
# f.write(responses[0].image_data_uint8)
# f.close()
'''
图像类型 compress pixels_as_float 适合保存的图片类型
PNG格式 True False 彩色图、分割图、表面法线图、红外图
Array格式 False False 彩色图、分割图、表面法线图、红外图
浮点型格式 False True 深度图
'''
# 3.使用 simGetImages 同时获取PNG格式的红外图和表面法线图,并保存成2个.png格式的图片文件。
# responses = client.simGetImages(
# [airsim.ImageRequest(0, airsim.ImageType.Infrared, pixels_as_float=False, compress=True),
# airsim.ImageRequest(0, airsim.ImageType.SurfaceNormals, pixels_as_float=False, compress=True)])
# # print(responses)
# # 保存红外图
# f = open('screen/infrared.png', 'wb')
# f.write(responses[0].image_data_uint8)
# f.close()
# # 保存表面法线图
# f = open('screen/surface.png', 'wb')
# f.write(responses[1].image_data_uint8)
# f.close()
# 4.保存Array格式图像
# # 读取图像数据,array格式
# responses = client.simGetImages([
# airsim.ImageRequest(0, airsim.ImageType.Scene, pixels_as_float=False, compress=False)])
# # 将bytes格式转换为 array格式 fromstring
# img_1d = np.frombuffer(responses[0].image_data_uint8, dtype=np.uint8)
# img_bgr = img_1d.reshape(responses[0].height, responses[0].width, 3)
# # 保存为图片文件
# cv2.imwrite('screen/scene2.png', img_bgr) # 保存为.png格式的图像文件
# cv2.imwrite('screen/scene2.jpg', img_bgr) # 保存为.jpg格式的图像文件
# cv2.imwrite('screen/scene2.tif', img_bgr) # 保存为.tif格式的图像文件
# cv2.imwrite('screen/scene2.bmp', img_bgr) # 保存为.bmp格式的图像文件
'''
.jpg 格式:不带透明通道的有损压缩格式,广泛应用于互联网和数码相机领域;
.png 格式:便携式网络图形,无损压缩的位图,有较高的压缩比;
.tif 格式:非失真的压缩格式,占用空间较大,通常用于书籍和海报等教专业的领域;
.bmp 格式:是Windows操作系统中的标准图像文件格式,通常不压缩,文件所占空间较大。
'''
二、随机设置无人机位姿并获取图像
random_pictures_get_and_save_pose.py
import airsim
import os
import numpy as np
import pandas as pd
# 连接到AirSim模拟器
client = airsim.MultirotorClient()
client.confirmConnection()
# 获取图像路径
folder_path = "screen2"
# 保存位姿信息的空DataFrame
poses_df = pd.DataFrame(columns=['index', 'x', 'y', 'z', 'yaw', 'pitch', 'roll'])
# 设置随机采样的范围和数量
num_samples = 50 # 需要采样的数量
x_min, x_max, y_min, y_max, z_min, z_max = -4, 4, -4, 4, -5, -2 # 位置范围
yaw_min, yaw_max, pitch_min, pitch_max, roll_min, roll_max = -90, 90, -45, 45, -45, 45 # 姿态范围
# 相机列表
camera_list = ["0", "1", "2", "3", "4"]
# 随机采样并保存图像和位姿信息
poses_list = []
for i in range(num_samples):
# 随机生成目标位置,并设置姿态朝向
x = np.random.uniform(x_min, x_max)
y = np.random.uniform(y_min, y_max)
z = np.random.uniform(z_min, z_max)
yaw = np.random.uniform(yaw_min, yaw_max)
pitch = np.random.uniform(pitch_min, pitch_max)
roll = np.random.uniform(roll_min, roll_max)
pose = airsim.Pose(airsim.Vector3r(x, y, z), airsim.to_quaternion(pitch, roll, yaw))
poses_list.append({'index': i, 'x': x, 'y': y, 'z': z, 'yaw': yaw, 'pitch': pitch, 'roll': roll})
# 移动到目标位置
client.simSetVehiclePose(pose, True)
# # 获取相机图像
# responses = client.simGetImages([airsim.ImageRequest("1", airsim.ImageType.Scene, False, False)])
# img_raw = responses[0]
# 遍历相机列表,获取每个相机的图像
for j, camera_name in enumerate(camera_list):
# 获取相机图像
responses = client.simGetImages([airsim.ImageRequest(camera_name, airsim.ImageType.Scene, False, False)])
img_raw = responses[0]
# 将字节流转换为PIL的Image对象
img1d = np.frombuffer(img_raw.image_data_uint8, dtype=np.uint8)
img_rgb = img1d.reshape(img_raw.height, img_raw.width, 3)
# 保存PNG格式的图像
img_filename = "pose_{0}_x_{1:.2f}_y_{2:.2f}_z_{3:.2f}_yaw_{4:.2f}_pitch_{5:.2f}_roll_{6:.2f}_camera_{4}.png".format(i, x, y, z, yaw, pitch, roll, j)
img_filepath = os.path.join(folder_path, img_filename)
airsim.write_png(os.path.normpath(img_filepath), img_rgb)
print("全部图像和位姿信息均已保存到文件夹:", folder_path)
# 将位姿信息保存到csv文件中
poses_df = pd.DataFrame(poses_list)
poses_df.to_csv(os.path.join(folder_path, 'poses.csv'), index=False)
'''
airsim.Vector3r函数用于创建一个三维向量,表示无人机在三个轴上的位置信息。
airsim.to_quaternion函数则用于将欧拉角(即pitch、roll、yaw)转换为四元数,表示无人机的姿态信息。
四元数是一种数学工具,用于描述三维空间中的旋转。它是由一个实部和三个虚部组成的,通常表示为q = a + bi + cj + dk,
其中a是实部,b、c、d是虚部,i、j、$k$是虚数单位。四元数可以用来表示旋转的方向和角度,它比欧拉角更加稳定和准确,避免了万向锁等问题。
在机器人、计算机图形学和游戏开发等领域中,四元数被广泛应用。在AirSim中,四元数用于表示无人机的姿态信息。
万向锁是一种旋转表示中常见的问题,它发生在使用欧拉角进行旋转时,当旋转角度过大或旋转轴与旋转顺序不当时,就会出现万向锁问题。
万向锁的表现形式是旋转轴和旋转角度不能被唯一确定,即旋转自由度丧失。这会导致旋转结果不可预测,甚至无法进行旋转。
为了避免万向锁问题,可以使用四元数等其他旋转表示方法。在AirSim中,使用欧拉角进行旋转时,也可能会出现万向锁问题,因此建议使用四元数进行姿态表示。
'''
三、利用保存好的位姿csv文件截取图像
get_pictures_with_poses_from_csv.py
import airsim
import os
import csv
import numpy as np
client = airsim.MultirotorClient()
client.confirmConnection()
# 设置相机和文件路径
camera_list = ["0", "1", "2", "3", "4"]
folder_path = "/home/yehuo/python_learning/AirSim_learning/screen3"
# 读取位姿信息文件(csv格式)
poses_csv_file = open("/home/yehuo/python_learning/AirSim_learning/screen2/poses.csv", "r")
pos_reader = csv.DictReader(poses_csv_file)
# 循环采样并保存图像和位姿信息
for i, row in enumerate(pos_reader):
# 获取姿态信息
x, y, z = float(row['x']), float(row['y']), float(row['z'])
yaw, pitch, roll = float(row['yaw']), float(row['pitch']), float(row['roll'])
pose = airsim.Pose(airsim.Vector3r(x, y, z), airsim.to_quaternion(pitch, roll, yaw))
# 移动到目标位置
client.simSetVehiclePose(pose, True)
# 遍历相机列表,获取每个相机的图像
for j, camera_name in enumerate(camera_list):
responses = client.simGetImages([airsim.ImageRequest(camera_name, airsim.ImageType.Scene, False, False)])
img_raw = responses[0]
# 将字节流转换为PIL的Image对象
img1d = np.frombuffer(img_raw.image_data_uint8, dtype=np.uint8)
img_rgb = img1d.reshape(img_raw.height, img_raw.width, 3)
# 保存PNG格式的图像
img_filename = "pose_{0}_x_{1:.2f}_y_{2:.2f}_z_{3:.2f}_yaw_{4:.2f}_pitch_{5:.2f}_roll_{6:.2f}_camera_{7}.png".format(i, x, y, z, yaw, pitch, roll, j)
img_filepath = os.path.join(folder_path, img_filename)
airsim.write_png(os.path.normpath(img_filepath), img_rgb)
print("图像和位姿信息均已保存到文件夹:", folder_path)
【AirSim】图像API的使用的更多相关文章
- 8.1 图像API
8.1 图像API Routine Description Drawing related functions GUI_AddRect() 调整矩形框的大小 GUI_GetClientRect() R ...
- java9新特性-14-多分辨率图像 API
1.官方Feature 251: Multi-Resolution Images 263: HiDPI Graphics on Windows and Linux 2.产生背景 在Mac上,JDK已经 ...
- android 5.0 受欢迎的API简介
android 5.0 作为系统的一次重大升级,给用户和开发者带来了全新的体验.Material Design不但在视觉和操作上更胜一筹,扩展UI工具包同时也引入了大量新的API. 1. 3D视图和实 ...
- VR原理讲解及开发入门
本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持. 1. VR沉浸感和交互作用产生的原理: 在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...
- Android内存溢出解决方案(OOM)
众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定).因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片.音频文 ...
- Android处理图片OOM的若干方法小结 (推荐)
众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定).因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片.音频文 ...
- windows类书的学习心得(转载)
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片
本书是分享微信jssdk开发的第二篇. 4.2.1 项目需求 需求说明:实现微信端的手机用户,点击按钮选取1张图片,分享到朋友圈. 4.2.2 需求分解 通过对需求的了解,可以将其分解为: ( ...
- Qt 学习之路 :Qt 模块简介
Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改.Qt 5 引入了模块化的概念,将众多功能细分到几个模块之中.Qt 4 也有模块的概念,但是是一种很粗的划分,而 Qt 5 则更加细化.本节 ...
- [QT]QT概述
QT概述 基于C++的GUI开发框架,跨平台.Qt 是一个用于桌面系统和嵌入式开发的跨平台应用程序框架. QT是挪威TROLLTECH公司开发的跨平台C++工具,在UNIX下非常出名:他的宗旨是“一次 ...
随机推荐
- .NET+AI | eShopSupport 知多少
eShopSupport 项目深度解析 eShopSupport 项目的整体架构示意图.左侧为离线运行的工具(DataGenerator.DataIngestor.Evaluator)用于数据准备和评 ...
- bat文件备份数据库
@echo off/*获取当前日期*/ set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" /*数据库自带的备份脚本的存放地址 --opt -u ...
- 私人问卷收集系统-Surveyking问卷收集系统
前言 但凡提及问卷收集系统,问卷星与腾讯问卷通常都为大家首选问卷调查系统. 担心数据安全,海量问卷管理不便,工作流创建困难?快速部署自有问卷调查系统开始你的问卷调查之旅. 无论是问卷调查,考试系统,公 ...
- ubuntu 踩过的坑
ubuntu安装中文输入法成功教程: https://zhuanlan.zhihu.com/p/508797663 博主希望尽量的不去宿主机中操作,达到对原系统的保护的效果,并且能够进行日常的深度学习 ...
- C#正则之获取命名组所有捕获的数据
static void ParseTest(string str) { Regex reg = new Regex(@"(?<num>\d+)(?<sg>[_!$#] ...
- MySQL修改表和字段的字符集和排序规则
摘要:通过设置表的字符集和排序规则,解决MySQL查询时不区分字母大小写.插入时不支持特殊字符的问题. 关于MySQL查询时不区分字母大小写.插入时不支持特殊字符的问题,只有修改表的字符集和排序规 ...
- Windows下配置pip指定下载源具体操作步骤
前言 pip官方源有时候较为不稳定,对于国内用户来说,一个好的镜像源能够提高生产力.再加上有的公司和行业较为严格,无法访问互联网,所以通过配置内网的源就变成了必需的技能,本文同样适用于公司内网源的搭建 ...
- SAP采购订单屏幕控制
这里看交货计划的屏幕控制:交货计划增强,不可编辑 采购订单的程序是用类+屏幕写的. 所以直接看采购订单的程序:MEGUI 找到我们需要增强的屏幕,屏幕号1320 对应的类对象. BUILD_DYNPR ...
- 第三次Blog作业
一.前言 对整门课程的概要性总结,从工作量与难度两大江都度展开分析,总体说明学习体验. (一)工作量评估 学习任务 工作量星级 详细说明 Blog 作业 工作量在可接受范围.Blog作业主要是在每次的 ...
- APEX实战第4篇:如何把APEX程序变成“移动端APP”?
因为使用手机登录APEX程序时,每次都要先到手机浏览器的入口感觉不方便且不专业,所以能不能像APP那样直接点击进入呢? 最简单的方式,就是使用PWA来实现类似APP程序一样的移动端登录. PWA本身配 ...