UE4.27 使用蓝图实现RGB与掩码图像采集

最近需要使用虚幻引擎制作虚拟目标检测数据集,要求同时生成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事件
    用于保存每一帧图像到本地。
    在这里插入图片描述
    看一下细节:
    在这里插入图片描述
    使用timeimgCount合成文件名,使用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图像到本地。

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值