Blog #3 : Python with OpenCV for Color Detection and find Corner Detection

Sr. Sorawit
DOLAB
Published in
3 min readSep 29, 2018

Image processing ตรวจจับหาสี และหาขอบของวัตถุ

Fig 1. Color Detection and find Corner Detection

Github (code)

สามารถ clone project ในเว็บไซต์นี้ https://github.com/dolabpublic/DOLAB_Blog3

Import libs and Read image

import numpy as np
import cv2
path_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 ยากกว่า

Fig 2. HSV Color Model

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)

ทุกคนอาจจะมีคำถามว่า แล้วจะรู้ได้ไงว่าช่วงสีไหน คือค่าเท่าไร ไม่ยากครับ เดี๋ยวเราจะนำเทคนิคการดูให้ครับ

Fig 3. วัดค่าสีของ object ที่เราสนใจ เครื่องนี้เป็น Macbook นะครับ
Fig 4. วิธีการคำนวนให้เป็นค่า Max ที่ 255

ข้อควรระวัง

จะสังเกตุได้ว่าค่าสีของ Hue ที่วัดดังรูป Fig 3. เนื่องจากเราต้องนำมาแปลงค่าก่อนเพื่อให้อยู่ค่า Max เท่ากัน

ยกตัวอย่าง

ค่า Hue ในโปรแกรมที่วัดมา มีค่า Max อยู่ 360 องศา ซึ่งใน OpenCV มีค่า Max อยู่ที่ 255 จะสังเกตุได้ว่าค่า Max ไม่เท่ากัน จึงไม่สามารถนำตัวเลขในนั้นไปใช้ได้ ดังนั้นเราจึงควรนำค่า 44 องศา มาคำนวนใหม่ จะได้ 31.16 ที่มีค่า Max ที่ 255

สำหรับโปรแกรมดูดสีใน Windows คือโปรแกรม Paint

ถ้าเป็น Windows ก็สามารถใช้โปรแกรม paint ได้ แล้วดูดสีขึ้นมาดูนะครับ สำหรับหน้าตาโปรแกรม paint มีรูปแนบไว้ให้นะครับเผื่อนึกไม่ออก 5555

Fig 5. โปรแกรม Paint สำหรับวัดค่า HSV

เมื่อนำ mask มา show จะได้ดังรูป Fig 6.

cv2.imwrite('/workdir/Documents/DOLAB/Medium/Blog#3/output/mask.png',mask)
Fig 6. detect เฉพาะช่วงสีที่ต้องการ

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)
Fig 7. output โดย detect สีและ มุมของ Object

สามารถ clone project ในเว็บไซต์นี้ https://github.com/dolabpublic/DOLAB_Blog3

ถ้าหากใครสนใจ Image Processing อีก สามารถอ่านการเพิ่มเติมได้ที่ลิ้งค์ด้างล่างนะครับ

Follow me.

--

--

Sr. Sorawit
DOLAB
Editor for

Data Experience @Guru Square • Software Engineer • From @Thailand • founder dolab • Website:http://dolab.cc/ Email:dolab.founder@gmail.com • Facebook:dolab