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 ที่บอกวาระยะเทาไรจะ
                                                                    ํ
                                    ็
                       ั
                   ถือวาเปนการหันหนาเอียงใหเหมาะสมกับขนาดภาพ
   171   172   173   174   175   176   177   178   179   180   181