Blog #3 : Python with OpenCV for Color Detection and find Corner Detection
Image processing ตรวจจับหาสี และหาขอบของวัตถุ
Github (code)
สามารถ clone project ในเว็บไซต์นี้ https://github.com/dolabpublic/DOLAB_Blog3
Import libs and Read image
import numpy as np
import cv2path_img = '/workdir/Documents/DOLAB/Medium/Blog#3/IMG_2620.jpg'
img = cv2.imread(path_img)
Convert BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
What is HSV? (Hue, Saturation, Value)
HSV color model เป็นการพิจารณาสีโดยใช้ Hue, Saturation, Value ซึ่งเป็นตัวแทนของระบบสี RGB เพื่อทำให้ง่ายขึ้นในการเราจะคัดแยกสี จริงแล้วทำแบบ RGB หรือ BGR ก็ได้แต่จะ Fine tune ยากกว่า
Hue คือ ค่าสีของสีหลัก หรือจะเรียกว่า เฉดสี ก็ได้
Saturation คือ ความบริสุทธิ์ของสี
Value คือ ความสว่างของสี ซึ่งสามารถวัดได้โดยค่าความเข้มของความสว่างของแต่ละสีเ
Set Range HSV of Target
เมื่อเราแปลง BGR color model มาเป็น HSB color moel แล้ว ดังนั้นเรามาลองกำหนดช่วงสีที่เราต้องการกัน โดยจะเริ่มกำหนดจาก Hue ก่อนแล้วค่อยไปกำหนด Saturation และ Value ซึ่งจาก code ด้านล่างได้กำหนดไว้
# define range of blue color in HSV
lower_blue = np.array([20,180,180])
upper_blue = np.array([40,255,255])# Threshold the HSV image to get only blue colors
mask = cv2.inRange(hsv, lower_blue, upper_blue)
ทุกคนอาจจะมีคำถามว่า แล้วจะรู้ได้ไงว่าช่วงสีไหน คือค่าเท่าไร ไม่ยากครับ เดี๋ยวเราจะนำเทคนิคการดูให้ครับ
ข้อควรระวัง
จะสังเกตุได้ว่าค่าสีของ Hue ที่วัดดังรูป Fig 3. เนื่องจากเราต้องนำมาแปลงค่าก่อนเพื่อให้อยู่ค่า Max เท่ากัน
ยกตัวอย่าง
ค่า Hue ในโปรแกรมที่วัดมา มีค่า Max อยู่ 360 องศา ซึ่งใน OpenCV มีค่า Max อยู่ที่ 255 จะสังเกตุได้ว่าค่า Max ไม่เท่ากัน จึงไม่สามารถนำตัวเลขในนั้นไปใช้ได้ ดังนั้นเราจึงควรนำค่า 44 องศา มาคำนวนใหม่ จะได้ 31.16 ที่มีค่า Max ที่ 255
สำหรับโปรแกรมดูดสีใน Windows คือโปรแกรม Paint
ถ้าเป็น Windows ก็สามารถใช้โปรแกรม paint ได้ แล้วดูดสีขึ้นมาดูนะครับ สำหรับหน้าตาโปรแกรม paint มีรูปแนบไว้ให้นะครับเผื่อนึกไม่ออก 5555
เมื่อนำ mask มา show จะได้ดังรูป Fig 6.
cv2.imwrite('/workdir/Documents/DOLAB/Medium/Blog#3/output/mask.png',mask)
Create contours of image
นำเทคนิค contours ใน OpenCV มาประยุกต์ เพื่อนำมาจับ object ที่ต้องแล้วนำ เทคนิค Approx เพื่อมาช่วยประมาณ contours
im2, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)for c in contours:
rect = cv2.boundingRect(c)
x,y,w,h = rect
area = w * h epsilon = 0.08 * cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, epsilon, True)# กำหนด Area ที่จะทำการ Draw Contour
if area > 200000:
cv2.drawContours(img, [approx], -1, (0, 0, 255), 5)
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 5)
print('approx', approx)
for x in range(0, len(approx)):
cv2.circle(img, (approx[x][0][0], approx[x][0][1]), 30, (0,0,255), -1)
สามารถ clone project ในเว็บไซต์นี้ https://github.com/dolabpublic/DOLAB_Blog3
ถ้าหากใครสนใจ Image Processing อีก สามารถอ่านการเพิ่มเติมได้ที่ลิ้งค์ด้างล่างนะครับ
Follow me.
- Facebook : https://www.facebook.com/dolabFounder/
- Website : http://dolab.cc
- Medium : https://medium.com/dolab