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)
2 approx = cv2.approxPolyDP(cnt,epsilon,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)

ความคิดเห็น