- การตั้งค่า Raspberry Pi ด้วย Buster และ OpenCV
- การเพิ่ม Buzzer ไปยัง Raspberry Pi 5Inch Display
- การเขียนโปรแกรม Raspberry Pi สำหรับการตรวจจับการเคลื่อนไหวของกล้องวงจรปิด
- การตรวจจับความเคลื่อนไหวบน OpenCV โดยใช้ Raspberry Pi
- การตั้งปลุกสำหรับการตรวจจับการเคลื่อนไหว
- การตรวจสอบอุณหภูมิและการใช้งาน CPU
- เปิดตัว Pi CCTV Motion Detector ของคุณ
OpenCV เป็นเครื่องมือที่ทรงพลังและเมื่อรวมกับ Raspberry Pi แล้วสามารถเปิดประตูไปยังอุปกรณ์อัจฉริยะแบบพกพาจำนวนมากได้ ในบทความการตรวจสอบกล้องวงจรปิด Raspberry Pi ก่อนหน้านี้เราได้เรียนรู้วิธีรับวิดีโอกล้องวงจรปิดสดจาก DVR โดยใช้ RTSP และแสดงบน Raspberry Pi ตรวจสอบก่อนดำเนินการต่อ ในบทความนี้เราจะเรียนรู้วิธีการใช้ประโยชน์จากพลังของ OpenCV และสร้างระบบRaspberry Pi Motion Detectionบนวิดีโอสดจากกล้องวงจรปิดของเรา หากคุณไม่ได้ติดตั้งกล้องวงจรปิดคุณยังสามารถสร้างระบบเฝ้าระวัง Raspberry Pi ได้โดยเชื่อมต่อกล้อง USB เข้ากับ Pi ของคุณโดยตรง และหากคุณไม่ใช่แฟนตัวยงของ Pi และ Python คุณสามารถสร้างสิ่งที่คล้ายกันกับ ESP32 ได้โปรดดูรายละเอียดเพิ่มเติมจาก ESP32 Wi-Fi Door Bell
เราจะเขียนสคริปต์ python ที่สามารถตรวจสอบกล้องวงจรปิดทั้งสี่ตัวพร้อมกันสำหรับกิจกรรมใด ๆ (การเคลื่อนไหว) หากตรวจพบกิจกรรมในกล้องใด ๆ Raspberry Pi ของเราจะเปลี่ยนเป็นหน้าจอกล้องนั้นโดยอัตโนมัติและไฮไลต์กิจกรรมที่เกิดขึ้นทั้งหมดนี้เป็นแบบเรียลไทม์ด้วยความล่าช้าเพียง 1.5 วินาที ฉันยังได้เพิ่มคุณสมบัติการเตือนเช่นเสียงกริ่งซึ่งสามารถแจ้งเตือนผู้ใช้ด้วยการส่งเสียงบี๊บหากตรวจพบกิจกรรม แต่คุณสามารถขยายขนาดนี้เพื่อส่งข้อความหรืออีเมลหรืออะไรก็ได้! สุดเร้าใจ !! มาเริ่มกันเลย
การตั้งค่า Raspberry Pi ด้วย Buster และ OpenCV
ฉันใช้ Raspberry Pi 3 B + กับ Buster OS ที่ทำงานอยู่และเวอร์ชันของ OpenCV คือ 4.1 หากคุณเป็นมือใหม่ทำตามบทแนะนำด้านล่างนี้ก่อนที่คุณจะเริ่มต้นได้
เป้าหมายคือเพื่อให้ Pi ของคุณพร้อมสำหรับการพัฒนา เป็นเรื่องปกติที่จะมี Raspbian OS เวอร์ชันใดก็ได้บน Pi ของคุณ แต่ตรวจสอบให้แน่ใจว่าเวอร์ชันของ OpenCV คือ 4.1 หรือสูงกว่า คุณสามารถทำตามบทช่วยสอนด้านบนเพื่อรวบรวม OpenCV ของคุณซึ่งจะใช้เวลาหลายชั่วโมง แต่เชื่อถือได้มากกว่าสำหรับโครงการขนาดใหญ่หรือเพียงแค่ติดตั้งโดยตรงจาก pip โดยใช้คำสั่งต่อไปนี้
$ pip ติดตั้ง opencv-Contrib-python == 4.1.0.25
หากคุณกำลังติดตั้ง OpenCV ด้วย pip เป็นครั้งแรกคุณต้องติดตั้งการอ้างอิงอื่น ๆ ด้วย ใช้คำสั่งด้านล่างสำหรับสิ่งนั้น
$ sudo apt-get ติดตั้ง 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 ติดตั้ง libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
เราได้สร้างโครงการ Raspberry Pi OpenCV มากมายแล้วคุณยังสามารถตรวจสอบแรงบันดาลใจเพิ่มเติมได้
การเพิ่ม Buzzer ไปยัง Raspberry Pi 5Inch Display
ในด้านฮาร์ดแวร์เราไม่มีอะไรมากไปกว่าจอแสดงผลขนาด 5 นิ้วและ Buzzer หลังจากเชื่อมต่อจอแสดงผล 5 นิ้วกับ Raspberry Pi แล้วเราสามารถติดตั้งกริ่งเข้ากับด้านหลังของจอแสดงผลได้โดยตรงซึ่งได้ขยายพิน GPIO บางส่วนให้เรา ฉันได้เชื่อมต่อ Buzzer ของฉันตามที่แสดงด้านล่าง -
หากคุณสนใจที่จะใช้พิน I / O เพิ่มเติมคำอธิบายพินด้านล่างจะเป็นประโยชน์ ดังที่คุณเห็นในหมุดขยายหมุดส่วนใหญ่ถูกใช้โดยจอแสดงผลสำหรับอินเทอร์เฟซหน้าจอสัมผัส แต่ถึงกระนั้นเรายังมีพิน 3,5,7,8,10,11,12,13,15,16 และ 24 ที่ไม่มีการเชื่อมต่อและเราสามารถใช้มันสำหรับแอปพลิเคชันของเราเองได้ ในบทช่วยสอนนี้ฉันได้เชื่อมต่อกริ่งกับ GPIO 3 แล้ว
การเขียนโปรแกรม Raspberry Pi สำหรับการตรวจจับการเคลื่อนไหวของกล้องวงจรปิด
สคริปต์ python ที่สมบูรณ์สำหรับโปรเจ็กต์นี้สามารถพบได้ที่ด้านล่างของหน้านี้ แต่เราจะพูดถึงแต่ละส่วนของโค้ดเพื่อทำความเข้าใจว่ามันทำงานอย่างไร
การตรวจสอบกล้องหลายตัวโดยไม่มี Lag บน Raspberry Pi โดยใช้ RTSP
ส่วนที่ท้าทายในการทำงานนี้คือการลดภาระใน Raspberry pi เพื่อหลีกเลี่ยงความล่าช้าในการสตรีม ตอนแรกฉันลองสลับระหว่างกล้องทั้งสี่ตัวเพื่อค้นหาการเคลื่อนไหว แต่มันล้ามาก (ประมาณ 10 วินาที) ดังนั้นฉันจึงรวมกล้องทั้งสี่ตัวเป็นภาพเดียวและทำกิจกรรมตรวจจับการเคลื่อนไหวทั้งหมดในภาพนั้น ฉันเขียนสองฟังก์ชั่นคือสร้างกล้องและอ่านกล้อง
สร้างกล้อง ฟังก์ชั่นที่ใช้ในการเปิดเวบแคมที่มีจำนวนช่องที่เกี่ยวข้อง โปรดทราบว่า RTSP URL ลงท้ายด้วย“ 02” ซึ่งหมายความว่าฉันกำลังใช้ฟีดวิดีโอสตรีมย่อยซึ่งจะมีความละเอียดต่ำและอ่านได้เร็วขึ้น นอกจากนี้ประเภทของตัวแปลงสัญญาณวิดีโอที่คุณใช้ก็มีส่วนช่วยในเรื่องความเร็วเช่นกันฉันได้ทดลองใช้รหัสที่แตกต่างกันและพบว่า FFMPEG นั้นเร็วที่สุด
def create_camera (ช่อง): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" # เปลี่ยน IP ให้เหมาะสม your 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 return cap
ใน กล้องอ่าน ฟังก์ชั่นที่เราจะอ่านทั้งสี่คือกล้อง cam1, cam2, cam3 และ cam4 จะรวมพวกเขาทั้งหมดเป็นภาพเดียวที่เรียกว่า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 success, current_screen = cam4.read () Main_screen = current_screen return (หน้าจอหลัก)
ภาพหน้าจอหลักที่มีทั้งสี่กล้องรวมกันจะมีลักษณะเหมือนภาพที่แสดงด้านล่าง
การตรวจจับความเคลื่อนไหวบน OpenCV โดยใช้ Raspberry Pi
เมื่อเรามีภาพพร้อมแล้วเราสามารถเริ่มต้นด้วยการตรวจจับการเคลื่อนไหวของเรา ภายใน ลูป while เราเริ่มต้นด้วยการอ่านสองเฟรมที่แตกต่างกันคือ frame1 และ frame2 จากนั้นแปลงเป็นโทนสีเทา
frame1 = read_camera () # อ่านเฟรมแรก greyImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Convert to grey frame2 = read_camera () #Read the 2nd frame greyImage_F2 = cv2.cvtColor (frame2, cv2.COLGRAY)
จากนั้นเราจะจับความแตกต่างระหว่างภาพทั้งสองนี้เพื่อดูว่ามีอะไรเปลี่ยนแปลงบ้างและด้วยเกณฑ์เราจัดกลุ่มสถานที่ทั้งหมดที่มีการเปลี่ยนแปลงเป็นเหมือนหยดน้ำ นอกจากนี้ยังเป็นเรื่องปกติที่จะเบลอและขยายภาพเพื่อหลีกเลี่ยงขอบคม
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) # รับความแตกต่าง - นี่คือภาพเบลอเย็น = cv2 GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (เบลอImage, 20,255, cv255.) 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 (รูปร่าง) # รับตำแหน่งที่พบการเปลี่ยนแปลงถ้า cv2.contourArea (รูปร่าง)> 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 เหล่านี้กับตำแหน่งของแต่ละหน้าจอเพื่อค้นหาว่าหน้าจอใดให้กิจกรรมและเราครอบตัดหน้าจอนั้นอีกครั้งเพื่อให้เราสามารถแสดงบนหน้าจอสัมผัส 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)
การตั้งปลุกสำหรับการตรวจจับการเคลื่อนไหว
เมื่อเราทราบแล้วว่าตรวจพบการเคลื่อนไหวในหน้าจอใดก็สามารถเพิ่มสัญญาณเตือนประเภทใดก็ได้ที่เราต้องการได้อย่างง่ายดาย ที่นี่เราจะเตือนกริ่งที่เชื่อมต่อกับ GPIO 3. ถ้า การตรวจสอบคำสั่งหากการเคลื่อนไหวที่ถูกตรวจพบในหน้าจอที่ 3 และเพิ่มขึ้นทีละตัวแปรที่เรียกว่าtrig_alarm คุณสามารถตรวจจับหน้าจอที่คุณเลือกหรือแม้แต่บนหน้าจอหลาย ๆ หน้าจอ
ถ้า ((x> cam_width) และ (y
หากค่าของ trig_alarm มากกว่า 3 เราจะส่งเสียงบี๊บหนึ่งครั้ง สาเหตุของการนับนี้คือบางครั้งฉันสังเกตเห็นเงาหรือนกสร้างสัญญาณเตือนปลอม วิธีนี้ก็ต่อเมื่อมีกิจกรรมต่อเนื่อง 3 เฟรมเราจะได้รับการเตือน
ถ้า (trig_alarm> = 3): # รอการเคลื่อนไหว 3 ครั้ง # กด Buzzer 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 Motion Detector ของคุณ
ฉันได้ทดสอบสิ่งนี้เป็นเวลาหลายวันในการรวบรวมและมันใช้งานได้ทุกครั้งและมันก็เป็นงานสร้างที่สนุกจริงๆจนกระทั่งฉันทำกล้องเสียหาย