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);
}