TArray<uint8> UGTCaptureComponent::CaptureNpyFloat16(FString Mode, int32 Channels) { // Flush location and rotation check(CaptureComponents.Num() != 0); USceneCaptureComponent2D* CaptureComponent = CaptureComponents.FindRef(Mode); TArray<uint8> NpyData; if (CaptureComponent == nullptr) { UE_LOG(LogUnrealCV, Error, TEXT("Component for mode %s not found. Returning empty array."), *Mode); return NpyData; } // Attach this to something, for example, a real camera const FRotator PawnViewRotation = Pawn->GetViewRotation(); if (!PawnViewRotation.Equals(CaptureComponent->GetComponentRotation())) { CaptureComponent->SetWorldRotation(PawnViewRotation); } UTextureRenderTarget2D* RenderTarget = CaptureComponent->TextureTarget; int32 Width = RenderTarget->SizeX, Height = RenderTarget->SizeY; TArray<FFloat16Color> ImageData; FTextureRenderTargetResource* RenderTargetResource; ImageData.AddUninitialized(Width * Height); RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource(); RenderTargetResource->ReadFloat16Pixels(ImageData); // Check the byte order of data // Compress image data to npy array // Generate a header for the numpy array NpyData = NpySerialization(ImageData, Width, Height, Channels); return NpyData; }
void SaveExr(UTextureRenderTarget2D* RenderTarget, FString Filename) { SCOPE_CYCLE_COUNTER(STAT_SaveExr) int32 Width = RenderTarget->SizeX, Height = RenderTarget->SizeY; TArray<FFloat16Color> FloatImage; FloatImage.AddZeroed(Width * Height); FTextureRenderTargetResource* RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource(); RenderTargetResource->ReadFloat16Pixels(FloatImage); TArray<uint8> ExrData = SerializationUtils::Image2Exr(FloatImage, Width, Height); FFileHelper::SaveArrayToFile(ExrData, *Filename); }