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图像到本地。
热门推荐
免疫原性,一文看懂!
三份公告不可少,农村征地须明了:守护农民权益的关键步骤!
记忆规律 —— 学习的 “导航图”
汽车贴膜如何操作?步骤和注意事项有哪些?
黑茶与减肥:真相与迷思
婴儿奶粉室温保存多久(婴儿奶粉存放温度)
旅游主题基金有哪些,旅游基金排行前十名
如何大幅度提高电脑音质?五个实用方法让你的听觉体验更上一层楼
音响不用功放的解决办法是什么?这种解决办法的效果如何?
白骨顶与黑水鸡之辨:观鸟者必备指南
一线城市首个!广州配售型保障性住房来了
胃反流食管炎患者的饮食指南
克拉霉素使用禁忌全解析:四类人群需谨慎,八类药物勿联用
最新研究:“死亡走马灯”真的存在?大脑死亡过程中或还在进行意识处理
高考复习技巧有哪些(有效的复习技巧)
生活小知识宝典,提升生活质量的实用技巧
揭秘野鸭子的飞行奥秘:从遗传到环境的完美融合
流行性腮腺炎的主要传播途径
油烟机选购指南:风量风压等关键要点解析
如何保障 MySQL 数据库和 Redis 缓存数据一致性
亚洲前首富李兆基逝世:大半生为内地大举捐款,曾说赚了钱要回馈社会
枳实和枳壳的区别
现代战争游戏:沉浸式战场体验背后的魅力与挑战
换机油有什么用?应该什么时候换机油?
汽车美容:如何全面养护与提升车辆性能与价值?
固特异轮胎规格如何解读?这些规格对驾驶性能有何影响?
学习“质量互变规律”有感
泉州安溪藤铁:传统技艺的"新质"故事
我的世界地下城隐藏关卡解锁攻略
《西西弗神话》:荒诞人生的启示录?