- Buster 및 OpenCV로 Raspberry Pi 설정
- 라즈베리 파이 5 인치 디스플레이에 부저 추가
- CCTV 모션 감지를위한 Raspberry Pi 프로그래밍
- Raspberry Pi를 사용하는 OpenCV에서 모션 감지
- 움직임 감지를위한 알람 설정
- CPU 온도 및 사용량 모니터링
- Pi CCTV 동작 탐지기 실행
OpenCV는 강력한 도구이며 Raspberry Pi와 결합되어 많은 휴대용 스마트 장치에 대한 문을 열 수 있습니다. 이전 Raspberry Pi CCTV 모니터링 기사에서 RTSP를 사용하여 DVR에서 라이브 CCTV 비디오를 가져오고 Raspberry Pi에 표시하는 방법을 배웠습니다. 진행하기 전에 확인하십시오. 이 기사에서는 라이브 CCTV 영상 에서 OpenCV의 기능을 활용하고 Raspberry Pi 모션 감지 시스템을 구축하는 방법을 배웁니다. CCTV가 설치되어 있지 않은 경우에도 USB 카메라를 Pi에 직접 연결하여 Raspberry Pi 감시 시스템을 구축 할 수 있습니다. Pi와 Python을 좋아하지 않는다면 ESP32로 비슷한 것을 만들 수 있습니다. 자세한 내용은 ESP32 Wi-Fi Door Bell을 참조하세요.
모든 활동 (움직임)에 대해 4 대의 CCTV 카메라를 모두 동시에 모니터링 할 수있는 Python 스크립트를 작성합니다. 카메라에서 활동이 감지되면 Raspberry Pi는 자동으로 해당 특정 카메라 화면으로 변경되고 어떤 활동이 발생했는지 강조 표시합니다.이 모든 것이 단 1.5 초 지연으로 실시간으로 이루어집니다. 또한 활동이 감지되면 경고음을 울려 사용자에게 경고 할 수있는 부저와 같은 알람 기능도 추가했습니다. 하지만 메시지 나 전자 메일을 보내거나 그렇지 않은 경우이를 쉽게 확장 할 수 있습니다! 신나는 맞다 !! 시작하자
Buster 및 OpenCV로 Raspberry Pi 설정
Buster OS와 함께 Raspberry Pi 3 B +를 사용하고 있으며 OpenCV 버전은 4.1입니다. 완전히 새로운 경우 시작하기 전에 아래 자습서를 따르십시오.
목표는 Pi를 개발하고 개발할 준비를하는 것입니다. Pi에 모든 버전의 Raspbian OS를 사용해도되지만 OpenCV 버전이 4.1 이상인지 확인하세요. 위의 자습서를 따라 몇 시간이 걸리지 만 무거운 프로젝트에 더 안정적인 OpenCV를 컴파일하거나 다음 명령을 사용하여 pip에서 직접 설치할 수 있습니다.
$ pip install opencv-contrib-python == 4.1.0.25
pip를 사용하여 OpenCV를 처음 설치하는 경우 다른 종속성도 설치해야합니다. 이를 위해 아래 명령을 사용하십시오.
$ 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
우리는 이미 많은 Raspberry Pi OpenCV 프로젝트를 구축했으며 더 많은 영감을 얻기 위해 그것을 확인할 수도 있습니다.
라즈베리 파이 5 인치 디스플레이에 부저 추가
하드웨어 측면에서는 5 인치 디스플레이와 버저 외에는 별다른 것이 없습니다. 5 인치 디스플레이와 Raspberry Pi를 연결 한 후, 일부 GPIO 핀을 확장 한 디스플레이 뒷면에 부저를 직접 장착 할 수 있습니다. 아래와 같이 부저를 연결했습니다.
더 많은 I / O 핀을 활용하고 싶다면 아래 핀 설명이 유용 할 것입니다. 확장 된 핀에서 볼 수 있듯이 대부분의 핀은 디스플레이 자체에서 터치 스크린 인터페이스를 위해 사용됩니다. 그러나 여전히 연결되지 않은 핀 3,5,7,8,10,11,12,13,15,16 및 24가 있으며 자체 응용 프로그램에 사용할 수 있습니다. 이 튜토리얼에서는 부저를 GPIO 3에 연결했습니다.
CCTV 모션 감지를위한 Raspberry Pi 프로그래밍
이 프로젝트에 대한 완전한 파이썬 스크립트는이 페이지 하단에서 찾을 수 있지만 코드의 각 부분에 대해 논의하여 작동 방식을 이해해 보겠습니다.
RTSP를 사용하여 Raspberry Pi에서 지연없이 여러 카메라 모니터링
이 작업을 수행하는 데있어 어려운 부분은 스트리밍 지연을 방지하기 위해 Raspberry pi의 부하를 줄이는 것이 었습니다. 처음에는 모션을 찾기 위해 4 대의 카메라를 모두 전환하려고했지만 매우 느 렸습니다 (약 10 초). 그래서 4 개의 카메라를 모두 하나의 이미지로 결합하고 해당 이미지에서 모든 동작 감지 활동을 수행했습니다. 저는 카메라를 만들고 카메라를 읽는 두 가지 기능을 작성했습니다.
카메라 생성 함수는 각각의 채널 번호와 상기 캠을 여는 데 사용된다. RTSP URL은 "02"로 끝납니다. 즉, 해상도가 낮아서 더 빨리 읽을 수있는 하위 스트림 비디오 피드를 사용하고 있음을 의미합니다. 또한 사용하는 비디오 코덱의 유형도 속도에 영향을 미칩니다. 여러 코드로 실험 한 결과 FFMPEG가 모두 금식이라는 것을 알았습니다.
def create_camera (채널): rtsp = "rtsp: //"+ rtsp_username + ":"+ rtsp_password + "@"+ rtsp_IP + ": 554 / Streaming / channels /"+ channel + "02"# 적절한 IP 변경 yours cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # 너비의 ID 번호는 3입니다. cap.set (4, cam_height) # 높이의 ID 번호는 480입니다. cap.set (10, 100) # 밝기에 대한 ID 번호는 10 리턴 캡입니다.
에서 읽기 카메라 기능, 우리라는 하나의 이미지로 그들 모두를 결합, 즉 CAM1, CAM2, cam3 및 웹캠 네 캠을 읽 Main_screen . 이 메인 화면이 준비되면이 이미지에서 모든 OpenCV 작업을 수행합니다.
def read_camera (): 성공, current_screen = cam1.read () Main_screen = current_screen 성공, current_screen = cam2.read () Main_screen = current_screen 성공, current_screen = cam3.read () Main_screen = current_screen 성공, current_screen = cam4.read () Main_screen = current_screen return (Main_screen)
4 개의 캠이 모두 결합 된 메인 화면 이미지는 아래 그림과 같습니다.
Raspberry Pi를 사용하는 OpenCV에서 모션 감지
이제 이미지가 준비되었으므로 모션 감지부터 시작할 수 있습니다. while 루프 내에서 두 개의 서로 다른 프레임 즉, frame1과 frame2를 읽은 다음 그레이 스케일로 변환합니다.
frame1 = read_camera () # 첫 번째 프레임 읽기 grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # 회색으로 변환 frame2 = read_camera () # 두 번째 프레임 읽기 grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_BGR2GRAY)
그런 다음이 두 이미지의 차이를 확인하여 변경된 내용을 확인하고 임계 값을 사용하여 변경 사항이있는 모든 장소를 그룹화합니다. 일종의 얼룩과 같습니다. 날카로운 모서리를 피하기 위해 이미지를 흐리게하고 확장하는 것도 일반적입니다.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) # 차이를 가져옵니다-이것은 멋지네요 blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (thresholdImage, kernal, iterations = 5)
다음 단계는 카운터를 찾고 각 카운터의 면적을 확인하는 것입니다. 면적을 찾아서 움직임이 얼마나 큰지 알아낼 수 있습니다. 영역이 motion_detected 변수에 지정된 값보다 크면이를 활동으로 간주하고 변경 사항 주위에 상자를 그려 사용자에게 강조 표시합니다.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour는 윤곽선에 대한 마술 함수입니다. # 감지되는 모든 변화에 대해 (x, y, w, h) = cv2.boundingRect (contour) # cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0) 인 경우 변경된 위치를 가져옵니다., 1) display_screen = find_screen ()
find_screen () 함수 는 네 대의 카메라 사이에서 활동이 발생한 위치를 찾는 데 사용됩니다. 우리는 운동의 x와 y 값을 알고 있기 때문에 그것을 찾을 수 있습니다. 이러한 x 및 y 값을 각 화면의 위치와 비교하여 어떤 화면이 활동을 제공했는지 확인하고 해당 화면을 다시 잘라서 파이 터치 스크린에 표시 할 수 있습니다.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("캠 화면 1의 활동") else: screen = frame1 print ("캠 화면 2의 활동") else: if (y <cam_height): screen = frame1 print ("캠 화면 3의 활동") else: screen = frame1 print ("캠 화면 4의 활동") return (화면)
움직임 감지를위한 알람 설정
어떤 화면에서 움직임이 감지되는지 알면 필요한 모든 유형의 알람을 쉽게 추가 할 수 있습니다. 여기서는 GPIO 3에 연결된 부저가 울립니다. if 문은 화면 3에서 움직임이 감지되었는지 확인하고 trig_alarm 이라는 변수를 증가 시킵니다 . 선택한 모든 화면 또는 여러 화면을 감지 할 수 있습니다.
if ((x> cam_width) 및 (y
trig_alarm 값 이 3 이상이 되면 부저가 한 번 울립니다. 이 카운트의 이유는 가끔 그림자 나 새가 가짜 경보를 생성하는 것을 발견했기 때문입니다. 따라서 이렇게하면 3 프레임 동안 연속적인 활동이있는 경우에만 알람이 울립니다.
if (trig_alarm> = 3): # 계속 3 동작 대기 # 부저음 GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
CPU 온도 및 사용량 모니터링
시스템은 24x7 작동하도록 들여 쓰기되어 있으므로 Pi가 매우 뜨거워 질 수 있으므로 해당 값을 화면에 표시하여 온도와 CPU 사용량을 모니터링하기로 결정했습니다. 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)
Pi CCTV 동작 탐지기 실행
나는 이것을 수집하기 위해 며칠 동안 테스트했고 매번 작동하며 카메라 하나를 손상시킬 때까지 정말 재미있는 빌드였습니다.