Desarrollé una aplicación web en Django que tiene un método de visualización que contiene el código OpevCV que, cuando se activa, abre la cámara web del usuario para detectar su rostro. Esta aplicación funciona bien en mi servidor local, pero cuando la he alojado en PythonAnywhere, dice que no se encontró la cámara, ya que mi alojamiento PA no sirve para una cámara.
Entonces, alguien me sugirió que abriera la cámara web a través de javascript, ya que se ocupa de la máquina cliente y luego pasar su alimentación a la máquina servidor, que es mi alojamiento.
Pero como soy un novato en Python, no puedo entender cómo realizar la tarea anterior. Encontré este fragmento de código js, pero no sé cómo ni dónde agregarlo en mi aplicación Django.
Código para obtener el feed con Javascript
var video = document.querySelector("#videoElement"); if (navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserMedia({video: true}).then(function(stream) { video.srcObject = stream; }).catch(function(err0r) { console.log("Something went wrong!"); }); }El código de My Python para abrir la cámara y detectar rostros es el siguiente (funciona en el servidor local)
import cv2 cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') cam = cv2.VideoCapture(0) while True: ret, frame = cam.read() frame = cv2.flip(frame, 1) if ret: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3) for (x, y, w, h) in faces: cropped = cv2.resize(frame[y:y+h, x:x+w], (198,198)) cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() cv2.imshow('Stream', frame)Cualquier ayuda es apreciada. Gracias de antemano
Debe obtener la transmisión de video en vivo usando javascript, luego alimentar esa transmisión a opencv2 para que funcione.
Uso: obtener transmisión de video en vivo en nodejs
Obtendrá una URL como "http://localhost:3000" que puede usar en el código python de la siguiente manera:
import cv2 cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') cam = cv2.VideoCapture('http://localhost:3000') while True: ret, frame = cam.read() frame = cv2.flip(frame, 1) if ret: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3) for (x, y, w, h) in faces: cropped = cv2.resize(frame[y:y+h, x:x+w], (198,198)) cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() cv2.imshow('Stream', frame)Solía hacer algo similar, el esquema que usé fue el siguiente:

Como ya sabe, necesitamos javascript para obtener la imagen del usuario de la cámara web. Encontré un artículo que nos muestra cómo hacerlo, puede usar solo el lado frontal (el archivo HTML) si desea usar Django. Ese código es para obtener imágenes y codificarlas en base64 (cadena) y enviarlas a través de websocket.
Después de eso, queremos que Django sirva websocket. En el pasado, lo hice con Flask, no con Django, pero puede ver cómo puede crear un servidor websocket usando django-channel .
Para el último paso, necesita una función con su código OpenCV. Necesitas decodificar base64 y convertirlo a opencv
def modify_picture(img_data): # decode image img = from_b64(img_data) # your OpenCV filter gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # encode image to base64 return to_b64(gray) Y, por supuesto, no necesita while True y cv2.imshow , pero devuelva la versión base64 de su nueva imagen. Espero eso ayude.
Actualización: escribo un código de muestra en mi github . No en Django, pero sí en Python. Espero que te dé más información.