【问题标题】:Unity + OpenCV + Python (integreation)Unity + OpenCV + Python(集成)
【发布时间】:2021-02-12 13:52:19
【问题描述】:

需要将 Unity3d 和 OpenCV 结合起来(最好使用 NumPy,因为那里也将使用函数,这意味着还需要 +Python)。主要思想是将相机中的图像从 Unity 传递到 OpenCV 进行处理,然后将动作发送回 Unity。

我尝试了许多变体,通过从 RenderTexture (Unity) 获取图片字节流并将其发送到 websockets 上的 python 服务器。一切正常,传输速度可以接受,但是在纹理的“拍摄”过程中需要大量资源并且Unity的主线程挂起......所以我得到5 fps,这并不好。我想以正确的方式重写它:要么将openCV集成到unity中,要么从视频内存中提取纹理(但那是可怕的C++和openGL,我想要python,因为我需要numPy)。

我尝试使用 FMETP STREAM 进行流式传输(它尚未启动前端,这意味着它可以工作,但图像未显示在浏览器中),然后放入 IronPython openCV 并在 C# 中使用它们(我无法以任何方式安装 opencv ),尝试为 C# 放置模块:OpenCVSharp(这个包似乎没问题)、NumSharp(缺少在项目中使用的一些方法)和套接字图像传输方法(有效,但非常长且滞后)。 .. 在每个变体中都尝试并彻底研究了几乎所有内容。

其实就是想请教一下,选择哪个集成比较好,怎么做比较好?

我用来将图像字节发送到 python 服务器的代码:https://pastebin.com/pRyutRcj

    WebSocket ws;

    void Start () {

        ws = WebSocketFactory.CreateInstance("ws://localhost:12345");

        // ...

        // Connect to the server
        ws.Connect();

        InvokeRepeating("Capture", 1f, 0.2f);  //1s delay, repeat every 1s

    }

    public void Capture()
    {
        RenderTexture activeRenderTexture = RenderTexture.active;
        RenderTexture.active = Camera.targetTexture;

        Camera.Render();

        Texture2D image = new Texture2D(Camera.targetTexture.width, Camera.targetTexture.height);
        image.ReadPixels(new Rect(0, 0, Camera.targetTexture.width, Camera.targetTexture.height), 0, 0);
        image.Apply();
        RenderTexture.active = activeRenderTexture;

        byte[] bytes = image.EncodeToPNG();
        Destroy(image);


        ws.Send(bytes);
    }

【问题讨论】:

    标签: python numpy opencv unity3d


    【解决方案1】:

    您最初的解决方案是统一运行主线程中的所有内容。因此,它将按预期滞后。而且您正在编码为PNG,数据将是巨大的。

    FMETP STREAM中,他们使用了多线程编码器,这至少应该可以解决您的性能问题。这就是它可以在低端设备和 VR 耳机上流畅运行的原因。

    输出 byte[] 是 jpeg 块,而不是一个图像。它是为 UDP 数据包大小限制而设计的。

    如果您尝试自己解码 FMETP STREAM 的图像,则必须将这些 byte[] 组合成一个完整的 jpeg。在 C# 中引用他们的解码器不会太难。

    PS:如需技术支持,请直接联系开发者。

    【讨论】:

    • 非常感谢。在 python 端将块解码为整个图像没有问题(字节只是基于 64 的像素数组,所以我只需要 numPy)。所以是的,多线程可能会解决我的主要问题,但现在我已经按照 reddit 上有人建议的那样做了:只需使用 PIL 和 win32gui(或 Mac 的 Quarz)从窗口中抓取图像(如流式传输),但出现了太多在 Mac 中捕获图像的速度问题,所以我不得不放弃这个平台。
    猜你喜欢
    • 2016-04-19
    • 2021-10-12
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多