问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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图像到本地。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号