- Menyiapkan Raspberry Pi dengan Buster dan OpenCV
- Menambah Buzzer ke Paparan Raspberry Pi 5Inch
- Memprogramkan Raspberry Pi untuk Pengesanan Gerak CCTV
- Motion Detection pada OpenCV menggunakan Raspberry Pi
- Menetapkan Penggera untuk Pengesanan Gerak
- Memantau Suhu dan Penggunaan CPU
- Melancarkan Pi CCTV Motion Detector anda
OpenCV adalah alat yang hebat dan digabungkan dengan Raspberry Pi dapat membuka pintu kepada banyak peranti pintar mudah alih. Dalam artikel pemantauan CCTV Raspberry Pi kami sebelumnya, kami belajar bagaimana mendapatkan video CCTV langsung dari DVR menggunakan RTSP dan dipaparkan pada Raspberry Pi, periksa sebelum melanjutkan. Dalam artikel ini, kita akan belajar bagaimana memanfaatkan kekuatan OpenCV dan membangun sistem Raspberry Pi Motion Detection pada rakaman CCTV langsung kami. Sekiranya anda belum memasang CCTV, anda masih boleh membina sistem Pengawasan Raspberry Pi dengan menghubungkan kamera USB terus ke Pi anda. Dan jika anda bukan peminat Pi dan Python, anda boleh membina sesuatu yang serupa dengan ESP32, rujuk ESP32 Wi-Fi Door Bell untuk maklumat lebih lanjut.
Kami akan menulis skrip python yang dapat memantau keempat-empat kamera CCTV secara serentak untuk sebarang aktiviti (gerakan). Sekiranya aktiviti dikesan pada kamera mana pun, Raspberry Pi kami secara automatik akan berubah ke skrin kamera tertentu dan menyoroti aktiviti mana yang berlaku, semua ini dalam masa nyata dengan ketinggian hanya 1.5 saat. Saya juga telah menambahkan ciri penggera, seperti bel yang boleh memberi amaran kepada pengguna dengan berbunyi sekiranya aktiviti dikesan. Tetapi anda boleh meningkatkannya dengan mudah untuk menghantar mesej atau E-mel atau apa yang tidak! Menarik betul !! Mari kita mulakan
Menyiapkan Raspberry Pi dengan Buster dan OpenCV
Saya menggunakan Raspberry Pi 3 B + dengan Buster OS berjalan di atasnya dan versi OpenCV adalah 4.1. Sekiranya anda benar-benar baru, ikuti tutorial di bawah sebelum anda memulakannya.
Tujuannya adalah untuk menyediakan Pi anda dan bersedia untuk pembangunan. Tidak ada salahnya mempunyai versi Raspbian OS pada Pi anda tetapi pastikan versi OpenCV adalah 4.1 atau lebih tinggi. Anda boleh mengikuti tutorial di atas untuk menyusun OpenCV anda yang akan memakan waktu berjam-jam tetapi lebih dipercayai untuk projek berat atau memasangnya terus dari pip menggunakan arahan berikut.
$ pip memasang opencv-contrib-python == 4.1.0.25
Sekiranya anda memasang OpenCV dengan pip untuk pertama kalinya, anda juga harus memasang dependensi lain. Gunakan arahan di bawah 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 membina banyak projek Raspberry Pi OpenCV, anda juga boleh melihatnya untuk mendapatkan lebih banyak inspirasi.
Menambah Buzzer ke Paparan Raspberry Pi 5Inch
Di bahagian perkakasan, kami tidak mempunyai banyak selain daripada Paparan 5 Inch dan Buzzer. Setelah Memadankan Paparan 5 Inch dengan Raspberry Pi, kita dapat memasang buzzer secara langsung ke bahagian belakang Paparan yang telah meluaskan beberapa pin GPIO untuk kita. Saya telah menghubungkan Buzzer saya seperti yang ditunjukkan di bawah-
Sekiranya anda berminat untuk menggunakan lebih banyak pin I / O, maka penerangan pin di bawah akan berguna. Seperti yang anda lihat di antara pin yang diperluas, kebanyakan pin digunakan oleh Display sendiri untuk antara muka skrin sentuh. Tetapi masih, kami mempunyai pin 3,5,7,8,10,11,12,13,15,16, dan 24 yang tidak mempunyai sambungan dan kami dapat menggunakannya untuk aplikasi kami sendiri. Dalam tutorial ini, saya telah menghubungkan buzzer ke GPIO 3.
Memprogramkan Raspberry Pi untuk Pengesanan Gerak CCTV
Skrip python yang lengkap untuk projek ini terdapat di bahagian bawah halaman ini, tetapi mari kita bincangkan setiap segmen kod untuk memahami cara kerjanya.
Memantau Pelbagai Kamera tanpa Jeda pada Raspberry Pi menggunakan RTSP
Bahagian yang mencabar dalam membuat karya ini adalah mengurangkan beban pada Raspberry pi untuk mengelakkan kelewatan streaming. Pada mulanya, saya cuba beralih di antara keempat kamera untuk mencari gerakan tetapi sangat ketinggalan (sekitar 10 saat). Oleh itu, saya menggabungkan keempat-empat kamera ke satu gambar dan melakukan semua aktiviti mengesan gerakan pada gambar tersebut. Saya menulis dua fungsi, iaitu membuat kamera dan membaca kamera.
Fungsi buat kamera digunakan untuk membuka cam dengan nombor saluran masing-masing. Perhatikan bahawa URL RTSP diakhiri dengan "02", yang bermaksud saya menggunakan suapan video sub-aliran yang beresolusi rendah dan dengan itu lebih cepat dibaca. Juga, jenis codec video yang anda gunakan juga menyumbang kepada kepantasan, saya bereksperimen dengan kod yang berbeza dan mendapati FFMPEG adalah puasa semua.
def create_camera (saluran): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / saluran /" + saluran + "02" # ubah IP agar sesuai cap anda = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Nombor ID untuk lebar adalah 3 cap.set (4, cam_height) # Nombor ID untuk ketinggian adalah 480 cap.set (10, 100 # # Nombor ID untuk kecerahan ialah 10 topi pengembalian
Dalam fungsi kamera baca , kita akan membaca keempat-empat kamera iaitu cam1, cam2, cam3, dan cam4 untuk menggabungkan semuanya menjadi satu gambar yang dipanggil Main_screen . Setelah skrin utama ini siap, kami akan melakukan semua kerja OpenCV kami pada gambar ini.
def read_camera (): success, 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 = return_screen semasa (Main_screen)
Gambar skrin utama dengan gabungan keempat-empat kamera akan kelihatan seperti gambar yang ditunjukkan di bawah.
Motion Detection pada OpenCV menggunakan Raspberry Pi
Setelah gambar siap, kita boleh mulai dengan pengesanan gerakan kita. Di dalam loop sementara , kita mulakan dengan membaca dua bingkai yang berbeza iaitu, frame1 dan frame2, kemudian mengubahnya menjadi skala kelabu
frame1 = read_camera () #Baca bingkai pertama kelabuImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Tukar ke bingkai kelabu2 = read_camera () #Baca bingkai ke-2 abu-abuIage_F2 = cv2.cvtColor (frame2, c2
Kemudian kami mengambil perbezaan antara kedua-dua gambar ini untuk melihat apa yang telah berubah dan dengan ambang, kami mengumpulkan semua tempat yang mengalami perubahan, seperti gumpalan. Biasa juga mengaburkan dan melebarkan gambar untuk mengelakkan tepi tajam.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) #mendapatkan perbezaannya - ini adalah blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255) dilatedImage = cv2.dilate (ambang gambar, kernal, lelaran = 5)
Langkah seterusnya adalah mencari kaunter dan memeriksa luas setiap kaunter, dengan mencari kawasannya, kita dapat mengetahui seberapa besar pergerakannya. Sekiranya kawasan lebih besar daripada nilai yang ditentukan dalam pemboleh ubah bergerak_detentukan , maka kami menganggapnya sebagai aktiviti dan lukiskan kotak di sekitar perubahan untuk menyorotnya kepada pengguna.
kontur, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #four contour adalah fungsi ajaib untuk kontur dalam kontur: #untuk setiap perubahan yang dikesan (x, y, w, h) = cv2.boundingRect (kontur) #cari lokasi di mana perubahan dijumpai 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 mencari di mana aktiviti tersebut berlaku di antara keempat kamera. Kita dapat menjumpainya kerana kita mengetahui nilai x dan y gerakan. Kami membandingkan nilai x dan y ini dengan lokasi setiap layar untuk mencari layar yang memberikan aktiviti dan kami sekali lagi memotong skrin tersebut, sehingga kami dapat memaparkannya pada layar sentuh pi.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print ("Activity in cam screen 1") other: screen = frame1 print ("Activity in cam screen 2") yang lain: jika (y <cam_height): screen = frame1 print ("Activity in cam screen 3") other: screen = frame1 print ("Activity in cam screen 4") kembali (layar)
Menetapkan Penggera untuk Pengesanan Gerak
Setelah kita tahu, di mana layar, gerakan dikesan, mudah untuk menambahkan jenis penggera yang kita perlukan. Di sini kita akan berbunyi pembaz dihubungkan dengan GPIO 3. jika cek atau penyata jika usul itu dikesan di skrin 3 dan kenaikan pembolehubah yang dipanggil trig_alarm . Anda dapat mengesan mana-mana skrin pilihan anda atau bahkan di beberapa skrin.
jika ((x> lebar_ cam) dan (y
Sekiranya nilai trig_alarm mencapai lebih dari 3, kami akan berbunyi buzzer sekali. Sebab pengiraan ini adalah bahawa kadang-kadang saya melihat bayangan atau burung membuat penggera palsu. Jadi dengan cara ini hanya jika terdapat aktiviti berterusan untuk 3 bingkai, kita akan mendapat penggera.
if (trig_alarm> = 3): # tunggu gerakan 3 sambung #Bunyikan Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Memantau Suhu dan Penggunaan CPU
Sistem ini diberi indentasi untuk bekerja 24x7 dan karenanya Pi bisa menjadi sangat panas, jadi saya memutuskan untuk memantau suhu dan penggunaan CPU dengan menampilkan nilai-nilai tersebut di layar. Kami telah memperoleh maklumat ini menggunakan perpustakaan gpiozero.
cpu = CPUT suhu () beban = Beban Rata-rata () 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, (2)
Melancarkan Pi CCTV Motion Detector anda
Saya telah menguji ini selama berhari-hari untuk berkumpul dan ia berfungsi setiap masa dan ia sangat membina sehingga saya merosakkan satu kamera,