Color and Shape Detect using Python and OpenCV
การตรวจจับสีและรูปทรงจะแบ่งการทำงานออกเป็น 2 ส่วน คือ
1.การตรวจสอบสี
2.การตรวจจับรูปทรง
1. การตรวจสอบสี
การตรวจสอบสีจะใช้การแปรงค่าสีจากกล้องก่อนจาก BGRให้เป็นสีระบบ HSV เนื่องจากสีระบบHSVจะสามารถระบุทั้งค่าความเข้มและความสว่างออกจากแม่สี ต่างจากระบบBGR ที่จะมีแค่แม่สีให้ใส่เท่านั้น โดยจะทำการสุ่มตัดสีโดยเริ่มจากการหาค่าช่วงHue(มุมของสี) ที่ต้องการก่อน แล้วจึงทำการปรับค่าSatและVต่อไป เพื่อเอาอค่ค่าสีบนผิวเท่านั้น ไม่เอาด้านข้างของวัตถุที่เกิดจากมุมPerspective
ค่ามุม Hue (ขอบคุณรูปภาพจาก http://eholidaysasia.com) |
ตัดเฉพาะช่วงสีที่ต้องการ |
เมื่อเราตัดเฉพาะช่วงสีที่ต้องการต่อไปทำการหาจุดตรงกลาง โดยเช็คจากcontourทีละอัน โดยใช้ฟังก์ชัน cv2.findContours() และ โดยแต่ละcontourของเรา ยังไม่รู้ว่ารูปทรงอะไร โดยแต่ละcontourเมื่อตัดออกมาจะได้ดังรูป
contourในrangeสีส้ม |
lower_red = np.array([131,92,141]) #red upper_red = np.array([179,255,255]) lower_green = np.array([50,38,169]) #green upper_green = np.array([82,255,255]) lower_yellow = np.array([18,32,214]) #yellow upper_yellow = np.array([31,255,255]) lower_blue = np.array([91,93,199]) #blue upper_blue = np.array([105,255,255]) lower_orange = np.array([10,67,232]) #orange upper_orange = np.array([29,255,255]) lower_violet = np.array([110,70,171]) #violet upper_violet = np.array([121,255,255])
credit:pyimagesearch |
2. การตรวจสอบรูปทรง
การตรวจสอบรูปทรงจะใช้หลักการหักมุมของรูปทรง โดยใช้ฟังก์ชันapproxPolyDp เพื่อหาจำนวนมุมของวัตถุ
1 epsilon = 0.1*cv2.arcLength(cnt,True)
ซึ่งค่าepsilonนั้น เราสามารถปรับได้ให้มีความพอดีกับขนาดรูปทรง โดยทั่วไปจะใช้ค่า0.1 หมายความว่า ให้ตรวจสอบมุมทุก10%ของความยาวarcLengthของวัตถุ ซึ่งความยาว arc คือความยาวจากจุดศุนย์กลางของวัตถุ ตัวอย่างเช่น
วัตถุ4เหลี่ยมจะมี approx = 4
วัตถุ5เหลี่ยมจะมี approx = 5
ส่วนวัตถุที่เป็นทรงกลมจะมีค่ามากกว่า13
เมื่อนำ2ส่วนมารวมกัน โดยหลังจากที่เราแยกสีแล้วจึงนำมาตรวจสอบว่าเป็นรูปทรงอะไรก็จะสามารถทราบสีและรูปทรงของวัตถุได้
รูปที่1 จับรูปทรงและสีของวัตถุ
และการหามุมของวัตถุนั้น ใช้ฟังก์ชัน cv2.minAreaRect(contour) โดย4เหลี่ยมจะได้มุมในช่วง 90,-90
แต่รูปทรง3เหลี่ยมนั้น ต้องใช้ฟังก์ชัน cv2.minEnclosingTriangle(contour) ฟังก์ชันนี้จะทำการ fitรูป3เหลี่ยมเข้าไปในcontourของเรา แล้วส่งกลับมาเป็นมุม3มุมของ3เหลี่ยม เมื่อได้มุม3มุมของ3เหลี่ยมแล้วนั้น จึงนำมาหาเส้นที่ยาวที่สุดเพื่อหามุมต่อไป
โดยมุมของ3เหลี่ยมนั้น จะอิงจากหัวลูกศร โดยแนวตั้งฉาก=0 จนถึง180
เมื่อได้ทุกส่วนจึงส่งไปเป็นformat [ Shape , x , y , color , angle]
Source Code: https://pastebin.com/xZ6TbGmZ (ใช้ python 3)
|
ความคิดเห็น
แสดงความคิดเห็น