如何在虚拟环境(虚幻引擎)按照规划路径下拍摄图片并应用于三维重建,以及路径规划

2023-11-13

如何在虚拟环境(虚幻引擎)按照规划路径下拍摄图片并应用于三维重建

​ 在三维重建工作中针对各项路径规划算法的使用,如果完全依照现实生活的照片未免太过奢侈和艰难(若用无人机,各项准备工作繁琐,),所以我们改为在虚拟环境下使用我们设定的相机位姿来进行拍照,相对于采用真实图片更加方便,参数更好修改,所以本篇我们介绍如何在虚幻引擎ue4下,通过自己设定的位姿来拍摄照片。
​ 首先提前明确相机位姿的具体数据,这是一个六自由度的变量,世界坐标系下做标x,y,z,和三个旋转欧拉角
θ , ϕ , ψ \theta,\phi,\psi θ,ϕ,ψ
​ 那我们设置相机位姿就是要按照队这六个变量完成赋值,那如何在虚幻引擎下完成这样的工作呢,虚幻引擎提供了一个python库 unrealcv,用于对于游戏各项操作(你甚至可以用它来目标检测:https://www.youtube.com/watch?v=iGGNAkaxVyQ&feature=youtu.be),我们首先先安装unrealcv

pip install unrealcv

​ 在github上搜索unrealcv有入门介绍(可能需要神秘力量)

​ 为了测试拍摄,我们先下载一个虚幻引擎的小游戏(在unrealcv的入门指南上有链接)我选择的是RealisticRendering(就是一个w,a,s,d四处移动的观察景色的小游戏)

在这里插入图片描述

那么我们如何从这边获取图片呢,

import sys
import cv2
from pylab import *
import h5py
import itertools
import os
import unrealcv
import numpy
import matplotlib
unrealcv.client.connect()
assert unrealcv.client.isconnected()#首先让虚幻引擎连接

在这里插入图片描述

出现这个即为连接成功(我在windows下如果单独启动虚幻引擎经常连接失败,知道为什么的大佬希望可以在评论区指导我一下)

那么我们接下来来设置如何获取拍摄照片:

M_si_from_unreal = matrix("0.0 0.01 0.0; 0.0 0.0 0.01; 0.01 0.0 0.0")
M_unreal_from_si = M_si_from_unreal.I

rad_from_deg = pi/180
deg_from_rad = 180/pi

def position_si_from_unreal(position_unreal):
    position_unreal=str(position_unreal)
    return (M_si_from_unreal*matrix(matrix(position_unreal).A1).T).A1

def orientation_si_from_unreal(pyr_unreal):
    return rad_from_deg*pyr_unreal[0,2], rad_from_deg*(pyr_unreal[0,1] + 90), -rad_from_deg*pyr_unreal[0,0] # theta, psi, phi

def position_unreal_from_si(position_si):
    return (M_unreal_from_si*matrix(matrix(position_si).A1).T).A1

def pyr_unreal_from_si(theta_si, psi_si, phi_si):
    return deg_from_rad*array([-phi_si,psi_si,theta_si]) - array([0,90,0])

def unreal_engine_get_camera_pose(cam_id):
    
    
    while True:
        try:
            pos             = position_si_from_unreal(matrix(str(unrealcv.client.request("vget /camera/%d/location" % cam_id))))
            break
        except:
            continue
            
    while True:  
        try:
            theta, psi, phi = orientation_si_from_unreal(matrix(str(unrealcv.client.request("vget /camera/%d/rotation" % cam_id))))
            break
        except:
            continue
            
    return pos, theta, psi, phi

def unreal_engine_set_camera_pose(cam_id, pos, theta, psi, phi):
    pos_unreal = position_unreal_from_si(pos)
    pyr_unreal = pyr_unreal_from_si(theta, psi, phi)
    
    while True:
        try:
            result = str(unrealcv.client.request("vset /camera/%d/location %f %f %f" % (cam_id,pos_unreal[0],pos_unreal[1],pos_unreal[2])))
            break
        except:
            continue
    
    assert result == "ok"
    
    
    while True:
        try:
            result = str(unrealcv.client.request("vset /camera/%d/rotation %f %f %f" % (cam_id,pyr_unreal[0],pyr_unreal[1],pyr_unreal[2])))
            break
        except:
            continue
    assert result == "ok"
    

def unreal_engine_get_camera_rgb_image(cam_id):
    while True:
        try:
            rgb_filename = str(unrealcv.client.request("vget /camera/%d/lit" % cam_id))
            break
        except:
            continue
    print(rgb_filename)
    rgb_img      = imread(rgb_filename)
    return rgb_img

在这里仔细观察(这份代码是我从一个项目下改动的,不是官方给的写法),我们在这里有unreal_engine_get_camera_rgb_img函数来通过相机的id号来获取所拍摄的相片,同时我们还有一设定给定相机id位姿的函数,那接下来我们的思想就很简单了,我们每次都对给定id的相机设定它的位姿,然后获取图片并保存下来(在这里我们用的是hdf5格式文件来分开存储相机位置和姿态(这个文件,是我自己为了实现overhead拍摄自己一个个慢慢拍摄并记录的,如果想自己试试这个文件可以在评论区说下),那我们读取hdf5文件就要使用h5py库,


file_name="camera_position.hdf5"
i=0
position=[]
eular=[]
with h5py.File(file_name, "r+") as f:
    a_key=list(f.keys())[i]
    i+=1
    data=list(f[a_key])
    position.append(data)
print(position)

file_name="camera_position_eular.hdf5"
i=0
with h5py.File(file_name, "r+") as f2:
    b_key=list(f2.keys())[i]
    i+=1
    data=list(f2[b_key])
    eular.append(data)
cam_id=0
picture_name=0
for pose,eular_tangle in zip(position[0],eular[0]):
    picture_name+=1
    unreal_engine_set_camera_pose(cam_id, pose, eular_tangle[0], eular_tangle[1], eular_tangle[2])
    rgb_img = unreal_engine_get_camera_rgb_image(cam_id)
    name=str(picture_name)+".png"
    imsave(name, rgb_img)






ps:这代码我随意写的,可能有些不规范,这样我们通过读取两个存储着位置和姿态的文件,我们设置每个相机的位姿,在拍摄图片就完成了我们在虚拟环境下给定路径拍摄照片的方法,结果如下:
在这里插入图片描述

接下来我们就可以利用这些图片来进行三维重建或者路径规划的工作(博主最近在做三维重建路径规划的工作(纯萌新),如果有大佬或同志会可以评论区或私聊我交流)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在虚拟环境(虚幻引擎)按照规划路径下拍摄图片并应用于三维重建,以及路径规划 的相关文章

  • Json对象和字符串之间的相互转换

    例子 1 new Function形式 function strToJson str var json new Function return str return json 2 使用全局的JSON对象 JSON stringify obj
  • 大数据时代究竟带来了什么? ——写给普通人看的大数据文章

    数据 让一切有迹可循 让一切有源可溯 我们每天都在产生数据 创造大数据和使用大数据 只是 你 仍然浑然不知 百度知道和知乎问答里一直有小伙伴在问这个问题 比如 大数据时代 生活和思维发生了哪些变 大数据时代给我们的生活带来了哪些好处呢 以及
  • NvidiaCUDA通用计算简介及优化方法概述

    IT168 技术 1 GPU通用计算简介 注 本文为IT168 NVIDIA联合举办的 如何并行化我的应用 方案征集活动参赛作品 本次方案征集活动详情见 http cuda itpub net thread 1299715 1 1 html
  • 字节跳动《算法中文手册》火了,完整版 PDF 开放下载!

    今天给大家推荐两份来自字节跳动大佬的算法进阶指南 据说有不少小伙伴靠这份指南成功掌握了算法的核心技能 拿到了 BAT offer 希望对大家有帮助 第一份资料是 70K Star 的 labuladong 的算法小抄 作者 labulado
  • 【自我提高】树莓派GPIO的几种语言控制方法 python 篇

    使用 python 语言控制 GPIO 18 首先知道树莓派外置IO的关系对照表 我这里的树莓派是 PI 3B V1 2 关系对照表如下 首先安装 python 和 GPIO 库 具体安装过程参考 https blog csdn net w
  • DETR论文解读

    DETR基本介绍 DETR的一个创新是端到端的目标检测 它能够将目标检测看做成集合预测问题 而不需要像之前的目标检测算法需要anchor或者nms等 总之就是一个将CNN和transformer结合的一个新颖的目标检测框架 改变预测头还可以
  • Android studio 一个项目引入另一个项目作为Libary

    1 在我们开发Android项目时 有时需要一个项目作为另一个项目的工具类的引用 这样就需要配置下 使得MyLibrary到MyApplication作为一个module 我们直接截图上步骤 1 假设我们新建两个项目 一个是引入的项目 一个
  • Error: failed to create deliver client :orderer client failed to connect to orderer

    问题描述 在部署fabric时 peer create channel时报错如下 Error failed to create deliver client orderer client failed to connect to order
  • linux删除某个目录下旧文件只保留最新的10个

    find aaa bbb ccc d name mingcheng sort head n 10 xargs rm rf 指令解析 find aaa bbb ccc d 意思是 在 aaa bbb ccc查找文件夹 name mingche
  • Redis-应用问题解决

    缓存穿透 缓存穿透现象 应用服务器压力变大 redis命中率降低 一直查询数据库 原因 redis查询不到数据库 出现很多非正常url访问 解决方案 1 对空值缓存 如果一个查询返回的数据为空 不管是数据是否不存在 我们仍然把这个空结果 n
  • 【C++设计模式】详解装饰模式

    2023年8月31日 周四上午 这是我目前碰到的最难的设计模式 非常难以理解而且比较灵活多半 学得贼难受 写得贼费劲 2023年8月31日 周四晚上19 48 终于写完了 花了一天的时间来学习装饰模式和写这篇博客 虽然基本上把我今天的收获都
  • 点在多边形内的判断

    c语言代码 typedef struct tagVERTEX double x double y VERTEX 判断点与多边形关系 0 外 1 上 2 内int PointInPolygon VERTEX pt VERTEX vtx int
  • Pgsql报错:PostgreSQL的SQL语句参数上限报错

    org postgresql util PSQLException An I O error occurred while sending to the backend Caused by java io IOException Tried
  • maven 全入门

    使用SPRINGSOURCE TOOL SUITE创建maven web project 推荐使用springsource的sts 一款基于eclipse整合的ide sts下载地址 安装好m2clipse插件后 在ide菜单栏点击 win
  • mssql sqlserver 获取指定日期为本月第几个工作日

    转自 https www cnblogs com lairui1232000 p 9286104 html 摘要 下文讲述工作中 需要获取指定日期在当月的工作日 下文讲述常规的指定工作日所在月的天数分析 实现思路 1 生成一个国家法定假日表
  • C#的笔记属性索引器,委托事件,泛型集合,异常捕捉

    C 有一些与其他语言C Java不同的特性这里特别记一下 他们大部分基本的内容是相同的 C 有属性索引器 委托事件 泛型集合 trycatchfinally异常捕捉 属性Property 属性时一种很像字段的方法 他有getset访问器 使
  • 高并发高可用(二)架构

    4 大型网站架构模式 模式词汇来源于建筑学 定义 每个模式描述一个在我们周围不断重复发生发生的问题及该问题解决方案的核心 这样你就能一次又一次使用该方案而不必做重复的工作 为解决大型网站所遇到的高并发访问 海量数据处理 高可用运行等系列问题
  • MySQL的预读机制

    一 预读机制 InnoDB在I O的优化上有个比较重要的特性为预读 预读请求是一个i o请求 它会异步地在缓冲池中预先回迁多个页面 预计很快就会需要这些页面 这些请求在一个范围内引入所有页面 InnoDB以64个page为一个extent
  • 网上书店管理系统 课程设计

    数据库原理及应用 综合设计报告 第一章 绪论 随着计算机技术的发展以及计算机网络的逐渐普及 因特网成为了人们查找信息的重要场所 二十一世纪是信息的时代 所以信息的交换和信息的流通就显得特别的重要 因此网上书店的出现成为必然 实体书店在正常运
  • pytorch 入门 DenseNet

    知识点0 dense block的结构 知识点1 定义dense block 知识点2 定义DenseNet的主体 知识点3 add module 知识点 densenet是由 多个这种结构串联而成的 import torch import

随机推荐

  • Retrofit2 使用@Multipart上传文件

    1 上传单个文件 1 1定义接口 Multipart POST uploadImgs Call
  • Laravel5.6 实现小程序使用openid登陆、手机号验证码登陆、账户密码登陆三种登陆方式

    我的个人博客 逐步前行STEP 目前开发小程序 按需求要实现3种登陆方式 1 微信授权登陆 2 账户密码登陆 3 手机号 验证码登陆 我使用laravel自带的Auth认证机制 通过attempt方法进行账户验证 但是默认的认证机制必须包含
  • YOLOv6网络结构详解

    网络结构 根据官方代码使用Drawio绘制的YOLOv6 s网络结构图 官方资源 美团技术团队对于YOLOv6的介绍 文章 文章 文章 论文地址 YOLOv6 A Single Stage Object Detection Framewor
  • Java基础——大杂烩

    今天阿Q给大家来一节大杂烩 讲一下专题性不强的java基础知识 main方法详解 public static void main String args 这里面只有args能改变 public 被jvm调用 访问权限足够大 static 被
  • 记一次结构体字节对齐引起的严重问题

    头文件自定义了bool类型 4个字节 ifndef bool define bool int define true 1 define false 0 endif typedef struct bool automaticActivatio
  • 微信小程序消息订阅的实现——后端是nodejs的koa框架

    在做毕设中 我遇到这么一个使用场景 当顾客购买某个商家的商品后 那这个商家应该要收到通知信息 提示你家商品被购买了 故有了以下代码 微信小程序js代码 onSubmit function 用户点击确认支付 用户应该点击允许 同意提醒信息订阅
  • window 7 平台上 MXNET 源码编译

    目的 本文主要描述怎么在windows上编译mxnet源码 得到可用的libmxnet dll和libmxnet lib文件 版本 mxnet x64 release CPU版 运行环境 windows 7 64bit visual stu
  • [风格迁移系列五: WaveCT-AIN] 医学图像的风格迁移和跨域自适应(泛化性)

    不同于自然图像的风格迁移 在临床应用上 医学图像更加注重图像生成的纹理细节 并且需要实时的推理速度 因此提出一个实时且高质量的风格迁移方法非常重要 这篇论文实现了这个方法 Remove Appearance Shift for Ultras
  • Rectangle矩形类

    题目 设计一个名为Rectangle的矩形类 并实现Comparable接口 这个类包括 1 两个名为width和height的double数据域 它们分别表示矩形的宽和高 2 Rectangle的无参构造方法 width和height的默
  • Transactions on Multimedia 投稿经验分享

    关于IEEE Transactions on Multimedia 投稿经验分享 SCI分区 JCR分区 Q1 Q1 影响因子 7 3 期刊官方网站 IEEE Transactions on Multimedia IEEE Xplore 投
  • 聚类分析:原型K-Means/K-Means++聚类、层次聚类;密度聚类DBSCAN

    聚类分析 处理无标签数据 from IPython display import Image matplotlib inline 1 使用K Means方法按照相似度对对象进行分组 1 1使用sklearn实现K Means聚类 from
  • rdp协议解读

    转自 http blog csdn net jiangtao killer article details 6940346 一 前言 RDP 远程显示协议 Remote Display Protocol 简称RDP 提供了客户和服务器之间的
  • 微博爬取多页评论

    最近在学习爬虫 爬取了第一页后 信心满满 但是翻不了页 就卡住了 搜了好多资料 b站都翻烂了 还是没找到合适的代码 最后在知乎找到了 2023微博评论爬虫 用python爬上千条微博评论 突破15页限制 知乎 zhihu com 这篇文章干
  • Linux之系统进程及控制

    一 什么是进程 进程就是系统未完成并且正在进行的工作 二 查看系统进程 1 图形方式查看 gnome system monitor 图示 2 进程查看命令 ps A 所有进程 a 在当前环境中运行的进程 不包含环境信息 u 显示进程用户信息
  • Win7下硬盘安装Linux双系统

    参考如下两篇文章 基本能搞清楚如何安装 1 Win7下硬盘安装Linux双系统 Win7下硬盘安装CentOS6 2 http www 3fwork com b902 002405MYM032666 2 Windows7硬盘安装Fedora
  • 【思维导图】python常见的异常(error) 汇总

    点开看大图 python常见的异常 error 汇总 name error o尝试访问一个没有申明的变量 oNameError name xrange is not defined 原因 在Python 3中 range 与xrange 合
  • wchar_t 、UTF-8、UTF-16的转换方法

    继续编码转换 Unicode 有两套编码集 UCS 2 和 UCS 4 Windows 的内部其实是用的 UCS 2 标准 并用 UTF 16 来实现 而非 Windows 系统大多采用了 UTF 8 实现 大家都知道在windows上wc
  • ZBrush怎样自动保存

    在使用 ZBrush执行任何会话期间 您都可以设置将文件自动保存 并可以修改保存时间间隔 文件保存位置等设置 发生系统错误后要重新启动ZBrush 时 可以从临时文件夹或指定的文件夹中恢复备份文件 如果您选择不恢复备份文件 退出应用程序后文
  • Scala基础快速学习笔记

    Scala Java语言脚本化 面向函数 直奔主题 直接写程序 直接运行即可 进入Scala shell gt bin scala scala gt help 查看帮助 o getClass classOf res6 inter 类型推断
  • 如何在虚拟环境(虚幻引擎)按照规划路径下拍摄图片并应用于三维重建,以及路径规划

    如何在虚拟环境 虚幻引擎 按照规划路径下拍摄图片并应用于三维重建 在三维重建工作中针对各项路径规划算法的使用 如果完全依照现实生活的照片未免太过奢侈和艰难 若用无人机 各项准备工作繁琐 所以我们改为在虚拟环境下使用我们设定的相机位姿来进行拍