การมองเห็นของ 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 เพื่อให้งายในการหาค่าสีผิวตามโค้ดตัวอย่าง
บรรทัดที่ 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 ดังนี้
บรรทัดที่ 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 เขียนโค้ด ตามตัวอย่างดังน
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
ตัวอย่างที่ทำได้