概述

  在UE 摄像头教程一中,我们已经通过Unreal自带的媒体播放器打开了摄像头,并且将摄像头的数据展示在了游戏画面中。当然这只是最基本的功能,一般情况下,我们需要对摄像头的画面数据进行处理,比如进行人脸的检测,或者在图像中绘制新内容,或者仅仅是保存图像数据,这时候应该怎么办呢?关于这一部分内容,网上资料其实挺少的,官方文档也没有具体的说明,不过不用担心,我已经帮你踩好坑了,跟着我一步步来就可以了~

方法介绍

  首先梳理一下逻辑,我们是如何打开摄像头和预览画面的?
  1. 为了打开相机,首先通过MediaPlayer(CameraMeidaPlayer)来打开相机,在创建MediaPlayer的时候系统会自动为它创建一个MediaTexture(CameraMeidaPlayer_Video)此时我们已经可以在UE 的编辑器中看到MediaPlayer和MediaTexture中已经展示出了摄像头的画面了。
  2. 为了展示画面,我们在游戏关卡中拖了一个Plane(平面),然后将MediaTexture拖到Plane上,此时引擎又为我们创建了一个材质(CameraMediaPlayer_Video_Mat)。
  这是我们上一节所作的工作。看一下我们的内容浏览器,现在我们有CameraMeidaPlayer,CameraMediaPlayer_Video_Mat,CameraMeidaPlayer_Video三个东西。

  获取帧数据的核心也就是如何将CameraMediaPlayer_Video_Mat转化为帧数据,在C++代码中也就是包含图像信息的数组了。具体思想,就是通过渲染目标(RenderTarget2D)来将图像信息导出。
  简单来讲,渲染目标(Render Target)就是一种可以在运行时写入的纹理。从引擎的角度讲,渲染目标会存储颜色、法线以及AO等信息。

具体步骤

  1. 创建一个RenderTarget2D,这里将其命名为CameraRender2D。

  2. 在蓝图界面中创建一个RenderTarget2D的变量,这里命名为RenderTarget,然后将它的默认值指向在内容管理器中的CameraRender2D.

  3. 在蓝图界面中创建一个Material的变量,这里命名为CameraMaterial,然后将它的默认值指向在内容管理器中的CameraMdiaPlayer_Video_Mat.

  4. 开始绘制蓝图了。图中的实例是以点击屏幕中的plane,每点一次,就会对RenderTarget2D进行绘制,绘制好以后,RenderTarget2D就保存好了图像信息,这个时候将它输入到ProcessData中,使用C++对图像数据进行处理,得到我们想要的结果后,就可以通过渲染目标释放掉资源。

  在c++中,如何将Target2D转换为图像数据呢?通过如下代码,首先我们在上述步骤得到了Target2D,函数中作为参数rt输入。首先将rt转化成了Unreal中的数据格式 TArray 的数组,然后将这个数组转成更通用的c形式的unsigned char格式。也就是说,我们已经得到了图像的数据,将它保存在下图中unsinged char格式的指针中啦!注意图像数据格式是RGBA格式,从代码中不难看出。至于如何操纵这个图像数据,就请大家自由发挥啦~

bool ProcessData(UTextureRenderTarget2D* rt) {//Get Imagedata in the format of TArray<FColor>if (rt == nullptr) {GEngine->AddOnScreenDebugMessage(INDEX_NONE, 20.0f, FColor::Yellow, TEXT("UTextureRenderTarget2D == nullptr,exit"));return false;}FTextureRenderTargetResource* rtResource = rt->GameThread_GetRenderTargetResource();FReadSurfaceDataFlags readPixelFlags(RCM_UNorm);readPixelFlags.SetLinearToGamma(true);TArray<FColor> outBMP;outBMP.AddUninitialized(rt->GetSurfaceWidth() * rt->GetSurfaceHeight());rtResource->ReadPixels(outBMP, readPixelFlags);for (FColor& color : outBMP)color.A = 255;//Convert the image data format from TArray to const char*(c style)unsigned long dataSize = sizeof(unsigned char) * 4 * (rt->GetSurfaceWidth() * rt->GetSurfaceHeight());unsigned char *imgData = (unsigned char *)malloc(dataSize);memset(imgData, 0, dataSize);int cusPos = 0;for (FColor& color : outBMP) {memcpy(imgData + cusPos, (unsigned char*)&color.R, 1);cusPos += 1;memcpy(imgData + cusPos, (unsigned char*)&color.G, 1);cusPos += 1;memcpy(imgData + cusPos, (unsigned char*)&color.B, 1);cusPos += 1;memcpy(imgData + cusPos, (unsigned char*)&color.A, 1);cusPos += 1;}}

  大家有做到这个步骤吗?如果你的RenderTarget已经有图像,就像我下图所示的一样,那么恭喜你,你已经正确的完成了以上步骤。

Wait~

为什么渲染出来的图像比实际图像暗一层?

为什么我在UE5中打包出来的图像,一直左右不停的旋转呢?

为什么打包出来的图像在iOS和Mac上没有效果呢?

这些问题留到下期吧。讲解一下这个过程中遇到的坑以及解决方案。

【UE Unreal Camera】【保姆级教程二】手把手教你通过UE获取摄像头帧数据相关推荐

  1. 保姆级教程:手把手教你搭建个人网站

    保姆级教程:手把手教你搭建个人网站 前言 准备与搭建 1.Git管理工具的下载与安装 2.nodejs环境安装 3.hexo博客框架下载 npm换国内源 使用npm下载hexo博客框架 初始化mybl ...

  2. 【保姆级教程】手把手教你用github制作学术个人主页(学者必备)

    很多朋友到了本科生或者研究生或者博士生的高年级,有了制作个人主页的需求,今天这一期博客将以academicpages模板为例,手把手教你快速制作一个简洁能用的个人主页. 1.首先你需要拥有一个gith ...

  3. 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!

    作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...

  4. 保姆级教程:手把手教你使用深度学习处理文本

    大家好,今天给大家分享使用深度学习处理文本,更多技术干货,后面会陆续分享出来,感兴趣可以持续关注. 文章目录 NLP技术历程 准备数据 标准化 词元化Tokenization(文本拆分) 技术提升 建 ...

  5. 保姆级教程:手把手教你拿下雅思写作7分

    在留学路上,雅思考试是绕不开的一道坎.然而,众所周知,雅思学习热度高,学习难度大,而且很多人找不到合适的学习方法.在这里,我们以雅思写作中的大作文为例,从大作文的结构拆解.学习的任务拆分和如何提升学习 ...

  6. 保姆级教程,手把手教你如何使用Django完成母婴商城项目:(四)商城的数据业务处理

    文章目录 一.首页的视图函数 二.使用视图类实现商城首页 一.首页的视图函数 from django.shortcuts import render from commodity.models imp ...

  7. 保姆级教程,手把手教你批量打造小红书爆文笔记,快来收藏

    小红书是千人千面的内容分发机制,先推给少数人,成为爆文才会进入到更大的流量池持续获得流量,那么什么样的笔记才是爆文呢? 浏览量/小眼睛=10%,互动(点赞数+收藏数+评论数(1-3小时内)24小时内) ...

  8. 保姆级教程,手把手教你实现一个SpringBoot的starter

    引言 什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧. ❝ Starters are a set of convenient dependency descripto ...

  9. 保姆级教程:手把手教你使用 Keras 搭建神经网络

    大家好,本文从0到1详细讲解两种基于Keras的建模方法: 基于Sequential的建模:快速方便,易上手 基于函数式API的建模:易于扩展,灵活性强 文章目录 你会学到什么? 技术提升 导入内置数 ...

  10. 【转】黑群晖NAS保姆级教程:手把手教您安装DS918+固件,开启显卡解码功能!3分钟玩转黑群NAS!

    这是我见到最详细的黑群辉安装了 https://post.smzdm.com/p/ar0v2on7/

最新文章

  1. 适用于CUDA GPU的Numba例子
  2. 希尔排序算法图解分析
  3. CentOS7——卡在在启动界面
  4. Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp
  5. Day 3 in India
  6. Python使用xlwt和xlrd读写excel文件
  7. devops什么意思_DevOps有什么意义?
  8. I00003 贝尔三角形
  9. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_3_Map接口中的常用方法...
  10. python代码混淆加密
  11. 车路协同场景身份认证及 V2X 通信安全保障
  12. crmeb多商户1.7.3
  13. python运行后闪退_怎样让python运行完了不直接退出?
  14. win10使用的c语言程序开发,Win10是什么编程语言写的?源代码文件多到你无法想象...
  15. http缓慢攻击漏洞
  16. 【服务器数据恢复】服务器卷被误删除的raid5数据恢复案例
  17. 3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据
  18. 1万小时贫穷定律:为什么你越忙越穷
  19. java将字符串放置到剪切板
  20. 微软模拟飞行2020服务器多少内存,微软飞行模拟2020配置需求高吗 微软飞行模拟2020配置要求-游侠网...

热门文章

  1. 新手如何使用Cheat Engine (CE) 来修改“我的世界“?
  2. Python基于PyTorch实现BP神经网络ANN分类模型项目实战
  3. java解析导入excel表格转为实体类javabean
  4. 神经网络中warmup为什么有效?
  5. TSFS终端存储文件系统边缘计算技术构架
  6. Redis 在spring 中的应用
  7. 4G浏览器 随机遇而生
  8. Linux搭建FTP,并使用Windows和IE浏览器访问FTP服务
  9. 免费自媒体全网平台爆文采集器
  10. virtualbox安装ubuntu时,not syncing: attempt to kill the idle task