1

我正在尝试做两件事:

  1. 从相机中检索 84 x 84 x 3 像素阵列
  2. 将此数组发送到可以显示的 python 脚本

我坚持使用 1),所以目前我只是将字节数组写入 txt 文件,然后在 python 中打开文件。然而,我不断得到这张图片,这让我相信字节数组实际上并没有被像素数据正确实例化。[ 图像] 1

这是 C# 统一代码:

using System.IO;
using UnityEngine;
using MLAgents.Sensors;
// using UnityEngine.CoreModule;

public class TrainingAgent : Agent, IPrefab
{

    public Camera cam;
    private RenderTexture renderTexture;
    public int bytesPerPixel;
    private byte[] rawByteData;
    private Texture2D texture2D;
    private Rect rect;


    public override void Initialize()
    {

        renderTexture = new RenderTexture(84, 84, 24);
        rawByteData = new byte[84 * 84 * bytesPerPixel];
        texture2D = new Texture2D(84, 84, TextureFormat.RGB24, false);
        rect = new Rect(0, 0, 84, 84);
        cam.targetTexture = renderTexture;
    }

    public override void CollectObservations(VectorSensor sensor)
    {
        run_cmd();
    }

    private void run_cmd()
    {

        cam.Render();
        // Read pixels to texture
        RenderTexture.active = renderTexture;
        texture2D.ReadPixels(rect, 0, 0);
        Array.Copy(texture2D.GetRawTextureData(), rawByteData, rawByteData.Length);
        File.WriteAllBytes("/Path/to/byte/array/Foo.txt", rawByteData); // Requires System.IO
    }
}

这是python代码:

from PIL import Image
import numpy as np
fh = open('/Path/to/byte/array/foo.txt', 'rb')
ba = bytearray(fh.read())
data = np.array(list(ba)).reshape(84,84,3)
img = Image.fromarray(data, 'RGB')
img.show()

任何帮助将不胜感激,因为我不知道哪里出错了,而且我的调试尝试似乎是徒劳的。

4

1 回答 1

2

我不确定(不详细了解 python),但我不认为GetRawTextureData这是你想在这里使用的。

您宁愿使用ImageConversion.EncodeToJPG(former Texture2D.EncodeToJPG)导出实际的图像二进制文件,例如 JPG

将此纹理编码为 JPG 格式。

返回的字节数组是 JPG“文件”。您可以将它们写入磁盘以获取 JPG 文件,通过网络发送它们等。

此函数仅适用于未压缩的非 HDR 纹理格式。您必须在 Texture Import Settings 中启用纹理的 Read/Write Enabled 标志。编码的 JPG 数据将没有 Alpha 通道。

然后将其作为实际图像文件加载到 python 中。

在您的代码中,这相当于将最后两行 C# 行替换为:

rawByteData = ImageConversion.EncodeToJPG(texture2D);
File.WriteAllBytes("/Path/to/jpg/foo.jpg", rawByteData);
于 2020-07-10T16:27:24.433 回答