- Thiết lập Raspberry Pi với Buster và OpenCV
- Thêm Buzzer vào Màn hình Raspberry Pi 5Inch
- Lập trình Raspberry Pi để phát hiện chuyển động CCTV
- Phát hiện chuyển động trên OpenCV bằng Raspberry Pi
- Đặt báo thức để phát hiện chuyển động
- Giám sát nhiệt độ và mức sử dụng CPU
- Khởi chạy máy dò chuyển động camera quan sát Pi của bạn
OpenCV là một công cụ mạnh mẽ và kết hợp với Raspberry Pi có thể mở ra cánh cửa cho nhiều thiết bị thông minh di động. Trong bài viết giám sát camera quan sát Raspberry Pi trước đây của chúng tôi, chúng tôi đã học cách lấy video camera quan sát trực tiếp từ DVR sử dụng RTSP và hiển thị trên Raspberry Pi, hãy kiểm tra trước khi tiếp tục. Trong bài viết này, chúng ta sẽ tìm hiểu cách tận dụng sức mạnh của OpenCV và xây dựng hệ thống Phát hiện chuyển động Raspberry Pi trên các cảnh CCTV trực tiếp của chúng ta. Nếu chưa lắp đặt camera quan sát, bạn vẫn có thể xây dựng hệ thống Giám sát Raspberry Pi bằng cách kết nối camera USB trực tiếp với Pi của mình. Và nếu bạn không phải là một fan hâm mộ lớn của Pi và Python, bạn có thể xây dựng một cái gì đó tương tự với ESP32, hãy tham khảo ESP32 Wi-Fi Door Bell để biết thêm chi tiết.
Chúng tôi sẽ viết một tập lệnh python có thể giám sát tất cả bốn camera CCTV đồng thời cho bất kỳ hoạt động nào (chuyển động). Nếu một hoạt động được phát hiện trên bất kỳ máy ảnh nào, Raspberry Pi của chúng tôi sẽ tự động thay đổi thành màn hình máy ảnh cụ thể đó và đánh dấu hoạt động nào đã diễn ra, tất cả điều này trong thời gian thực chỉ với độ trễ 1,5 giây. Tôi cũng đã thêm một tính năng báo thức, giống như một bộ rung, có thể cảnh báo người dùng bằng tiếng bíp nếu một hoạt động được phát hiện. Nhưng bạn có thể dễ dàng mở rộng quy mô này để gửi tin nhắn hoặc E-mail hay không! Thật thú vị phải không !! Bắt đầu nào
Thiết lập Raspberry Pi với Buster và OpenCV
Tôi đang sử dụng Raspberry Pi 3 B + với Buster OS chạy trên đó và phiên bản OpenCV là 4.1. Nếu bạn là người mới hoàn toàn, hãy làm theo các hướng dẫn bên dưới trước khi bạn có thể bắt đầu.
Mục đích là để có số Pi của bạn và sẵn sàng để phát triển. Bạn có thể sử dụng bất kỳ phiên bản hệ điều hành Raspbian nào trên Pi của mình nhưng hãy đảm bảo phiên bản OpenCV là 4.1 trở lên. Bạn có thể làm theo hướng dẫn trên để biên dịch OpenCV của mình, việc này sẽ mất hàng giờ nhưng đáng tin cậy hơn cho các dự án nặng hoặc chỉ cần cài đặt trực tiếp từ pip bằng các lệnh sau.
$ pip cài đặt opencv-Contrib-python == 4.1.0.25
Nếu bạn cài đặt OpenCV với pip lần đầu tiên, bạn cũng phải cài đặt các phần phụ thuộc khác. Sử dụng các lệnh dưới đây cho điều đó.
$ 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
Chúng tôi đã xây dựng nhiều dự án Raspberry Pi OpenCV, bạn cũng có thể kiểm tra để có thêm cảm hứng.
Thêm Buzzer vào Màn hình Raspberry Pi 5Inch
Về mặt phần cứng, chúng tôi không có nhiều thứ khác ngoài Màn hình 5 inch và Buzzer. Sau khi Giao diện màn hình 5 inch với Raspberry Pi, chúng tôi có thể gắn trực tiếp bộ rung vào mặt sau của Màn hình đã mở rộng một số chân GPIO cho chúng tôi. Tôi đã kết nối Buzzer của mình như hình dưới đây-
Nếu bạn quan tâm đến việc sử dụng nhiều chân I / O hơn, thì mô tả chân cắm dưới đây sẽ hữu ích. Như bạn có thể thấy trong số các chân cắm mở rộng, hầu hết các chân cắm được sử dụng bởi chính Màn hình cho giao diện màn hình cảm ứng. Tuy nhiên, chúng ta có các chân 3,5,7,8,10,11,12,13,15,16 và 24 không có kết nối và chúng ta có thể sử dụng nó cho ứng dụng của riêng mình. Trong hướng dẫn này, tôi đã kết nối bộ rung với GPIO 3.
Lập trình Raspberry Pi để phát hiện chuyển động CCTV
Bạn có thể tìm thấy tập lệnh python hoàn chỉnh cho dự án này ở cuối trang này, nhưng chúng ta hãy thảo luận về từng đoạn mã để hiểu cách hoạt động của nó.
Giám sát nhiều máy ảnh mà không có độ trễ trên Raspberry Pi bằng RTSP
Phần thách thức khi thực hiện công việc này là giảm tải trên Raspberry pi để tránh độ trễ khi phát trực tuyến. Ban đầu, tôi đã thử chuyển đổi giữa cả bốn camera để tìm chuyển động nhưng nó rất lag (khoảng 10 giây). Vì vậy, tôi kết hợp cả bốn camera vào một hình ảnh duy nhất và thực hiện tất cả các hoạt động phát hiện chuyển động trên hình ảnh đó. Tôi đã viết hai chức năng, đó là tạo camera và đọc camera.
Các tạo camera chức năng được sử dụng để mở các cam với số kênh tương ứng của nó. Lưu ý rằng URL RTSP kết thúc bằng “02”, có nghĩa là tôi đang sử dụng nguồn cấp dữ liệu video luồng phụ sẽ có độ phân giải thấp và do đó đọc nhanh hơn. Ngoài ra, loại codec video mà bạn sử dụng cũng góp phần vào tốc độ, tôi đã thử nghiệm với các mã khác nhau và nhận thấy FFMPEG là nhanh nhất.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channel /" + channel + "02" # thay đổi IP cho phù hợp Your cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Số ID cho chiều rộng là 3 cap.set (4, cam_height) # Số ID cho chiều cao là 480 cap.set (10, 100) # Số ID cho độ sáng là 10 giới hạn trả lại
Trong chức năng camera đọc , chúng ta sẽ đọc tất cả bốn cam là cam1, cam2, cam3 và cam4 để kết hợp tất cả chúng thành một hình ảnh duy nhất được gọi là Main_screen . Khi màn hình chính này đã sẵn sàng, chúng tôi sẽ thực hiện tất cả công việc OpenCV của chúng tôi trên hình ảnh này.
def read_camera (): thành công, current_screen = cam1.read () Main_screen = current_screen thành công, current_screen = cam2.read () Main_screen = current_screen thành công, current_screen = cam3.read () Main_screen = current_screen thành công, current_screen = cam4.read () Main_screen = current_screen return (Màn hình chính)
Hình ảnh màn hình chính với tất cả bốn cam kết hợp sẽ giống như hình dưới đây.
Phát hiện chuyển động trên OpenCV bằng Raspberry Pi
Bây giờ chúng ta đã có hình ảnh sẵn sàng, chúng ta có thể bắt đầu với phát hiện chuyển động của mình. Bên trong vòng lặp while , chúng tôi bắt đầu bằng cách đọc hai khung khác nhau, cụ thể là frame1 và frame2, sau đó chuyển đổi chúng sang thang độ xám
frame1 = read_camera () # Đọc khung đầu tiên màu xámImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Chuyển đổi sang khung màu xám2 = read_camera () # Đọc khung hình thứ 2 màu xámImage_F2 = cv2.cvtColor (frame2, cv2.COLOR)
Sau đó, chúng tôi lấy sự khác biệt giữa cả hai hình ảnh này để xem những gì đã thay đổi và với một ngưỡng, chúng tôi nhóm tất cả những nơi có sự thay đổi, giống như một đốm màu. Nó cũng phổ biến để làm mờ và giãn hình ảnh để tránh các cạnh sắc nét.
diffImage = cv2.absdiff (grayImage_F1, greyImage_F2) #get the differance - đây là hiệu ứng mờ tuyệt vờiImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, ngưỡngImage = cv2.threshold (mờImage, 20,255, cv2.THRESH) dilatedImage = cv2.dilate (ngưỡngImage, kernal, số lần lặp = 5)
Bước tiếp theo là tìm các quầy và kiểm tra diện tích của từng quầy, bằng cách tìm diện tích, chúng ta có thể biết được độ lớn của chuyển động. Nếu khu vực lớn hơn một giá trị được chỉ định trong biến motion_detected , thì chúng tôi coi đó là một hoạt động và vẽ một hộp xung quanh thay đổi để làm nổi bật nó cho người dùng.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour là một hàm ma thuật cho đường viền trong đường viền: # cho mọi thay đổi được phát hiện (x, y, w, h) = cv2.bidingRect (contour) #get vị trí nơi thay đổi được tìm thấy nếu cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Hàm find_screen () được sử dụng để tìm nơi diễn ra hoạt động giữa bốn camera. Chúng ta có thể tìm thấy điều đó vì chúng ta biết các giá trị x và y của chuyển động. Chúng tôi so sánh các giá trị x và y này với vị trí của mỗi màn hình để tìm màn hình nào đã cung cấp hoạt động và chúng tôi lại cắt màn hình cụ thể đó để chúng tôi có thể hiển thị nó trên màn hình cảm ứng pi.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Hoạt động trong màn hình cam 1") else: screen = frame1 print ("Hoạt động trong màn hình cam 2") else: nếu (y <cam_height): screen = frame1 print ("Hoạt động trong màn hình cam 3") else: screen = frame1 print ("Hoạt động trong màn hình cam 4") return (màn hình)
Đặt báo thức để phát hiện chuyển động
Khi chúng ta biết, chuyển động được phát hiện ở màn hình nào, chúng ta có thể dễ dàng thêm bất kỳ loại cảnh báo nào mà chúng ta cần. Ở đây chúng ta sẽ phát ra tiếng bíp còi kết nối với GPIO 3. nếu kiểm tra tuyên bố nếu chuyển động được phát hiện trong màn hình 3 và từng bước một biến gọi là trig_alarm . Bạn có thể phát hiện bất kỳ màn hình nào bạn chọn hoặc thậm chí trên nhiều màn hình.
if ((x> cam_width) và (y
Nếu giá trị của trig_alarm đạt hơn 3, chúng tôi sẽ phát ra tiếng bíp một lần. Lý do cho số lượng này là đôi khi tôi nhận thấy bóng hoặc chim tạo báo động giả. Vì vậy, cách này chỉ cần có một hoạt động liên tục trong 3 khung hình, chúng ta sẽ nhận được báo thức.
if (trig_alarm> = 3): # đợi tiếp tục 3 chuyển động # Giữ Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Giám sát nhiệt độ và mức sử dụng CPU
Hệ thống được thụt vào để hoạt động 24x7 và do đó Pi có thể rất nóng, vì vậy tôi quyết định theo dõi nhiệt độ và mức sử dụng CPU bằng cách hiển thị các giá trị đó trên màn hình. Chúng tôi đã lấy thông tin này bằng cách sử dụng thư viện gpiozero.
cpu = CPUTempe Heat () load = LoadAverage () cpu_tempether = str ((cpu.tempether) // 1) load_average = str (load.load_average) #print (cpu.tempether) #print (load.load_average) cv2.putText (display_screen, cpu_tempether, (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)
Khởi chạy máy dò chuyển động camera quan sát Pi của bạn
Tôi đã thử nghiệm điều này trong nhiều ngày để thu thập và nó hoạt động mỗi lần và nó thực sự là một bản dựng thú vị cho đến khi tôi làm hỏng một máy ảnh,