Page 176 - python
P. 176
150
rects = detector(img, 1)
if len(rects) > 1:
print("มีใบหนาหลายในหนาในภาพนี้")
elif len(rects) == 0:
print("ไมมีใบหนาในภาพนี้")
else:
points = numpy.matrix([[p.x, p.y] for p in predictor(img, rects[0]).parts()]).tolist()
for i in range(len(points)):
cv2.circle(img, tuple(points[i]), 2, color=(0, 255, 0),thickness=1)
plt.figure(figsize = (10,10))
plt.imshow(img);
plt.show()
ตัวอยางที่ 11.13 ขอใชไลบรารี่ opencv และ dlib ดวยคําสั่ง import cv2, dlib ตัวแปร
็
็
detector เปนออบเจ็คของคลาส get_frontal_face_detector() ตัวแปร predictor เปนอ็อบเจคของ
ิ
คลาส shape_predictor() โดยคลาสนี้ตองการอารกวเมนตของโมเดลที่ชื่อวา “shape_predictor_68_
face_landmarks.dat ตัวแปร img เปนการโหลดภาพหุนยนตสาวเจียเจีย ดวยชื่อไฟล humanoid-
robot-jiajia.jpg และแปลงจากภาพ BGR (น้ําเงิน เขียว แดง) เปนภาพ RGB (แดง เขียว น้ําเงิน) เนื่องจาก
opencv จะเปดภาพดวยโหมด BGR ตัวแปร rect เปนผลลัพธของการตรวจจับแลนดมารคโดยสงตัวแปร
img ใหเปนอารกิวเมนตของฟงกชั่น detector() จากนั้นตรวจสอบความยาวของตัวแปร rects วามีขนาด
เทาไร ถามากกวา 1 ใหพิมพวาภาพที่ตรวจจับพบใบหนามากกวาหนึ่งใบหนา และตรวจสอบตอวามีขนาด
ิ
เทากับ 0 หรือไมถาเทากับศูนยใหพมพบอกวา "ไมมีใบหนาในภาพนี้" ตัวแปร points เปนการวนเขาไปใน
ิ
ุ
ั
rects และแปลงเปนตัวแปนตัวแปรชนิดลีสตใชเก็บตําแหนงพกดของจดบนใบหนาทั้งหมด ในขั้นสุดทาย
ั
เปนการวนเขาไปในตัวแปร points ทีละจุดดวยการสรางตัวเลขที่มีความยาวเทากบจํานวนภายในตัวแปร
points ดวยคําสั่ง range(len(points)) และเขียนวงกลม ดวยคําสั่ง circle() ปอน img คือภาพ img และ
พกดจุดแตละจุดดวยคําสั่ง tuple(points[i]) คือแปลงพกดใหอยูในรูปตัวแปรทเพิล เลข 2 คือ ขนาดเสน
ู
ิ
ั
ิ
ั
ผานศูนยกลางวงกลม color=(0,255,0) คือสีเขียว (R,G,B) และความหนาของเสนวงกลมขนาด 1 พิกเซล
ดวยตัวแปร thicknetss=1
พล็อตภาพโดยกาหนดขนาดดวยคําสั่ง figure(figsize=(10,10)) ซึ่งเปนอตราความกวางและสูง
ั
ํ
ั
จากนั้นแสดงภาพดวยคําสั่ง imshow() และ show() ผลลัพธจะวาดจุดวงกลมบนพกดแลนดมารคบน
ิ
ใบหนาของหุนยนตสาวเจียเจียออกมาดังภาพที่ xxxxx ใหทดลองเปลี่ยนภาพอื่นตามที่ตองการ
11.16 การตรวจสอบคนในภาพหันหนาไปทางซายหรือขวา
ั
ิ
ในการตรวจสอบการหันหนาซายหรือขวาจะตรวจสอบจากพกดที่อยูระหวางขอบตาซายและขวา
ั
ี่
ั
ั
มาเปรียบเทียบกัน ถามีคาใกลเคียงกนแสดงวาเปนหนาตรงแตถามีขนาดทแตกตางกนมากแสดงวาหนไป
ขางใดขางหนึ่ง โดยขนาดความตางกนจะขึ้นอยูกบความละเอยดของภาพ ถาละเอยดสูง ๆ แมคาจะ
ี
ี
ั
ั
ตางกนเยอะมากแตกยังเปนภาพหนาตรงได ดังนั้น จึงควรกาหนดคา threshold ที่บอกวาระยะเทาไรจะ
ํ
็
ั
ถือวาเปนการหันหนาเอียงใหเหมาะสมกับขนาดภาพ