- Configurando Raspberry Pi com Buster e OpenCV
- Adicionando campainha à tela do Raspberry Pi de 5 polegadas
- Programando Raspberry Pi para detecção de movimento CCTV
- Detecção de movimento em OpenCV usando Raspberry Pi
- Configurando Alarme para Detecção de Movimento
- Monitoramento da temperatura e uso da CPU
- Iniciando seu Detector de Movimento CFTV Pi
OpenCV é uma ferramenta poderosa e que combinada com Raspberry Pi pode abrir portas para muitos dispositivos portáteis inteligentes. Em nosso artigo anterior sobre monitoramento de CFTV Raspberry Pi, aprendemos como obter vídeo CCTV ao vivo de um DVR usando RTSP e exibi-lo em um Raspberry Pi, verifique isso antes de continuar. Neste artigo, aprenderemos como aproveitar o poder do OpenCV e construir um sistema de detecção de movimento Raspberry Pi em nossas filmagens de CFTV ao vivo. Se você não tiver um CCTV instalado, ainda pode construir um sistema de vigilância Raspberry Pi conectando câmeras USB diretamente ao seu Pi. E se você não é um grande fã de Pi e Python, você pode construir algo semelhante com ESP32, consulte ESP32 Campainha Wi-Fi para mais detalhes.
Vamos escrever um script python que pode monitorar todas as quatro câmeras CCTV simultaneamente para qualquer atividade (movimento). Se uma atividade for detectada em qualquer câmera, nosso Raspberry Pi mudará automaticamente para aquela tela de câmera específica e destacará qual atividade ocorreu, tudo isso em tempo real com apenas 1,5 segundos de atraso. Também adicionei um recurso de alarme, como uma campainha, que pode alertar o usuário por meio de um bipe se uma atividade for detectada. Mas você pode facilmente escalar isso para enviar uma mensagem ou e-mail ou o que não for! Emocionante certo !! Vamos começar
Configurando Raspberry Pi com Buster e OpenCV
Estou usando o Raspberry Pi 3 B + com o Buster OS em execução e a versão do OpenCV é 4.1. Se você for totalmente novo, siga os tutoriais abaixo antes de começar.
O objetivo é ter seu Pi pronto para o desenvolvimento. É normal ter qualquer versão do Raspbian OS no seu Pi, mas certifique-se de que a versão do OpenCV seja 4.1 ou superior. Você pode seguir o tutorial acima para compilar seu OpenCV, que levará horas, mas é mais confiável para projetos pesados, ou apenas instalá-lo diretamente do pip usando os seguintes comandos.
$ pip install opencv-contrib-python == 4.1.0.25
Se você estiver instalando o OpenCV com pip pela primeira vez, deverá instalar as outras dependências também. Use os comandos abaixo para isso.
$ 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
Já construímos muitos projetos Raspberry Pi OpenCV, você também pode verificar isso para mais inspirações.
Adicionando campainha à tela do Raspberry Pi de 5 polegadas
No lado do hardware, não temos muito mais que um display de 5 polegadas e uma campainha. Depois de fazer a interface do monitor de 5 polegadas com o Raspberry Pi, podemos montar a campainha diretamente na parte traseira do monitor, que estendeu alguns pinos GPIO para nós. Eu conectei minha campainha conforme mostrado abaixo-
Se você estiver interessado em utilizar mais pinos de E / S, a descrição do pino abaixo será útil. Como você pode ver entre os pinos estendidos, a maioria deles é utilizada pelo próprio Display para uma interface de tela sensível ao toque. Mesmo assim, temos os pinos 3,5,7,8,10,11,12,13,15,16 e 24 que não têm conexão e podemos usá-los para nossa própria aplicação. Neste tutorial, conectei uma campainha ao GPIO 3.
Programando Raspberry Pi para detecção de movimento CCTV
O script Python completo para este projeto pode ser encontrado na parte inferior desta página, mas vamos discutir cada segmento do código para entender como ele funciona.
Monitoramento de várias câmeras sem lag no Raspberry Pi usando RTSP
A parte desafiadora em fazer esse trabalho foi reduzir a carga no Raspberry pi para evitar um atraso no streaming. Inicialmente, tentei alternar entre as quatro câmeras para procurar movimento, mas estava muito lento (cerca de 10 segundos). Então, combinei todas as quatro câmeras em uma única imagem e fiz todas as atividades de detecção de movimento nessa imagem. Escrevi duas funções, a saber, criar uma câmera e ler a câmera.
A função criar câmera é usada para abrir a câmera com seu respectivo número de canal. Observe que o URL RTSP termina com “02”, o que significa que estou usando o feed de vídeo sub-stream que terá baixa resolução e, portanto, será mais rápido de ler. Além disso, o tipo de codec de vídeo que você usa também contribui para a velocidade. Experimentei diferentes códigos e descobri que o FFMPEG é o mais rápido de todos.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" # altere o IP para se adequar your cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # número de ID para largura é 3 cap.set (4, cam_height) # número de ID para altura é 480 cap.set (10, 100) # Número de ID para brilho é 10 tampa de retorno
Na função de leitura da câmera , leremos todas as quatro câmeras, ou seja, cam1, cam2, cam3 e cam4 para combiná-las em uma única imagem chamada Main_screen . Assim que esta tela principal estiver pronta, faremos todo o nosso trabalho OpenCV nesta imagem.
def read_camera (): sucesso, current_screen = cam1.read () Main_screen = current_screen sucesso, current_screen = cam2.read () Main_screen = current_screen sucesso, current_screen = cam3.read () Main_screen = current_screen sucesso, current_screen = cam4.read () Main_screen = current_screen return (Main_screen)
A imagem da tela principal com todas as quatro câmeras combinadas será semelhante à imagem mostrada abaixo.
Detecção de movimento em OpenCV usando Raspberry Pi
Agora que temos a imagem pronta, podemos começar com nossa detecção de movimento. Dentro do loop while , começamos lendo dois frames diferentes, a saber, frame1 e frame2, e então os convertemos para tons de cinza
frame1 = read_camera () #Leia o primeiro frame grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Converter em cinza frame2 = read_camera () #Leia o segundo frame grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_BGR2GRAY)
Então pegamos uma diferença entre essas duas imagens para ver o que mudou e com um limite, agrupamos todos os lugares que tiveram uma mudança, como uma espécie de bolha. Também é comum desfocar e dilatar a imagem para evitar bordas nítidas.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) #obter a différance - este é um borrãoImagem legal = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (thresholdImage, kernal, iterações = 5)
O próximo passo é encontrar contadores e verificar a área de cada contador, encontrando a área, podemos descobrir o quão grande é o movimento. Se a área for maior que um valor especificado na variável motion_detected , então consideramos isso como uma atividade e desenhamos uma caixa ao redor da mudança para destacá-la para o usuário.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour é uma função mágica para contorno em contornos: #para cada mudança detectada (x, y, w, h) = cv2.boundingRect (contorno) #obter o local onde a mudança foi encontrada se cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
A função find_screen () é usada para encontrar onde a atividade ocorreu entre as quatro câmeras. Podemos descobrir isso já que sabemos os valores xey do movimento. Comparamos esses valores xey com a localização de cada tela para descobrir qual tela deu atividade e novamente recortamos essa tela específica, para que possamos exibi-la na tela de toque pi.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Activity in cam screen 1") else: screen = frame1 print ("Activity in cam screen 2") else: if (y <cam_height): screen = frame1 print ("Activity in cam screen 3") else: screen = frame1 print ("Activity in cam screen 4") return (screen)
Configurando Alarme para Detecção de Movimento
Uma vez que sabemos em qual tela o movimento foi detectado, é fácil adicionar qualquer tipo de alarme de que precisamos. Aqui vamos apitar um sinal sonoro ligado a GPIO 3. O caso instrução verifica se o movimento foi detectado no ecrã 3 e incrementos uma variável chamada trig_alarm . Você pode detectar qualquer tela de sua escolha ou até mesmo em várias telas.
if ((x> largura_cam) e (y
Se o valor de trig_alarm atingir mais de 3, emitiremos um bipe uma vez. A razão para essa contagem é que às vezes eu percebi que sombras ou pássaros criaram alarmes falsos. Portanto, desta forma apenas se houver uma atividade contínua por 3 quadros, teremos um alarme.
if (trig_alarm> = 3): # espera por conts 3 movimentos #Beep the Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Monitoramento da temperatura e uso da CPU
O sistema é recuado para funcionar 24x7 e, portanto, o Pi pode ficar muito quente, então decido monitorar a temperatura e o uso da CPU exibindo esses valores na tela. Obtivemos essas informações usando a biblioteca gpiozero.
cpu = CPUTemperature () load = LoadAadise () 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)
Iniciando seu Detector de Movimento CFTV Pi
Eu testei isso por dias para reunir e funciona sempre e foi realmente divertido construir até que danifiquei uma câmera,