เราเริ่มต้นด้วยการเรียนรู้พื้นฐานของ OpenCV จากนั้นทำการประมวลผลภาพขั้นพื้นฐานและการปรับแต่งภาพตามด้วยการแบ่งส่วนภาพและการดำเนินการอื่น ๆ อีกมากมายโดยใช้ภาษา OpenCV และ python ที่นี่ในส่วนนี้เราจะใช้เทคนิคการตรวจจับวัตถุง่ายๆโดยใช้การจับคู่เทมเพลต เราจะพบวัตถุในภาพจากนั้นเราจะอธิบายคุณสมบัติของมัน คุณสมบัติที่เป็นคุณลักษณะทั่วไปของภาพเช่นมุมขอบ ฯลฯ นอกจากนี้เรายังจะดูที่พบบ่อยและการตรวจสอบวัตถุที่นิยมบางขั้นตอนวิธีการเช่นร่อน, SURF รวดเร็ว breifและลูกโลก
ตามที่บอกไว้ในบทช่วยสอนก่อนหน้านี้ OpenCV คือ Open Source Commuter Vision Library ซึ่งมีอินเตอร์เฟส C ++, Python และ Java และรองรับ Windows, Linux, Mac OS, iOS และ Android ดังนั้นจึงสามารถติดตั้งได้อย่างง่ายดายใน Raspberry Pi ด้วยสภาพแวดล้อม Python และ Linux และ Raspberry Pi พร้อม OpenCV และกล้องที่ติดมาสามารถใช้เพื่อสร้างแอปพลิเคชันการประมวลผลภาพแบบเรียลไทม์มากมายเช่นการตรวจจับใบหน้าการล็อกใบหน้าการติดตามวัตถุการตรวจจับป้ายทะเบียนรถยนต์ระบบรักษาความปลอดภัยภายในบ้าน
การตรวจจับและจดจำวัตถุเป็นรูปแบบการใช้งานที่สำคัญที่สุดสำหรับการมองเห็นของคอมพิวเตอร์โดยใช้เพื่อทำสิ่งที่มีประสิทธิภาพเช่น
- ฉากการติดฉลาก
- การนำทางหุ่นยนต์
- รถยนต์ขับเอง
- การจดจำร่างกาย (Microsoft Kinect)
- การตรวจหาโรคและมะเร็ง
- การจดจำใบหน้า
- การจดจำลายมือ
- การระบุวัตถุในภาพถ่ายดาวเทียม
การตรวจจับวัตถุ VS การรับรู้
การรับรู้วัตถุเป็นการตรวจจับวัตถุระดับที่สองซึ่งคอมพิวเตอร์สามารถรับรู้วัตถุจากวัตถุหลายชิ้นในภาพและอาจสามารถระบุได้
ตอนนี้เราจะทำหน้าที่ประมวลผลภาพเพื่อค้นหาวัตถุจากภาพ
การค้นหาวัตถุจากรูปภาพ
ที่นี่เราจะใช้การจับคู่แม่แบบสำหรับการค้นหาตัวละคร / วัตถุในภาพใช้ ฟังก์ชัน cv2.matchTemplate () ของ OpenCV เพื่อค้นหาวัตถุนั้น
import cv2 import numpy เป็น np
โหลดภาพอินพุตและแปลงเป็นสีเทา
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('people', รูปภาพ) cv2.waitKey (0) gray = cv2.cvtColor (รูปภาพ, cv2.COLOR_BGR2GRAY)
โหลดภาพเทมเพลต
template = cv2.imread ('waldo.jpg', 0) #result ของการจับคู่แม่แบบของออบเจ็กต์เหนือ ผลลัพธ์ของ ภาพ= cv2.matchTemplate (สีเทา, template, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (ผลลัพธ์)
สร้างกรอบกั้น
top_left = max_loc # การเพิ่มขนาดของสี่เหลี่ยมผืนผ้าล้อมรอบ 50 พิกเซล bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (รูปภาพ, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('พบวัตถุ', รูปภาพ) cv2.waitKey (0) cv2.destroyAllWindows ()
ใน cv2.matchTemplate (สีเทา, template, cv2.TM_CCOEFF) ให้ป้อนภาพระดับสีเทาเพื่อค้นหาวัตถุและเทมเพลต จากนั้นให้ใช้วิธีการจับคู่แม่แบบสำหรับการค้นหาวัตถุจากภาพที่นี่ cv2.TM_CCOEFF ถูกนำมาใช้
ฟังก์ชันทั้งหมดจะส่งคืนอาร์เรย์ที่ป้อนเข้าในผลลัพธ์ซึ่งเป็นผลลัพธ์ของขั้นตอนการจับคู่เทมเพลต
จากนั้นเราใช้ cv2.minMaxLoc (ผลลัพธ์) ซึ่งจะให้พิกัดหรือกล่องขอบเขตที่พบวัตถุในภาพและเมื่อเราได้รับพิกัดเหล่านั้นให้วาดรูปสี่เหลี่ยมผืนผ้าทับและยืดขนาดของกล่องออกไปเล็กน้อยเพื่อให้ วัตถุสามารถใส่เข้าไปในสี่เหลี่ยมผืนผ้าได้อย่างง่ายดาย
มีหลายวิธีในการจับคู่เทมเพลตและในกรณีนี้เรากำลังใช้ cv2.TM_CCOEFF ซึ่งหมายถึงสัมประสิทธิ์สหสัมพันธ์
จุดสำคัญคือพิกัด (X, Y) ที่สกัดโดยใช้เครื่องตรวจจับการร่อนและวาดบนภาพโดยใช้ฟังก์ชันจุดสำคัญวาด cv2
เซิร์ฟ
import cv2 import numpy เป็น np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
สร้างวัตถุ SURF Feature Detector ที่นี่เราตั้งค่าเกณฑ์ hessian เป็น 500
surf = cv2.xfeatures2d.SURF_create (500) จุดสำคัญ, descriptors = surf.detectAndCompute (สีเทา, ไม่มี) พิมพ์ ("จำนวนจุดสำคัญที่ตรวจพบ:", len (จุดสำคัญ))
วาดประเด็นสำคัญบนภาพอินพุต
image = cv2.drawKeypoints (รูปภาพ, จุดสำคัญ, ไม่มี, แฟล็ก = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - SURF', รูปภาพ) cv2.waitKey () cv2.destroyAllWindows ()
เอาต์พุตคอนโซล:
รวดเร็ว
import cv2 import numpy เป็น np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
สร้างวัตถุตรวจจับ FAST
fast = cv2.FastFeatureDetector_create () # รับจุดสำคัญโดยค่าเริ่มต้นการปราบปรามที่ไม่ใช่สูงสุดคือเปิด # เพื่อปิดการตั้งค่า fast.setBool ('nonmaxSuppression', False) keypoints = fast.detect (สีเทา, ไม่มี) พิมพ์ ("จำนวนจุดสำคัญ ตรวจพบ: ", len (จุดสำคัญ))
วาดคีย์พอยต์ที่หลากหลายบนภาพอินพุต
image = cv2.drawKeypoints (รูปภาพ, จุดสำคัญ, ไม่มี, แฟล็ก = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - FAST', รูปภาพ) cv2.waitKey () cv2.destroyAllWindows ()
เอาต์พุตคอนโซล:
สั้น ๆ
import cv2 import numpy เป็น np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
สร้างวัตถุตรวจจับ FAST
สั้น ๆ = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
สร้างวัตถุตัวแยก BRIEF
#brief = cv2.DescriptorExtractor_create ("BRIEF") # กำหนดจุดสำคัญประเด็นสำคัญ = fast.detect (สีเทาไม่มี)
รับคำอธิบายและประเด็นสำคัญสุดท้ายใหม่โดยใช้ BRIEF
keypoints, descriptors = brief.compute (สีเทา, จุดสำคัญ) พิมพ์ ("จำนวนจุดสำคัญที่ตรวจพบ:", len (คีย์พอยต์))
วาดคีย์พอยต์ที่หลากหลายบนภาพอินพุต
image = cv2.drawKeypoints (รูปภาพ, จุดสำคัญ, ไม่มี, แฟล็ก = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - BRIEF', รูปภาพ) cv2.waitKey () cv2.destroyAllWindows ()
เอาต์พุตคอนโซล:
ลูกโลก
import cv2 import numpy เป็น np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
สร้างวัตถุ ORB เราสามารถระบุจำนวนประเด็นสำคัญที่เราต้องการได้
orb = cv2.ORB_create () # กำหนดจุดสำคัญจุดสำคัญ = orb.detect (สีเทาไม่มี)
ขอรับคำอธิบาย
คีย์พอยต์, descriptors = orb.compute (สีเทา, คีย์พอยต์) พิมพ์ ("จำนวนคีย์พอยต์ที่ตรวจพบ:", เลน (คีย์พอยต์))
วาดคีย์พอยต์ที่หลากหลายบนภาพอินพุต
image = cv2.drawKeypoints (รูปภาพ, จุดสำคัญ, ไม่มี, แฟล็ก = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - ORB', รูปภาพ) cv2.waitKey () cv2.destroyAllWindows ()
เอาต์พุตคอนโซล:
เราสามารถระบุจำนวนคีย์พอยต์ที่มีขีด จำกัด สูงสุด 5000 อย่างไรก็ตามค่าดีฟอลต์คือ 500 กล่าวคือ ORB จะตรวจจับคีย์พอยต์ที่ดีที่สุด 500 คีย์โดยอัตโนมัติหากไม่ได้ระบุค่าคีย์พอยต์
นี่คือวิธีการตรวจจับวัตถุใน OpenCV โปรแกรมเดียวกันนี้ยังสามารถเรียกใช้ใน OpenCV ที่ติดตั้ง Raspberry Pi และสามารถใช้เป็นอุปกรณ์พกพาเช่นสมาร์ทโฟนที่มี Google Lens
บทความนี้อ้างอิงจาก Master Computer Vision ™ OpenCV4 ในหลักสูตร Python with Deep Learning บน Udemy ที่สร้างโดย Rajeev Ratan สมัครรับข้อมูลเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ Computer Vision และ Python