es necesario combinar Unity3d y OpenCV (preferiblemente con NumPy, ya que las funciones también se utilizarán desde allí, lo que significa que también se necesita +Python). La idea principal es pasar imágenes de la cámara de Unity a OpenCV para su procesamiento y luego enviar acciones a Unity.
Probé muchas variantes, hechas tomando un flujo de bytes de imagen de RenderTexture (Unity) y enviándolo al servidor de python en websockets. Todo funciona, y la velocidad de transferencia es aceptable, pero durante el "fotografiado" de la textura se consumen muchos recursos y se cuelga el hilo principal de Unity... así que obtengo 5 fps, lo cual no es bueno. Quiero reescribirlo de la manera correcta: integre openCV en la unidad o extraiga la textura de la memoria de video (pero eso es horrible C ++ y openGL, quiero obtener python, porque necesito numPy).
Intenté transmitir con FMETP STREAM (no ha iniciado el front-end, lo que significa que funciona, pero la imagen no se muestra en el navegador), luego puse IronPython openCV y los usé en C # (no puedo instalar opencv de ninguna manera), probé para poner módulos para C #: OpenCVSharp (parece estar bien con este paquete), NumSharp (carece de algunos métodos para usar en el proyecto) y el método de transferencia de imagen de socket (funciona, pero terriblemente largo y con retrasos). .. en cada variante probé y estudié casi todo a fondo.
En realidad, quería pedir un consejo, ¿qué integración es mejor elegir, cómo hacerlo mejor?
Código que uso para enviar bytes de imágenes al servidor de 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); }Su solución original está ejecutando todo en su hilo principal en la unidad. Por lo tanto, se retrasará como se esperaba. Y está codificando como PNG, los datos serán enormes.
En FMETP STREAM , usaron un codificador de subprocesos múltiples, que al menos debería resolver su problema de rendimiento. Es por eso que puede funcionar sin problemas en dispositivos de gama baja y auriculares VR.
El byte de salida [] son fragmentos de jpeg, en lugar de una imagen. Fue diseñado para el límite de tamaño de paquete UDP.
Si intenta decodificar la imagen de FMETP STREAM por su cuenta, debe combinar esos bytes[] en un jpeg completo. No será demasiado difícil referirse a su decodificador en C#.
PD: Para obtener soporte técnico, comuníquese directamente con el desarrollador.