สารบัญ:

การนับวัตถุ Raspberry Pi: 5 ขั้นตอน
การนับวัตถุ Raspberry Pi: 5 ขั้นตอน

วีดีโอ: การนับวัตถุ Raspberry Pi: 5 ขั้นตอน

วีดีโอ: การนับวัตถุ Raspberry Pi: 5 ขั้นตอน
วีดีโอ: รีวิวบอร์ด Raspberry Pi 5 2024, กรกฎาคม
Anonim
การนับวัตถุ Raspberry Pi
การนับวัตถุ Raspberry Pi

คอมพิวเตอร์วิทัศน์เป็นสิ่งที่น่าอัศจรรย์อย่างแน่นอน! เมื่อใช้สิ่งนี้ คอมพิวเตอร์จะได้รับความสามารถในการ "มองเห็น" และรับรู้สภาพแวดล้อมโดยรอบได้ดีขึ้น ซึ่งช่วยให้สามารถพัฒนาแอปพลิเคชันที่ซับซ้อน มีประโยชน์ และยอดเยี่ยมได้ แอปพลิเคชันต่างๆ เช่น การตรวจจับและจดจำใบหน้า การติดตามวัตถุ และการตรวจจับวัตถุมีมากขึ้นเรื่อยๆ ในกิจกรรมประจำวันของเรา ด้วยความก้าวหน้าในการมองเห็นด้วยคอมพิวเตอร์

เมื่อพิจารณาถึงความล้ำหน้าและเข้าถึงได้ของขอบข่ายงานคอมพิวเตอร์วิทัศน์และเครื่องมือ แอปพลิเคชันที่อธิบายในบทความนี้เหมาะสมอย่างยิ่ง: ใช้ Raspberry PI อย่างง่าย และเฟรมเวิร์กคอมพิวเตอร์วิทัศน์แบบโอเพนซอร์สที่เรียกว่า OpenCV ที่ไม่มีค่าใช้จ่ายเพื่อนับวัตถุที่กำลังเคลื่อนที่ วัตถุเข้าและออกจากโซนที่ถูกตรวจสอบ

ขั้นตอนที่ 1: เจาะลึกมากขึ้น: ตรวจพบการเคลื่อนไหวของวัตถุในสตรีมภาพได้อย่างไร

ลึกขึ้น: ตรวจพบการเคลื่อนไหวของวัตถุในสตรีมภาพได้อย่างไร
ลึกขึ้น: ตรวจพบการเคลื่อนไหวของวัตถุในสตรีมภาพได้อย่างไร

ตอนนี้ได้เวลาลงลึกในการประมวลผลภาพแล้ว:

วิธีรับภาพสตรีมเว็บแคมและตรวจพบว่ามีบางอย่างย้ายไปที่นั่น

ประกอบด้วยห้าขั้นตอน:

ขั้นตอนที่ 1: เพื่อเน้นวัตถุในการเคลื่อนไหว

ตามที่กำหนดไว้ในฟิสิกส์คลาสสิก การอ้างอิงเป็นสิ่งจำเป็นในการอนุมานว่ามีบางอย่างกำลังเคลื่อนไหวหรือถ้ามันหยุดนิ่ง ในการพิจารณาว่ามีบางอย่างเคลื่อนไหวแล้ว ค่อนข้างจะเหมือนกัน: ทุกเฟรมที่จับภาพสตรีมของเว็บแคมจะถูกนำไปเปรียบเทียบกับหน้าต่างอ้างอิง หากมีบางสิ่งที่แตกต่างออกไป บางสิ่งก็ถูกย้าย มันง่ายอย่างที่คิด

หน้าต่างอ้างอิงนี้ต้องอยู่ในสภาวะที่สมบูรณ์แบบที่สุด (เช่น ไม่มีอะไรเคลื่อนไหว) ในโลกของการประมวลผลภาพ การเปรียบเทียบระหว่างเฟรมที่จับภาพกับกรอบอ้างอิงนี้ประกอบด้วยเทคนิคที่เรียกว่าการลบพื้นหลัง การลบพื้นหลังประกอบด้วยการลบข้อมูลสีแบบพิกเซลต่อพิกเซลตามตัวอักษรจากเฟรมที่จับภาพและหน้าต่างอ้างอิง ดังนั้นภาพที่ได้มาจากกระบวนการนี้จะเน้น/แสดงรายละเอียดเพิ่มเติมเฉพาะสิ่งที่แตกต่างระหว่างสองเฟรมนี้ (หรือสิ่งที่เคลื่อนไหว/มีการเคลื่อนไหว) และส่วนอื่นๆ จะเป็นสีดำในภาพ (สีของค่าศูนย์บนสีเทา -ขนาดพิกเซล) ข้อสำคัญ: สภาพแสงและคุณภาพของภาพเว็บแคมที่ถ่าย (เนื่องจากคุณภาพของเซ็นเซอร์จับ) อาจแตกต่างกันเล็กน้อยในแต่ละเฟรม มันบอกเป็นนัยว่า "ส่วนที่เท่ากัน" จากหน้าต่างอ้างอิงและเฟรมอื่นจะไม่เป็นสีดำทั้งหมดหลังจากการลบพื้นหลัง แม้จะมีพฤติกรรมเช่นนี้ แต่ก็ไม่มีผลกระทบร้ายแรงในขั้นตอนต่อไป การประมวลผลภาพในโครงการนี้

เพื่อลดเวลาในการประมวลผลภาพ ก่อนที่จะทำการลบพื้นหลัง เฟรมที่จับภาพและกรอบอ้างอิงจะถูกแปลงเป็นภาพมาตราส่วนสีเทา แต่..ทำไม? เป็นปัญหาด้านประสิทธิภาพการประมวลผล: รูปภาพที่แสดงหลายสี (ภาพสี) มีสามข้อมูลต่อพิกเซล: ส่วนประกอบสีแดง สีน้ำเงิน และสีเขียว (มาตรฐาน RGB แบบเก่าแต่เป็นสีทอง) ดังนั้น โดยนัยแล้ว แต่ละพิกเซลสามารถกำหนดเป็นอาร์เรย์สามค่า โดยแต่ละพิกเซลเป็นตัวแทนขององค์ประกอบสี ดังนั้น เมื่อขยายไปถึงทั้งภาพ ภาพสุดท้ายจะเป็นการผสมผสานระหว่างองค์ประกอบภาพสามส่วน: ส่วนประกอบภาพสีแดง สีน้ำเงิน และสีเขียว

ในการประมวลผลต้องใช้งานจำนวนมาก! อย่างไรก็ตาม ในภาพระดับสีเทา แต่ละพิกเซลมีข้อมูลสีเพียงสีเดียว ดังนั้น การประมวลผลภาพสีจึงช้ากว่าในกรณีของภาพระดับสีเทา 3 เท่า (อย่างน้อย 3 เท่า ขึ้นอยู่กับเทคนิคที่เกี่ยวข้อง) และยังมีอีกมาก: สำหรับวัตถุประสงค์บางอย่าง (เช่น โครงการนี้) กระบวนการสีทั้งหมดไม่จำเป็นหรือสำคัญเลย ดังนั้นเราจึงได้ข้อสรุป: ขอแนะนำให้ใช้ภาพระดับสีเทาเพื่อการประมวลผลภาพ หลังจากลบพื้นหลังแล้ว จำเป็นต้องใช้ฟิลเตอร์ Gaussian Blur

ตัวกรอง Gaussian Blur ที่ใช้กับภาพที่ลบพื้นหลังจะทำให้เส้นขอบทั้งหมดของวัตถุที่ตรวจพบเคลื่อนไหวราบรื่นขึ้น แน่นอนว่าจะเป็นประโยชน์ในขั้นตอนต่อไปของการประมวลผลภาพ

ขั้นตอนที่ 2: Binarization

Binarization
Binarization

ในกรณีส่วนใหญ่ของการประมวลผลภาพ ไบนารีเกือบจะเป็นขั้นตอนบังคับหลังจากเน้นวัตถุ/ลักษณะเฉพาะในรูปภาพ เหตุผล: ในภาพไบนารี แต่ละสีพิกเซลสามารถสันนิษฐานได้สองค่าเท่านั้น: 0x00 (สีดำ) หรือ 0xFF (สีขาว) วิธีนี้ช่วยประมวลผลภาพได้มากเพื่อให้ต้องใช้ "พลังประมวลผล" น้อยลงเพื่อใช้เทคนิคการประมวลผลภาพในขั้นตอนต่อไป Binarization สามารถทำได้โดยเปรียบเทียบแต่ละสีพิกเซลของภาพระดับสีเทากับเกณฑ์ที่กำหนด หากค่าของสีพิกเซลมากกว่าเกณฑ์ สีพิกเซลนี้จะถือว่าค่าสีขาว (0xFF) และหากค่าของสีพิกเซลต่ำกว่าเกณฑ์ สีพิกเซลนี้จะถือว่าค่าสีดำ (0x00) น่าเสียดายที่ตัวเลือกของค่าขีดจำกัดนั้นสร้างได้ไม่ง่ายนัก ขึ้นอยู่กับปัจจัยแวดล้อม เช่น สภาพแสง การเลือกค่าเกณฑ์ที่ไม่ถูกต้องอาจทำให้ขั้นตอนทั้งหมดเสียหายได้ ดังนั้น เราขอแนะนำให้คุณปรับเกณฑ์ในโปรเจ็กต์สำหรับกรณีของคุณด้วยตนเองก่อนดำเนินการใดๆ เพิ่มเติม ค่าเกณฑ์นี้ต้องแน่ใจว่าวัตถุที่เคลื่อนไหวจะแสดงในรูปไบนารี ในกรณีของฉัน หลังจากตัวเลือกที่เพียงพอของธรณีประตูแล้ว ผลลัพธ์ในสิ่งที่คุณเห็นในรูปที่ 5

รูปที่ 5 - ภาพไบนารี

ขั้นตอนที่ 3: ขยายขนาด

จนถึงขณะนี้ เราสามารถตรวจจับวัตถุที่เคลื่อนไหว เน้นวัตถุ และใช้ไบนารี่ได้ ซึ่งส่งผลให้ภาพวัตถุเคลื่อนไหวค่อนข้างชัดเจน (= ภาพค่อนข้างชัดเจนของวัตถุเพื่อวัตถุประสงค์ในการประมวลผลภาพ) การเตรียมการสำหรับการนับวัตถุเกือบเสร็จแล้ว "เกือบ" ในที่นี้หมายความว่ามีการปรับเปลี่ยนบางอย่างก่อนที่จะดำเนินการต่อไป ณ จุดนี้ มีโอกาสจริงที่จะมี "รู" ในวัตถุ (มวลพิกเซลสีดำไปยังวัตถุที่เน้นสีขาว) รูเหล่านี้สามารถเป็นอะไรก็ได้ ตั้งแต่สภาพแสงโดยเฉพาะไปจนถึงบางส่วนของรูปร่างของวัตถุ เมื่อรูสามารถ "สร้าง" วัตถุปลอมภายในวัตถุจริงได้ (ขึ้นอยู่กับว่ามีขนาดใหญ่แค่ไหนและอยู่ที่ไหน) ผลที่ตามมาของการมีอยู่ของรูในภาพอาจเป็นหายนะต่อการนับวัตถุ วิธีกำจัดรูเหล่านี้คือการใช้เทคนิคการประมวลผลภาพที่เรียกว่า Dilate ใช้สิ่งนี้และรูจะหายไป

ขั้นตอนที่ 4: การค้นหา Contours (และ Centroids)

การค้นหา Contours (และ Centroids)
การค้นหา Contours (และ Centroids)

ณ จุดนี้ เรามีวัตถุที่ไฮไลต์ไว้ ไม่มีรูข้างในและพร้อมสำหรับขั้นตอนต่อไป: การค้นหารูปทรง (และเซนทรอยด์ของวัตถุ) มีทรัพยากรใน OpenCV เพื่อตรวจจับรูปทรงโดยอัตโนมัติ แต่ตัวนับที่ตรวจพบต้องได้รับการคัดเลือกอย่างชาญฉลาด (เพื่อเลือกวัตถุจริงหรือวัตถุเท่านั้น) ดังนั้น เกณฑ์ในการตรวจจับเส้นขอบคือพื้นที่ของวัตถุ ซึ่งวัดเป็นพิกเซล² ถ้าเส้นชั้นความสูงมีพื้นที่สูงกว่าขีดจำกัด (กำหนดค่าในซอฟต์แวร์) จึงต้องถือว่าเป็นวัตถุจริงที่จะนับ การเลือกขีดจำกัด/เกณฑ์พื้นที่นี้มีความสำคัญมาก และการเลือกที่ไม่ถูกต้องในที่นี้หมายถึงการนับที่ไม่ถูกต้อง คุณต้องลองใช้ค่าจำกัดค่าพื้นที่และตรวจสอบสิ่งที่เหมาะสมกับการใช้งานของคุณมากกว่า ไม่ต้องกังวล ขีดจำกัดเหล่านี้ไม่ยากที่จะค้นหา/ปรับ เมื่อเลือกวัตถุทั้งหมดในรูปภาพแล้ว ขั้นตอนต่อไปคือการวาดสี่เหลี่ยมทับบนวัตถุนั้น (การจัดเรียงใหม่นี้ต้องมีวัตถุที่ตรวจพบทั้งหมดอยู่ภายใน) และจุดศูนย์กลางของสี่เหลี่ยมนี้คือ…. วัตถุเซนทรอยด์! คุณอาจจะคิดว่า "อะไรคือเรื่องใหญ่กับเซนทรอยด์นี้" ใช่ไหม? นี่คือคำตอบของคุณ: ไม่ว่ารูปร่างของวัตถุจะใหญ่แค่ไหนหรือเป็นอย่างไร การเคลื่อนที่ของวัตถุนั้นเหมือนกันกับเซนทรอยด์ กล่าวอีกนัยหนึ่ง: จุดง่าย ๆ ที่เรียกว่าเซนทรอยด์นี้แสดงถึงการเคลื่อนที่ทั้งหมดของวัตถุ มันทำให้การนับเป็นเรื่องง่ายมากใช่ไหม ดูภาพด้านล่าง (รูปที่ 6) โดยที่จุดศูนย์กลางของวัตถุแสดงเป็นจุดสีดำ

ขั้นตอนที่ 5: การเคลื่อนที่และการนับวัตถุของ Centorid

ตอนจบที่ยิ่งใหญ่: เปรียบเทียบพิกัดเซนทรอยด์ของวัตถุกับพิกัดเส้นเข้าและออก และใช้อัลกอริทึมการนับที่อธิบายไว้ก่อนหน้านี้ และจะมีการนับวัตถุเคลื่อนที่!

ผลลัพธ์สุดท้ายดังที่แสดงในตอนต้นของโพสต์นี้ นี่คือโครงการที่กำลังดำเนินการอยู่:

แนะนำ: