- Menyiapkan Raspberry Pi dengan Buster dan OpenCV
- Menambahkan Buzzer ke Tampilan Raspberry Pi 5Inch
- Pemrograman Raspberry Pi untuk Deteksi Gerakan CCTV
- Deteksi Gerakan pada OpenCV menggunakan Raspberry Pi
- Mengatur Alarm untuk Deteksi Gerakan
- Memantau Suhu dan Penggunaan CPU
- Meluncurkan Pi CCTV Motion Detector Anda
OpenCV adalah alat yang ampuh dan dikombinasikan dengan Raspberry Pi dapat membuka pintu ke banyak perangkat pintar portabel. Dalam artikel pemantauan CCTV Raspberry Pi kami sebelumnya, kami belajar cara mendapatkan video CCTV langsung dari DVR menggunakan RTSP dan ditampilkan di Raspberry Pi, periksa dulu sebelum melanjutkan. Pada artikel ini, kita akan belajar bagaimana memanfaatkan kekuatan OpenCV dan membangun sistem Deteksi Gerakan Raspberry Pi pada rekaman CCTV langsung kita. Jika Anda belum memasang CCTV, Anda masih dapat membangun sistem Pengawasan Raspberry Pi dengan menghubungkan kamera USB langsung ke Pi Anda. Dan jika Anda bukan penggemar berat Pi dan Python, Anda dapat membuat sesuatu yang mirip dengan ESP32, lihat Bel Pintu Wi-Fi ESP32 untuk lebih jelasnya.
Kami akan menulis script python yang dapat memantau keempat kamera CCTV secara bersamaan untuk segala aktivitas (gerak). Jika suatu aktivitas terdeteksi pada kamera mana pun, Raspberry Pi kami akan secara otomatis berubah ke layar kamera tertentu dan menyorot aktivitas mana yang terjadi, semua ini secara real-time hanya dengan jeda 1,5 detik. Saya juga telah menambahkan fitur alarm, seperti bel yang dapat mengingatkan pengguna dengan bunyi bip jika suatu aktivitas terdeteksi. Tapi Anda dapat dengan mudah meningkatkannya untuk mengirim pesan atau email atau apa yang tidak! Seru kan !! Mari kita mulai
Menyiapkan Raspberry Pi dengan Buster dan OpenCV
Saya menggunakan Raspberry Pi 3 B + dengan OS Buster yang berjalan di atasnya dan versi OpenCV adalah 4.1. Jika Anda benar-benar baru, ikuti tutorial di bawah ini sebelum Anda dapat memulai.
Tujuannya adalah untuk menyiapkan Pi Anda dan siap untuk pengembangan. Tidak masalah untuk memiliki versi Raspbian OS di Pi Anda, tetapi pastikan versi OpenCV 4.1 atau lebih tinggi. Anda dapat mengikuti tutorial di atas untuk mengkompilasi OpenCV Anda yang akan memakan waktu berjam-jam tetapi lebih dapat diandalkan untuk proyek-proyek berat atau hanya menginstalnya langsung dari pip menggunakan perintah berikut.
$ pip instal opencv-contrib-python == 4.1.0.25
Jika Anda menginstal OpenCV dengan pip untuk pertama kalinya, Anda juga harus menginstal dependensi lainnya. Gunakan perintah di bawah ini untuk itu.
$ 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
Kami telah membangun banyak proyek Raspberry Pi OpenCV, Anda juga dapat memeriksanya untuk lebih banyak inspirasi.
Menambahkan Buzzer ke Tampilan Raspberry Pi 5Inch
Di sisi perangkat keras, kami tidak memiliki banyak selain Layar 5-Inci dan Bel. Setelah Menghubungkan Layar 5-Inci dengan Raspberry Pi, kita dapat langsung memasang bel ke bagian belakang Layar yang telah memperpanjang beberapa pin GPIO untuk kita. Saya telah menghubungkan Buzzer saya seperti yang ditunjukkan di bawah ini-
Jika Anda tertarik untuk menggunakan lebih banyak pin I / O, deskripsi pin di bawah ini akan berguna. Seperti yang Anda lihat di antara pin yang diperpanjang, sebagian besar pin digunakan oleh Display itu sendiri untuk antarmuka layar sentuh. Tapi tetap saja, kami memiliki pin 3,5,7,8,10,11,12,13,15,16, dan 24 yang tidak memiliki koneksi dan kami dapat menggunakannya untuk aplikasi kami sendiri. Dalam tutorial ini, saya telah menghubungkan bel ke GPIO 3.
Pemrograman Raspberry Pi untuk Deteksi Gerakan CCTV
Skrip python lengkap untuk proyek ini dapat ditemukan di bagian bawah halaman ini, tetapi mari kita bahas setiap segmen kode untuk memahami cara kerjanya.
Memantau Beberapa Kamera tanpa Lag di Raspberry Pi menggunakan RTSP
Bagian yang menantang dalam membuat ini berfungsi adalah mengurangi beban pada Raspberry pi untuk menghindari jeda dalam streaming. Awalnya, saya mencoba beralih di antara keempat kamera untuk mencari gerakan tetapi sangat lamban (sekitar 10 detik). Jadi saya menggabungkan keempat kamera menjadi satu gambar dan melakukan semua aktivitas mendeteksi gerakan pada gambar itu. Saya menulis dua fungsi yaitu membuat kamera dan membaca kamera.
Fungsi create camera digunakan untuk membuka cam dengan nomor channelnya masing-masing. Perhatikan bahwa URL RTSP diakhiri dengan “02”, yang berarti saya menggunakan umpan video sub-aliran yang akan beresolusi rendah dan karenanya lebih cepat dibaca. Selain itu, jenis codec video yang Anda gunakan juga berkontribusi pada kecepatan, saya bereksperimen dengan kode yang berbeda dan menemukan FFMPEG sebagai yang tercepat dari semuanya.
def create_camera (saluran): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / saluran /" + saluran + "02" # ubah IP agar sesuai your cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Nomor ID untuk lebar adalah 3 cap.set (4, cam_height) # Nomor ID untuk tinggi adalah 480 cap.set (10, 100) # Nomor ID untuk kecerahan adalah 10 tutup kembali
Pada fungsi kamera baca , kita akan membaca keempat cam yaitu cam1, cam2, cam3, dan cam4 untuk menggabungkan semuanya menjadi satu gambar yang disebut Main_screen . Setelah layar utama ini siap, kami akan melakukan semua pekerjaan OpenCV kami pada gambar ini.
def read_camera (): sukses, current_screen = cam1.read () Main_screen = current_screen sukses, current_screen = cam2.read () Main_screen = sukses layar saat ini, current_screen = cam3.read () Main_screen = sukses layar saat ini, current_screen = cam4.read () Main_screen = current_screen kembali (Main_screen)
Gambar layar utama dengan keempat cam digabungkan akan terlihat seperti gambar di bawah ini.
Deteksi Gerakan pada OpenCV menggunakan Raspberry Pi
Sekarang setelah gambarnya siap, kita bisa mulai dengan deteksi gerakan kita. Di dalam while loop , kita mulai dengan membaca dua frame berbeda yaitu frame1 dan frame2, kemudian mengubahnya menjadi grayscale
frame1 = read_camera () #Read frame pertama greyImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Convert to grey frame2 = read_camera () #Read the 2nd frame greyImage_F2 = cv2.cvtColor (frame2, cv2GR.COLOR_BGRAY)
Kemudian kami mengambil perbedaan antara kedua gambar ini untuk melihat apa yang berubah dan dengan ambang batas, kami mengelompokkan semua tempat yang memiliki perubahan, seperti gumpalan. Ini juga umum untuk memburamkan dan melebarkan gambar untuk menghindari tepi yang tajam.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) # dapatkan perbedaan - ini keren blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255, cv2.RESH_BINARYRES) dilatedImage = cv2.dilate (thresholdImage, kernal, iterasi = 5)
Langkah selanjutnya adalah mencari counter dan memeriksa luas masing-masing counter, dengan mencari luasnya kita bisa mengetahui seberapa besar gerakannya. Jika area lebih besar dari nilai yang ditentukan dalam variabel motion_detected , maka kami menganggapnya sebagai aktivitas dan menggambar kotak di sekitar perubahan untuk menyorotnya kepada pengguna.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour adalah fungsi ajaib untuk kontur dalam kontur: #untuk setiap perubahan yang terdeteksi (x, y, w, h) = cv2.boundingRect (kontur) # dapatkan lokasi di mana perubahan ditemukan jika cv2.contourArea (kontur)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Fungsi find_screen () digunakan untuk menemukan di mana aktivitas berlangsung di antara empat kamera. Kita dapat menemukannya karena kita mengetahui nilai x dan y dari gerakan tersebut. Kami membandingkan nilai x dan y ini dengan lokasi setiap layar untuk menemukan layar mana yang memberikan aktivitas dan kami memotong lagi layar tersebut, sehingga kami dapat menampilkannya di layar sentuh pi.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Aktivitas di layar kamera 1") lain: screen = frame1 print ("Aktivitas di layar kamera 2") lain: jika (y <cam_height): screen = frame1 print ("Aktivitas di layar kamera 3") else: screen = frame1 print ("Aktivitas di layar kamera 4") kembali (layar)
Mengatur Alarm untuk Deteksi Gerakan
Setelah kita tahu, di layar mana gerakan terdeteksi, mudah untuk menambahkan jenis alarm yang kita butuhkan. Di sini kita akan berbunyi bel terhubung ke GPIO 3. jika cek pernyataan jika gerakan terdeteksi di layar 3 dan penambahan variabel yang disebut trig_alarm . Anda dapat mendeteksi layar apa pun pilihan Anda atau bahkan di beberapa layar.
if ((x> cam_width) dan (y
Jika nilai trig_alarm mencapai lebih dari 3, kita akan membunyikan bel sekali. Alasan penghitungan ini adalah terkadang saya memperhatikan bayangan atau burung membuat alarm palsu. Jadi dengan cara ini hanya jika ada aktivitas terus menerus selama 3 frame, kita akan mendapat alarm.
if (trig_alarm> = 3): # tunggu hingga 3 gerakan lanjutan #Jaga Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Memantau Suhu dan Penggunaan CPU
Sistem diindentasi untuk bekerja 24x7 dan karenanya Pi bisa menjadi sangat panas, jadi saya memutuskan untuk memantau suhu dan penggunaan CPU dengan menampilkan nilai-nilai itu di layar. Kami telah memperoleh informasi ini menggunakan perpustakaan 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)
Meluncurkan Pi CCTV Motion Detector Anda
Saya telah menguji ini selama berhari-hari untuk mengumpulkan dan berfungsi setiap saat dan itu benar-benar menyenangkan membangun sampai saya merusak satu kamera,