es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La entrada de la cámara web enviada a través de OpenCV a pyvirtualcam resulta en una velocidad de fotogramas lenta (Mac).

Hola gente inteligente de este planeta.

Estoy manipulando video en vivo desde mi webcam (MacBook) para realizar una detección facial utilizando OpenCV y luego exportarlo a una cámara virtual utilizando pyvirtualcam (OBS). Al hacer esto, puedo abrir el video en vivo manipulado durante reuniones en Google Meet, Zoom, etc.

Hasta ahora he logrado que todo funcione, PERO es súper lento, aunque estoy configurando la velocidad de fotogramas en 20 FPS, es más bien como 2 FPS.

¿Alguien tiene alguna idea de cómo puedo optimizar esto para obtener un video fluido?

Este es mi código (detecta caras y coloca un rectángulo rojo alrededor de ellas):

import cv2
import pyvirtualcam
import face_recognition

captr = cv2.VideoCapture(1)
fmt = pyvirtualcam.PixelFormat.BGR
face_locations = []
with pyvirtualcam.Camera(width=1280, height=720, fps=20, fmt=fmt) as cam:
    while True:
        retval, frame = captr.read()
        face_locations = face_recognition.face_locations(frame)

        for top, right, bottom, left in face_locations:
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        frame = cv2.resize(frame, (1280, 720), interpolation=cv2.BORDER_DEFAULT)

        # cv2.imshow('my webcam', frame)
        cam.send(frame)
        cam.sleep_until_next_frame()
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break  # esc to quit
cv2.destroyAllWindows()
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    ¡Hola! Por tu código, parece que estás utilizando una configuración de alta resolución de 1280×720 con una frecuencia de cuadro de 20fps, lo cual podría ser demasiado exigente para tu hardware manejar en tiempo real. Aquí tienes algunas sugerencias para optimizar tu código:

    1. Reducir la resolución: Intenta disminuir la resolución a 640×480 o incluso a 320×240. Esto debería reducir la cantidad de datos que el ordenador necesita procesar y podría acelerar el rendimiento.

    2. Utilizar una frecuencia de cuadro más baja: Prueba a reducir la frecuencia de cuadro a 10fps o incluso a 5fps. Una vez más, esto debería reducir la cantidad de datos que el ordenador necesita procesar.

    3. Utilizar la multiprocesamiento: Una posible razón para el rendimiento lento es que el algoritmo de detección de rostros está bloqueando el hilo principal de ejecución. Puedes intentar mover la detección de rostros a un hilo separado y utilizar una cola segura para hilos para pasar los frames de video entre hilos.

    4. Utilizar aceleración por hardware: Muchas CPUs y GPUs modernas vienen con hardware especializado para el procesamiento de imágenes y videos. Puedes utilizar las funciones de aceleración por hardware de OpenCV para acelerar el rendimiento. Por ejemplo, puedes intentar utilizar aceleración OpenCL o CUDA para algunas de las tareas de procesamiento de imágenes.

    5. Perfilado de tu código: Antes de realizar cualquier optimización, es útil saber dónde está el cuello de botella. Puedes utilizar las herramientas de perfilado integradas de Python o herramientas de terceros como cProfile o el perfilador de PyCharm para identificar las áreas de tu código que son más lentas y concentrar tus esfuerzos de optimización allí.

Comments are closed.