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图像到本地。
热门推荐
法棍面包:从巴黎面包节到非遗名录的文化之旅
白炭黑轮胎:高科技材料引领汽车行业新变革!
抖音快手双管齐下:低成本引流短剧新玩法
牙痛用药大比拼:布洛芬 vs 对乙酰氨基酚,谁更胜一筹?
牙痛救星!布洛芬&对乙酰氨基酚正确用法大揭秘
春节聚会上如何优雅说不:喝酒那些事儿
周末Happy Hour:如何应对酒后朋友的情绪变化?
酒精成瘾,你的身体在抗议!
父母离世后,为何兄弟姐妹渐行渐远?深度解析家庭关系变迁
杭州自然博物馆最新打卡攻略:金蛇送喜迎新春,亲子互动乐趣多
暑假打卡浙江自然博物院:五大展区+特色活动全攻略
浙江自然博物院新展来袭!
杭州自然博物馆:环保教育的生动课堂
冬季打卡玉龙雪山:绝美雪景与实用攻略全解析
临沧三日游:探秘佤族文化,寻访茶马古道
《蛟龙行动》遭遇排片困境:一部重工业电影的春节档突围战
说真的,别再用塑料瓶装东西了!
揭秘动漫角色设计:为何许多二次元美少女都带有猫咪特征?
深圳自然博物馆:以“河流三角洲”设计,打造湾区科普新地标
走进北京自然博物馆,探索神奇的大自然
国家自然博物馆展出209件珍稀标本,九成展品首次亮相
三亚自然博物馆:探秘镇馆之宝三亚翼龙
成都自然博物馆:让科学探索从“雪”开始
揭秘酒精对青少年睡眠的双重打击
酒精真的能助眠吗?真相揭秘!
酒精中毒后的睡眠障碍:如何通过心理干预改善?
如何利用人工智能让智能制造更智能
何智亚解析:重庆特色建筑与园林设计
白公馆与洪崖洞:重庆打卡新姿势
洪崖洞到磁器口轮渡:最新攻略大揭秘!