OpenCV + Unity + Python (интеграции)

появилась необходимость совместить Unity3d и OpenCV (желательно с NumPy, так как оттуда тоже будут использоваться функции, то есть еще +Python нужен). Основная идея передавать изображение с камеры из Unity в OpenCV для обработки и последующей отправки действий обратно в Unity.

Перепробовал много вариантов, сделал через получение потока байт картинки из RenderTexture (Unity) и отправку на сервер на python на websockets. Все работает, и скорость передачи приемлемая, но во время "фотографирования" текстуры уходит много ресурсов и основной поток Unity зависает... таким образом у меня выходит 5 fps, что не годится. Хочу переписать через более правильный путь: либо интегрировать openCV в unity, либо доставать текстуру из видеопамяти (но там жуткий C++ и openGL, мне же в итоге хочется получить python, так как нужен numPy).

Опишу, что пробовал: стримить через FMETP STREAM (не завелся фронт под него, то есть все работает, но картинку не передает, в браузере не отображается), потом поставить в IronPython openCV и использовать уже их в C# (не получилось установить opencv никак), пробовал поставить модули для C#: OpenCVSharp (вроде с этим пакетом все норм), NumSharp (не хватает некоторых методов, которые будут использоваться в проекте), ну и способ передачи через сокет изображения (работает, но ужасно долго и лагает)... в каждом варианте пробовал и изучал почти все досконально.

Собственно, хочел спросить совет, какую интеграцию лучше выбрать, как лучше сделать?

Код, который я использую для отправки изображений на сервер: 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);
    }

Ответы (0 шт):