UE4.27 使用蓝图实现RGB与掩码图像采集
创作时间:
作者:
@小白创作中心
UE4.27 使用蓝图实现RGB与掩码图像采集
引用
CSDN
1.
https://blog.csdn.net/qq_41822101/article/details/140022863
最近需要使用虚幻引擎制作虚拟目标检测数据集,要求同时生成rgb图像与mask图像,从而进一步实现图像自动打标,解放双手。
本文提供一种**蓝图配合C++**实现rgb与mask图像采集的方法。我使用的是UE4.27,应该支持UE5。
效果
- rgb图像
- mask图像
0. 基本思路
使用蓝图与C++实现功能。
- 蓝图部分:使用
场景捕获2D
组件将画面渲染至
渲染目标 - C++部分:将
渲染目标
保存至本地图片
1. 蓝图实现
1.1 蓝图类创建
创建catcher蓝图类继承Actor。为了实现功能的易用性我设计了一些额外的组件与变量,来丰富功能。
组件
组件包括1个
摄像机组件
和2个
场景捕获2D
组件。
CineCamera
用于显示预览画面和视场便于拍摄;
RGB_SceneCaptureComponent2D
用于捕捉RGB画面;
MASK_SceneCaptureComponent2D
用于捕捉MASK画面。
变量
变量部分,字符串
time
与整数
imgCount
用于图像文件命名,
rgb_纹理目标
和
mask_纹理目标
作为公开变量便于从外部指定
渲染目标
对象。
1.2 蓝图实现
需要实现
构造函数
和2个事件:
开始运行
和
tick
构造函数
用于设置
场景捕获2D
组件的纹理目标。

是下面这个选项:

开始运行事件
用于同步摄像机与场景捕获的视场与获取当前时间设置字符串。



tick事件
用于保存每一帧图像到本地。
看一下细节:
使用
time
和
imgCount
合成文件名,使用
Save Render Target to JPG
函数将渲染好的纹理目标保存成JPG图像到本地。
Save Render Target to JPG
函数需要我们在C++中实现,这部分请看第2章。
2. C++实现
2.1 创建C++蓝图函数库类
2.2 编写保存图像函数
我的类命名为
imgSaver
,编写h与cpp如下:
- 头文件
// For copyright see LICENSE in EnvironmentProject root dir, or https:
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Engine/TextureRenderTarget2D.h"
#include "imgSaver.generated.h"
/**
*
*/
UCLASS()
class ENVIRONMENTPROJECT_API UimgSaver : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "Image Saving")
static void SaveRenderTargetToJPG(UTextureRenderTarget2D* RenderTarget, const FString& FilePath, int32 Quality = 100);
};
- 源文件
// For copyright see LICENSE in EnvironmentProject root dir, or https:
#include "imgSaver.h"
#include "IImageWrapper.h"
#include "IImageWrapperModule.h"
#include "ImageUtils.h"
#include "Misc/FileHelper.h"
#include "Engine/TextureRenderTarget2D.h"
void UimgSaver::SaveRenderTargetToJPG(UTextureRenderTarget2D* RenderTarget, const FString& FilePath, int32 Quality)
{
// 实现保存图片的代码
if (!RenderTarget)
{
// 打印错误信息
return;
}
FTextureRenderTargetResource* RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource();
FReadSurfaceDataFlags ReadSurfaceDataFlags;
ReadSurfaceDataFlags.SetLinearToGamma(false); // 我们处理的是线性颜色空间的数据
TArray<FColor> OutBMP;
if (RenderTargetResource->ReadPixels(OutBMP, ReadSurfaceDataFlags))
{
IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
if (ImageWrapper.IsValid() && ImageWrapper->SetRaw(OutBMP.GetData(), OutBMP.GetAllocatedSize(), RenderTarget->SizeX, RenderTarget->SizeY, ERGBFormat::BGRA, 8))
{
auto JPEGData = ImageWrapper->GetCompressed(Quality);
FFileHelper::SaveArrayToFile(JPEGData, *FilePath);
}
}
}
2.3 编译项目
3. 使用catcher类
3.1 创建渲染目标
要创建RGB与MASK的
渲染目标
对象。
双击修改渲染目标属性,
尺寸X/Y
代表输出图像分辨率可以自由设置,
渲染目标格式
设置为
RTF RGBA8 SRGB
,
目标伽马
设置为
2.2
,如下:
3.2 catcher配置
将RGB与MASK的
渲染目标
对象设置为catcher的纹理目标。
设置MASK场景捕获组件,
仅显示actor
选择你需要生成掩码的模型actor
3.3 设置采图视场
可通过调整摄像机组件的
焦距
实现,预览图像即最终保存图片视场。
设置完成后
运行
即可保存rgb与mask图像到本地。
热门推荐
美不胜收,世博文化公园双子山游览记
C语言编程中如何保留两位小数
血糖高患者可以食用的零食有哪些?
照片如何标签化管理系统
50岁以上老年人保险买什么 要注意什么问题
开飞机需要什么驾照
服用六味地黄丸人群 四适宜三慎用
六味地黄丸可以空腹食用吗
糖尿病进入靶向治疗新时代!两类已上市新降糖药,终将成主流!
用凡·高的画作点亮你的春天
燃油添加剂的作用及正确使用方法
如何判断马桶水封是否正常
掘金vs湖人:西部强强对话,谁能笑到最后?
中国女排历次奥运成绩:三次夺冠,一次亚军,更多的是苦涩
打官司赢了诉讼费和律师费谁负责
聪明人贾诩:三国时期最具传奇色彩的谋士
大河奔流—我与黄河文化地标|黄河三游划分的地理特征与历史元素
Obsidian 双端同步教程:Windows 与 iOS 设置全攻略
中国版星链!千帆极轨03组卫星发射成功
淄博公积金贷款额度及计算方法详解
小活络丸的副作用有哪些?
AI 学习方法与算法现状
不吃早餐引起的胆囊息肉怎么办
中国保险业法规与市场发展现状分析
跨境电商选品的策略和方法
中国游客引导全球旅游体验创新
小米手机如何校准陀螺仪
5种“稀罕花”,极度耐寒冷,北方长成树,呼呼“喷雪花”
家庭中帮家人缓解口干口苦有哪些小秘诀?
六小龄童谈黑神话悟空:经典文化在新时代的传承与创新