Captura de video desde un teléfono inteligente Android usando OpenCV Python

Acabo de comenzar a aprender OpenCV usando Python y el primer tutorial comienza con la captura de video usando una cámara web portátil integrada o una cámara web externa. Y como iba a pasar, no tengo ninguno. Así que pensé si sería posible usar la cámara de mi teléfono inteligente Android y luego capturar ese video usando IP para un procesamiento posterior.

Mi Smartphone: Moto E

OS: Windows 7

Idioma: Python

Aplicación para Android: IP Webcam

He buscado en la red ampliamente, pero no puedo encontrar ninguna solución que funcione, así que, ¿alguien puede guiarme sobre cómo capturar el video desde mi teléfono inteligente usando la cámara web IP?

Perdón por no publicar ningún código, ya que solo tengo una tendencia en este campo, así que no tengo ni idea.

Gracias.

Esto es probablemente mucho más difícil de lo que estás esperando, por una variedad de razones.

El primero sería el ancho de banda. Un modesto flujo de video en bruto (640×480 píxeles, 8 bits por canal, 30 cuadros por segundo), requiere un ancho de banda del orden de 200 Mbps. Si bien el USB (2) alcanza fácilmente estas velocidades, será difícil encontrar una conexión inalámbrica que lo haga de manera confiable.

Ahora puedes estar pensando

¿Cómo es posible que pueda ver videos de internet de 1080p en mi teléfono sin ningún problema?

Prácticamente todos los videos transmitidos a través de una red se comprimen mediante algoritmos especializados, como MPEG4, H.264 y VP8. Estos algoritmos reducen enormemente el ancho de banda necesario para transmitir video.

¡Genial! Entonces puedo simplemente comprimir el video de mi teléfono en vivo y transmitirlo a mi computadora

¡No tan rapido! Hay dos problemas principales con eso.

La primera es que, para lograr una reducción tan drástica en la cantidad de datos de video, los compresores de video ( codificadores ) deben gastar una gran cantidad de potencia de procesamiento para procesar el video. Probablemente encontrará que su teléfono no tiene suficiente potencia de CPU (o hardware dedicado) para codificar el video a una resolución y velocidad de cuadros que puede utilizar para su tarea.

Si logra resolverlo y encuentra una aplicación que haga el trabajo, el segundo problema es que, para obtener los datos de video (codificados) en OpenCV, ¡tendrá que decodificarlos! Puede encontrar software fácilmente disponible para decodificar archivos de video, pero para decodificar una transmisión de video en vivo, necesitará progtwigr su software para realizar la deencoding (preferiblemente utilizando una biblioteca o el propio OpenCV ).

En este punto, estará maldiciendo y lamentando no haber gastado los $ 15 en una cámara web (pero habrá aprendido muchas cosas interesantes en el proceso 🙂

La transmisión de video de la aplicación ‘IP Webcam’ de Android se importa a Python OpenCV usando urllib y numpy;)

import urllib import cv2 import numpy as np import time # Replace the URL with your own IPwebcam shot.jpg IP:port url='http://192.168.2.35:8080/shot.jpg' while True: # Use urllib to get the image and convert into a cv2 usable format imgResp=urllib.urlopen(url) imgNp=np.array(bytearray(imgResp.read()),dtype=np.uint8) img=cv2.imdecode(imgNp,-1) # put the image on screen cv2.imshow('IPWebcam',img) #To give the processor some less stress #time.sleep(0.1) if cv2.waitKey(1) & 0xFF == ord('q'): break 

Aquí hay un repo que hace transmisión en vivo de Android Video:

Este hilo parece ser viejo pero solo quiero agregar mi respuesta. Así es como pude lograr la tarea en Python 3.5, OpenCV 3.2 y la aplicación de Android “IP WEB CAM”. La url ( http://192.168.0.103:8080 ) en la función obtener es la dirección de transmisión proporcionada por la aplicación ip web cam.

 import requests import numpy as np import cv2 while True: img_res = requests.get("http://192.168.0.103:8080/shot.jpg") img_arr = np.array(bytearray(img_res.content), dtype = np.uint8) img = cv2.imdecode(img_arr,-1) cv2.imshow('frame', img) if cv2.waitKey(1) & 0xFF == ord('q'): break