Unity+OpenCV+Python(集成创建)

2024-09-20 22:53:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我尝试了许多变体,通过从RenderTexture(Unity)拍摄字节流并将其发送到WebSocket上的python服务器来实现。一切正常,传输速度可以接受,但在“拍摄”纹理的过程中,需要大量资源,统一的主线挂起。。。所以我得到5帧,这是不好的。我想重写它:要么将OpenCV集成到Unity,要么从视频内存中提取纹理(但是这是可怕的C++和OpenGL,我想得到Python,因为我需要NoMPY)。p>

我尝试使用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);
    }

Tags: 图像image服务器字节wsunity变体opencv
1条回答
网友
1楼 · 发布于 2024-09-20 22:53:15

您最初的解决方案是运行unity主线程中的所有内容。因此,它将如预期的那样滞后。如果您将其编码为PNG,那么数据将非常庞大

在FMETP流中,他们使用了多线程编码器,这至少可以解决性能问题。这就是为什么它可以在低端设备和虚拟现实耳机上平稳运行的原因

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

如果您试图自己解码FMETP流的图像,则必须将这些字节[]合并成一个完整的jpeg。用C#来引用他们的解码器不会太困难

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

相关问题 更多 >

    热门问题