您好,欢迎来到汇智旅游网。
搜索
您的当前位置:首页UE4.27 使用蓝图实现RGB与掩码图像采集

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

来源:汇智旅游网

效果

  • rgb图像

  • mask图像


0. 基本思路

使用蓝图与C++实现功能。

  • 蓝图部分:使用场景捕获2D组件将画面渲染至渲染目标
  • C++部分:将渲染目标保存至本地图片

1. 蓝图实现

1.1 蓝图类创建

创建catcher蓝图类继承Actor。为了实现功能的易用性我设计了一些额外的组件与变量,来丰富功能。

  • 组件

  • 变量

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- hzar.cn 版权所有 赣ICP备2024042791号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务