No estoy seguro sobre el error, pero echa un vistazo a la documentación de cv. RunningAvg Dice que el destino debe ser de 32 o 64 bits punto flotante. Así que hice una pequeña corrección en su código y funciona. Creé una imagen de punto flotante de 32 bits para almacenar valores promedio corrientes. Entonces otra imagen de 8 bits para que pueda mostrar la imagen de promedio en ejecución: Ahora vea el resultado: En un instante en particular, he guardado un marco y su marco de ejecución promedio correspondiente. Puedes ver el obstáculo (mi mano) bloquea los objetos detrás. Ahora el marco promedio de ejecución: casi se quita mi mano y muestra objetos en el fondo. Así es como es una buena herramienta para la sustracción de fondo. Un ejemplo más de un video de tráfico típico: Hola, este va a ser un artículo muy simple, pero le resultará muy útil. Se trata de extracción de fondo de un vídeo. Suponga que se le da un video de la cantidad de tráfico, puede ser algo como esto. Tráfico en la India. Y se le pide que encuentre un fondo aproximado. O algo así. La extracción de fondo es importante en el seguimiento de objetos. Si ya tiene una imagen del fondo desnudo, entonces es simple. Pero en muchos casos, usted no tendrá tal imagen y así, usted tendrá que crear uno. Ahí es donde Running Average viene muy bien. (Pensé en esto cuando un chico hizo una pregunta en SOF. Link) La función que usamos aquí para encontrar Running Average es cv2.accumulateWeighted (). Por ejemplo, si estamos viendo un video, seguimos alimentando cada fotograma a esta función, y la función sigue encontrando los promedios de todos los fotogramas alimentados a ella según la siguiente relación: src no es más que nuestra imagen de origen. Puede ser en escala de grises o imagen en color y 8 bits o 32 bits punto flotante. Dst es la imagen de salida o acumulador con los mismos canales que la de la imagen de origen, y es de 32 bits o de 64 bits punto flotante. Además, debemos declararlo primero a un valor que se tomará como valor inicial. Alpha es el peso de la imagen de entrada. De acuerdo con Docs, alfa regula la velocidad de actualización (qué tan rápido el acumulador 8220forgets8221 sobre imágenes anteriores). En palabras simples, si alfa es un valor más alto, la imagen promedio intenta capturar cambios muy rápidos y cortos en los datos. Si es un valor más bajo, el promedio se vuelve lento y no considerará cambios rápidos en las imágenes de entrada. Voy a explicar un poco con la ayuda de imágenes al final del artículo. En el código anterior, he establecido dos promedios, uno con mayor valor alfa y otro con menor valor alfa para que pueda entender el efecto de alfa. Al principio ambos se fijan al marco inicial de la captura. Y en loop se actualizan. Puedes ver algunos resultados en el enlace SOF que ya he proporcionado. (Proporciono esos resultados aquí, usted puede comprobar el código y el valor del alfa allí): Utilicé mi webcam y guardé el marco original y el funcionamiento medio en un instante particular. Este es un marco de un típico video de tráfico tomado por una cámara fija. Como puede ver, un coche va en el camino, y la persona está tratando de cruzar el camino en un instante determinado de tiempo. Pero vea el promedio en ese momento. No hay persona ni automóvil en esta imagen (en realidad está ahí, mira de cerca, entonces lo verás, y la persona es más clara que el coche, ya que el coche se está moviendo muy rápido ya través de la imagen, no tiene mucho Efecto en promedio, pero la persona está allí durante mucho tiempo, ya que es lento y se mueve a través de la carretera.) Ahora necesitamos ver el efecto de alfa en estas imágenes. Detección de movimiento con OpenCV Introducción y meta Siempre he querido un software Basado en la cámara web que puede detectar movimiento y grabar en un archivo de vídeo sólo algo se está moviendo. Ahora está hecho. ) De hecho, no es realmente concebible para grabar todo el tiempo, ya que la unidad de disco duro se llena rápidamente si el software tiene que ejecutar un día, por ejemplo. Porque me encanta OpenCV y du a la falta de este tipo de software en Linux he decidido hacerlo. Como se dijo antes el programa de analizar las imágenes tomadas de la cámara web y la intención de detectar el movimiento. Si se detecta un movimiento, el programa comienza a grabar la webcam en un archivo de vídeo durante 10 segundos. Después de eso, si se detecta de nuevo un movimiento, sigue grabando hasta que se detienen los movimientos. Este proyecto está alojado en mi Github. La forma trivial que tengo de implementar dos algoritmos diferentes para detectar el movimiento de la primera es la más trivial en su manera de comportarse. La idea trivial es calcular la diferencia entre dos marcos aplicar un umbral a los píxeles separados que han cambiado de los otros y luego contar todos los píxeles negros. Entonces el promedio se calcula con este recuento y el número total de píxeles y dependiendo del techo se desencadena el evento o no. El código: initRecorder: inicializar la grabadora con un códec arbitrario que puede ser cambiado con problemas en el método de ejecución no se puede detectar ningún movimiento en los primeros 5 segundos, ya que es casi el tiempo necesario para la cámara web para ajustar el foco y la luminosidad que Implica lotrsquos de los cambios en la imagen processImage: contiene todas las operaciones de imágenes aplicadas a la imagen somethingHasMoved: La iteración de la imagen para contar píxeles negros está contenida en este método El resultado: La forma inteligente lo llamo la forma inteligente, porque su manera de operar Es menos trivial que la anterior, pero los resultados son idénticos si no más precisos en el método anterior. Me inspiré del Motion-tracker de Matt Williamson para las operaciones y filtros que se aplican a la imagen, pero todo el resto es diferente. La idea en este método es encontrar los contornos de los objetos en movimiento y calcular el área de todos ellos. Entonces se compara el promedio del cambio de superficie con la superficie total de la imagen y se dispara la alarma si supera el umbral dado. Tenga en cuenta que el código mostrado a continuación no implementa el sistema de grabación como es el caso en el ejemplo anterior, pero se puede hacer fácilmente. El código: Robin David Mensajes recientes GitHub Repos Categorías
No comments:
Post a Comment