FOBI

FOBI

การมองเห็นของ FOBI

การมองเห็นของ FOBI นั้นเป็นส่วนที่ที่สำคัญที่สุดในการที่ให้ FOBI มีปฏิสัมพันธ์กับมนุษย์ได้โดยการให้ FOBI มองหาเพื่อให้รู้ว่ามีผู้ใช้งานอยู่หรือไม่ ถ้ามีผู้ใช้งานในการมองเห็น ถ้าไม่ได้รับการทักทายหรือคำสั่งใดๆ FOBI จะชวนคุยด้วยตัวเอง แต่ถ้าไม่มี FOBI จะทำการมองหาโดยการสุ่มการหมุนไปมาและเพื่อให้ส่วนอื่นๆทำงานต่อได้ ถ้า FOBI มองไม่เห็นผู้ใช้งาน ถึงได้รับคำก็จะไม่ทำงานตามคำสั่งนั้น ดังนั้นแล้วการมองเห็นต้องเป็นส่วนแรกในการมีปฎิสัมพันธ์กับผู้ใช้งาน โดยเราจะใช้ OpenCV ที่เป็น Library ของ ภาษา Python ในการใช้งานสำหรับการมองเห็นของ FOBI

OpenCV

การติดตั้ง OpenCV

OpenCV (Open source Computer Vision) เป็นไลบรารี่การเขียนโปรแกรมที่สนับสนุนเฟรมเวิร์ก Deep Learning, TensorFlow,Torch/PyRorch และ Caffe
สำหรับ FOBI ใช้ Library นี้ ในการเรียนรู้เชิงลึกในการคาดการใบหน้าและสีผิวของมนุษย์ ใน Raspberry pi นั้น จะใช้คำสั่ง

sudo apt-get install opencv-python3

การทำ Skin Detection

ขั้นตอนที่ 1

จะทำการหาค่า hsv_min และ hsv_max เพื่อหาค่าสีของสีผิวและในตอนนี้เราก็จะใช้ OpenCV ที่เราได้ติดตั้งไว้มาใช้งาน และในกรณีนี้ เราจะใช้ Trackbar เพื่อให้งายในการหาค่าสีผิวตามโค้ดตัวอย่าง

Trackbฟr

บรรทัดที่ 4 หน้าwindowของ Trackbar และจะต้องใส่ชื่อของ window นั้นด้วย
บรรัดที่ 7-12 จะเป็นการสร้าง Trackbar ทั้งหมด 6 Trackbar paramete ที่ต้องใส่คือ ชื่อ Trackbar,Window,ค่าต่ำสุด,ค่าสูงสุด
และฟังก์ชันที่ต้องการเรียกเมื่อค่าเปลี่ยน
บรรทัดที่ 14 เป็นการเปิดการใช้งาน Camera ตัวที่ 0(ตัวแรก)
บรรทัดที่ 18 เป็นการรับภาพที่ได้ไปเก็บไว้ในตัวแปร frame
บรรทัดที่ 19 เป็นการแปลงสีภาพจาก BGR เป็น hsv ภาพที่ถูกแปลงสีเก็บไว้ที่ตัวแปร hsv
บรรทัดที่ 20-25 จะเป็นการนำค่า min และ max ที่ได้จากการเปลี่ยน ไปเก็บไว้ในตัวแปร min,max ของhsv
บรรทัดที่ 27 นำค่า hsv_minไปเก็บไว้ในตัวแปรอาเรย์ lower
บรรทัดที่ 28 นำค่า hsv_maxไปเก็บไว้ในตัวแปรอาเรย์ upper
บรรทัดที่ 29 นำภาพ hsv เทียบค่าสี lower และ upper ไปเก็บไว้ในตัวแปร mask
บรรทัดที่ 31 เป็นการแสดงภาพปกติ
บรรทัดที่ 31 เป็นการแสดงภาพที่ผ่านการแปลงสี
โปรแกรมจะ Loop ไปจนกว่า key จะเท่ากับ 27 หรือกด esc

import cv2
import numpy as np

cv2.namedWindow('Track')
def track(x):
    print(x)
cv2.createTrackbar('h min','Track',0,179,track)
cv2.createTrackbar('h max','Track',0,179,track)
cv2.createTrackbar('s min','Track',0,255,track)
cv2.createTrackbar('s max','Track',0,255,track)
cv2.createTrackbar('v min','Track',0,255,track)
cv2.createTrackbar('v max','Track',0,255,track)

cap = cv2.VideoCapture(0)

while 1:
   ret,frame = cap.read()
   hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
   h_min = cv2.getTrackbarPos('h min','Track')
   h_max = cv2.getTrackbarPos('h max','Track')
   s_min = cv2.getTrackbarPos('s min','Track')
   s_max = cv2.getTrackbarPos('s max','Track')
   v_min = cv2.getTrackbarPos('v min','Track')
   v_max = cv2.getTrackbarPos('v max','Track')

   lower_blue = np.array([h_min,s_min,v_min])
   upper_blue = np.array([h_max,s_max,v_max])
   mask = cv2.inRange(hsv,lower_blue,upper_blue)

   cv2.imshow('frame',frame)
   cv2.imshow('mask',mask)
   #cv2.imshow('mask',mask)
   if cv2.waitKey(1) & 0xFF == 27:
     break

ตัวอย่างที่ทำได้

ขั้นตอนที่ 2

จะต้องตำค่า min และ maxของ hsv ที่ได้มาเพื่อหาตำแหน่ง Contour ดังนี้

Contour

บรรทัดที่ 14 จำทำการหาตำแหน้ง Contour เพื่อหาตำแหน่งของสีผิว
บรรทัดที่ 19 ทำการวาดรูปสี่เหลี่ยมเมื่อเจอสีผิว

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
while 1:
   ret,frame = cap.read()
   hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
   lower_blue = np.array([0,42,82])
   upper_blue = np.array([24,255,255])


   mask = cv2.inRange(hsv,lower_blue,upper_blue)
   contours,_ = cv2.findContours(mask, cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
   for c in contours:
         if cv2.contourArea(c) <=500 :
             continue
         x,y,w,h = cv2.boundingRect(c)
         cv2.rectangle(frame, (x, y), (x + w, y + h), (100, 188,255), 1)
   cv2.imshow('Frame',frame)
   if cv2.waitKey(1) == 27:
     break

ตัวอย่างที่ทำได้

การทำ Face Detection

ขั้นตอนที่ 1 ต้องไปโหลด Classsifier จาก https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt2.xml
ขั้นตอนที่ 2 นำ file ไปไว้ Folder เดียวกันกับโค้ด
ขั้นตอนที่ 3 เขียนโค้ด ตามตัวอย่างดังน

FaceCode
import cv2
import numpy as np


cap = cv2.VideoCapture(0)
faces_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml') #นำไฟล์ Classsifier ที่ใช้ในการตัดสินใจ ว่าภาพนั้นมีหน้าคนหรือไม่
while 1:
   ret,frame = cap.read()
   faces = faces_cascade.detectMultiScale(frame,1.3,5) #นำ frame เข้าไปประมวณผลและถ้าตรงกับ Classsifier จะทำการคืนค่าตำแหน่งหน้สกลับมา
   for x,y,w,h in faces:
     cv2.rectangle(frame,(x,y),(x+w,y+h),(255,189,0),2) #วาดรูปสี่เหลี่ยมบนตำแหน่งของหน้า
   cv2.imshow('Frame',frame)
   if cv2.waitKey(1) == 27:
     break

ตัวอย่างที่ทำได้