- Configuración de Raspberry Pi con Buster y OpenCV
- Agregar zumbador a la pantalla Raspberry Pi de 5 pulgadas
- Programación de Raspberry Pi para detección de movimiento CCTV
- Detección de movimiento en OpenCV usando Raspberry Pi
- Configuración de alarma para detección de movimiento
- Supervisión de la temperatura y el uso de la CPU
- Lanzamiento de su detector de movimiento Pi CCTV
OpenCV es una herramienta poderosa y combinada con Raspberry Pi puede abrir puertas a muchos dispositivos inteligentes portátiles. En nuestro artículo anterior de monitoreo de CCTV de Raspberry Pi, aprendimos cómo obtener video de CCTV en vivo desde un DVR usando RTSP y mostrarlo en una Raspberry Pi, verifique eso antes de continuar. En este artículo, aprenderemos cómo aprovechar el poder de OpenCV y construir un sistema de detección de movimiento Raspberry Pi en nuestras grabaciones de CCTV en vivo. Si no tiene un CCTV instalado, aún puede construir un sistema de vigilancia Raspberry Pi conectando cámaras USB directamente a su Pi. Y si no eres un gran fanático de Pi y Python, puedes construir algo similar con ESP32, consulta ESP32 Wi-Fi Door Bell para obtener más detalles.
Escribiremos un script de Python que pueda monitorear las cuatro cámaras CCTV simultáneamente para cualquier actividad (movimiento). Si se detecta una actividad en cualquier cámara, nuestra Raspberry Pi cambiará automáticamente a la pantalla de esa cámara en particular y resaltará qué actividad tuvo lugar, todo esto en tiempo real con solo 1,5 segundos de retraso. También agregué una función de alarma, como un timbre que puede alertar al usuario con un pitido si se detecta una actividad. ¡Pero puede escalar fácilmente esto para enviar un mensaje o correo electrónico o lo que sea! Emocionante derecho !! Empecemos
Configuración de Raspberry Pi con Buster y OpenCV
Estoy usando Raspberry Pi 3 B + con Buster OS ejecutándose y la versión de OpenCV es 4.1. Si es completamente nuevo, siga los tutoriales a continuación antes de comenzar.
El objetivo es tener tu Pi lista para el desarrollo. Está bien tener cualquier versión del sistema operativo Raspbian en su Pi, pero asegúrese de que la versión de OpenCV sea 4.1 o superior. Puede seguir el tutorial anterior para compilar su OpenCV, que tomará horas pero es más confiable para proyectos pesados o simplemente instalarlo directamente desde pip usando los siguientes comandos.
$ pip instalar opencv-contrib-python == 4.1.0.25
Si está instalando OpenCV con pip por primera vez, también debe instalar las otras dependencias. Utilice los siguientes comandos para eso.
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev $ sudo apt-get install libatlas-base-dev gfortran $ sudo apt-get install libhdf5- dev libhdf5-serial-dev libhdf5-103 $ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
Ya hemos creado muchos proyectos OpenCV de Raspberry Pi, también puede consultarlo para obtener más inspiraciones.
Agregar zumbador a la pantalla Raspberry Pi de 5 pulgadas
En cuanto al hardware, no tenemos mucho más que una pantalla de 5 pulgadas y un zumbador. Después de conectar la pantalla de 5 pulgadas con Raspberry Pi, podemos montar directamente el zumbador en la parte posterior de la pantalla, que ha extendido algunos pines GPIO para nosotros. He conectado mi zumbador como se muestra a continuación-
Si está interesado en utilizar más pines de E / S, la siguiente descripción de los pines será útil. Como puede ver entre los pines extendidos, la pantalla misma utiliza la mayoría de los pines para una interfaz de pantalla táctil. Pero aún así, tenemos pines 3,5,7,8,10,11,12,13,15,16 y 24 que no tienen conexión y podemos usarlo para nuestra propia aplicación. En este tutorial, he conectado un timbre a GPIO 3.
Programación de Raspberry Pi para detección de movimiento CCTV
La secuencia de comandos de Python completa para este proyecto se puede encontrar en la parte inferior de esta página, pero analicemos cada segmento del código para comprender cómo funciona.
Monitoreo de múltiples cámaras sin retraso en Raspberry Pi usando RTSP
La parte desafiante para hacer que esto funcione fue reducir la carga en Raspberry pi para evitar un retraso en la transmisión. Inicialmente, intenté cambiar entre las cuatro cámaras para buscar movimiento, pero fue muy lento (unos 10 segundos). Así que combiné las cuatro cámaras en una sola imagen e hice todas las actividades de detección de movimiento en esa imagen. Escribí dos funciones, a saber, crear una cámara y leer la cámara.
La función de creación de cámara se utiliza para abrir la cámara con su número de canal respectivo. Tenga en cuenta que la URL de RTSP termina con "02", lo que significa que estoy usando la transmisión de video de la transmisión secundaria, que será de baja resolución y, por lo tanto, más rápida de leer. Además, el tipo de códec de video que utiliza también contribuye a la velocidad, experimenté con diferentes códigos y descubrí que FFMPEG es el más rápido de todos.
def create_camera (canal): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" #cambiar la IP para adaptarla tuyo cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # El número de identificación para el ancho es 3 cap.set (4, cam_height) # El número de identificación para la altura es 480 cap.set (10, 100) # El número de identificación para el brillo es 10 límite de retorno
En la función de lectura de cámara , leeremos las cuatro cámaras, a saber, cam1, cam2, cam3 y cam4 para combinarlas todas en una sola imagen llamada Main_screen . Una vez que esta pantalla principal esté lista, haremos todo nuestro trabajo de OpenCV en esta imagen.
def read_camera (): éxito, current_screen = cam1.read () Main_screen = current_screen success, current_screen = cam2.read () Main_screen = current_screen success, current_screen = cam3.read () Main_screen = current_screen success, current_screen = cam4.read () Main_screen = retorno de la pantalla actual (Main_screen)
La imagen de la pantalla principal con las cuatro cámaras combinadas se verá como la imagen que se muestra a continuación.
Detección de movimiento en OpenCV usando Raspberry Pi
Ahora que tenemos la imagen lista, podemos comenzar con nuestra detección de movimiento. Dentro del ciclo while , comenzamos leyendo dos marcos diferentes, a saber, frame1 y frame2, luego los convertimos a escala de grises
frame1 = read_camera () # Lee el primer fotograma grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Convertir a gris frame2 = read_camera () # Lee el segundo fotograma grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_BGR2
Luego tomamos una diferencia entre estas dos imágenes para ver qué ha cambiado y con un umbral, agrupamos todos los lugares que tuvieron un cambio, como una mancha. También es común desenfocar y dilatar la imagen para evitar bordes nítidos.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) #obtén la diferencia - esto es genial blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _,resholdImage = cv2.threshold (blurImage, 20,255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (umbralImagen, kernal, iteraciones = 5)
El siguiente paso es encontrar contadores y verificar el área de cada contador, al encontrar el área, podemos averiguar qué tan grande es el movimiento. Si el área es mayor que un valor especificado en la variable motion_detected , lo consideramos como una actividad y dibujamos un cuadro alrededor del cambio para resaltarlo para el usuario.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour es una función mágica para el contorno en contornos: #para cada cambio que se detecta (x, y, w, h) = cv2.boundingRect (contorno) #obtener la ubicación donde se encontró el cambio si cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
La función find_screen () se usa para encontrar dónde tuvo lugar la actividad entre las cuatro cámaras. Podemos encontrar eso ya que conocemos los valores xey del movimiento. Comparamos estos valores xey con la ubicación de cada pantalla para encontrar qué pantalla dio actividad y nuevamente recortamos esa pantalla en particular, para poder mostrarla en la pantalla táctil pi.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Actividad en la pantalla de la cámara 1") else: screen = frame1 print ("Actividad en la pantalla de la cámara 2") else: if (y <cam_height): screen = frame1 print ("Actividad en la pantalla de la cámara 3") else: screen = frame1 print ("Actividad en la pantalla de la cámara 4") volver (pantalla)
Configuración de alarma para detección de movimiento
Una vez que sabemos, en qué pantalla se detecta movimiento, es fácil agregar cualquier tipo de alarma que necesitemos. Aquí sonará un zumbador conectado a GPIO 3. La declaración if verifica si el movimiento fue detectado en la pantalla 3 e incrementa una variable llamada trig_alarm . Puede detectar cualquier pantalla de su elección o incluso en múltiples pantallas.
si ((x> cam_width) y (y
Si el valor de trig_alarm alcanza más de 3, emitiremos un pitido una vez. La razón de este recuento es que a veces noté que las sombras o los pájaros creaban una alarma falsa. De esta manera, solo si hay una actividad continua durante 3 cuadros, obtendremos una alarma.
if (trig_alarm> = 3): # esperar conts 3 movimientos #Bip el zumbador GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Supervisión de la temperatura y el uso de la CPU
El sistema está sangrado para funcionar 24x7 y, por lo tanto, el Pi puede calentarse mucho, por lo que decido controlar la temperatura y el uso de la CPU mostrando esos valores en la pantalla. Hemos obtenido esta información utilizando la biblioteca gpiozero.
cpu = CPUTemperature () load = LoadAverage () cpu_temperature = str ((cpu.temperature) // 1) load_average = str (load.load_average) #print (cpu.temperature) #print (load.load_average) cv2.putText (display_screen, cpu_temperature, (250,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1) cv2.putText (display_screen, load_average, (300,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,255,0), 2)
Lanzamiento de su detector de movimiento Pi CCTV
He probado esto durante días para recopilar y funciona cada vez y fue realmente una construcción divertida hasta que dañé una cámara,