【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据

这篇具有很好参考价值的文章主要介绍了【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据~
c6ebbaddb1aff.png)

概述

  在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三个东西。

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

具体步骤

  1. 创建一个RenderTarget2D,这里将其命名为CameraRender2D。
【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据
  2. 在蓝图界面中创建一个RenderTarget2D的变量,这里命名为RenderTarget,然后将它的默认值指向在内容管理器中的CameraRender2D.
【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据
  3. 在蓝图界面中创建一个Material的变量,这里命名为CameraMaterial,然后将它的默认值指向在内容管理器中的CameraMdiaPlayer_Video_Mat.
【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据
  4. 开始绘制蓝图了。图中的实例是以点击屏幕中的plane,每点一次,就会对RenderTarget2D进行绘制,绘制好以后,RenderTarget2D就保存好了图像信息,这个时候将它输入到ProcessData中,使用C++对图像数据进行处理,得到我们想要的结果后,就可以通过渲染目标释放掉资源。
【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据
  在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已经有图像,就像我下图所示的一样,那么恭喜你,你已经正确的完成了以上步骤。
【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据

方法介绍

Demo工程说明

  Demo工程包含以上所讲内容实例,进入工程以后,点击运行,就可以看到Windows电脑摄像头打开,并显示在游戏中。打包出来以后同样可以在Android手机上使用。(注意Mac电脑和iOS手机不可用)
  关注公众号后发送:Unreal-Camera即可。
文章来源地址https://www.toymoban.com/news/detail-429894.html

到了这里,关于【UE Unreal Camera】【保姆级教程二】【包含源代码】手把手教你通过UE获取摄像头帧数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 改进的北方苍鹰算法优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码...

    今天给大家带来一期由改进的北方苍鹰算法(SCNGO)优化VMD的两个参数。 同样以西储大学数据集为例,选用105.mat中的X105_BA_time.mat数据中1000个数据点。没有数据的看这篇文章。西储大学轴承诊断数据处理,matlab免费代码获取 选取四种适应度函数进行优化,以此确定VMD的最佳k和

    2024年02月15日
    浏览(39)
  • 使用Python绘制圣诞树教程(附源代码)

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 又是一年一度的圣诞节快到了,作为程序猿那必须露一手,最终效果图如下: 目录 1.turtle库

    2024年02月04日
    浏览(45)
  • python简单小游戏代码教程,python小游戏程序源代码

    大家好,小编来为大家解答以下问题,python简单小游戏代码教程,python小游戏程序源代码,今天让我们一起来看看吧! 哈喽铁子们 表弟最近在学Python,总是跟我抱怨很枯燥无味,其实,他有没有认真想过,可能是自己学习姿势不对? 比方说,可以通过打游戏来学编程! 今天

    2024年02月02日
    浏览(48)
  • C#与VisionPro联合开发实例教程:详细步骤与源代码

    C#与VisionPro联合开发实例教程:详细步骤与源代码 在本教程中,我们将深入介绍如何使用C#编程语言与VisionPro图像处理软件进行联合开发。我们将通过一个完整的项目示例来演示此过程,包括详细的步骤和相应的源代码。 步骤1:环境准备 首先,确保你已经安装了以下软件:

    2024年02月06日
    浏览(36)
  • 校园二手书商城源代码基于微信小程序云开发,可在线支付提现,含详细配置教程

    校园二手书商城源代码基于微信小程序云开发,可在线支付提现,含详细配置教程 完整代码下载地址:校园二手书商城源代码基于微信小程序云开发 长话短说,下面直接说配置流程 1、下载导入 直接下载到本地,然后导入开发者工具 最近墙的厉害,也可使用蓝奏云下载 ht

    2023年04月24日
    浏览(54)
  • 网站转换APP源代码 WebAPP源代码 网站生成APP源代码 Flutter项目 带控制端

    源码介绍 一款网站转换成APP的源代码,开发语言使用Flutter,开发工具使用的是AndroidStudio,你只需要在APP源代码里面填写你的域名,即可生成即可生成APP,包括安卓或者苹果,与此同时我们提供了APP的控制端.你可以通过控制端设置APP的颜色、添加APP的图标、添加APP的菜单栏目。 添加

    2024年02月04日
    浏览(37)
  • GDB 源代码查看、管理、搜索、设置源代码目录,调试发行版,观察点

    C_FLAGS中加入-g选项后,生成的可执行文件中会保存调试信息。 1、 set listsize 10:设置list查看的代码行数        list -: 向前查看代码        list 函数名: 产看函数代码 2、search        forward-search :跟 search功能一样       reverse-search:反向搜索 3、directories 路径:添加源代码路

    2024年02月09日
    浏览(41)
  • uniapp - App 平台下获取用户本机已安装的应用列表app,可读取某个应用的全部信息(应用名称 / 图标 / 是否系统软件 / 安装包 / 签名等软件信息)超详细注释示例源代码教程

    如题所示,本文提供 uniapp 编译为 APP 平台下,如何获取用户手机内的所有应用(并且拿到应用名字/图标等信息), 你可以直接复制本文提供的方法,稍微改改就能移植到你自己的项目中去。 代码干净整洁,注释详细。 Android的应用管理主要是通过PackageManagerService来完成的。

    2024年02月11日
    浏览(35)
  • Python背单词记单词小程序源代码,背单词记单词小游戏源代码

    背单词小游戏,要有多界面交互,界面整洁、美观,可调节游戏等级难度,可配置游戏信息。 有游戏分数,游戏时间,动画特效,背景音乐,不同游戏等级的历史最高分记录。 拼写成功的英文单词显示中文意思。支持长按回删键[backspace],快速删除单词字母。 多种游戏困难

    2024年02月15日
    浏览(41)
  • 跑酷游戏源代码

    import pygame, sys import random class Person():  # 人物     def __init__(self, surf=None, y=None):         self.surface = surf         self.y = y  # y坐标         self.w = (surf.get_width()) / 12  # 宽度         self.h = surf.get_height() / 2  # 高度         self.cur_frame = -1  # 当前的运动状态帧         self.

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包