opencv-python 學習筆記2:實現目光跟隨(又叫人臉跟隨)


轉載請注明:@小五義http://www.cnblogs.com/xiaowuyi  QQ群:64770604

          如果機器人的臉能隨着前方人臉而轉動,你會不會覺得這種互動很有意思。年前的時候,學習了一下opencv,通過opencv可以簡單的實現人臉跟隨。再加上幾個舵機控制頭部轉動,機器人就可以互動了。呵呵

        這里不做視頻演示了,只是把代碼放出來,有興趣的朋友可以自己實驗一下。基本原理就是先識別到人臉,然后判斷人臉的位置。我把窗口用畫線的方法分成了9個小格,分別代表9個方向,當人臉進入某個小格時,機器人的頭就往哪個方向轉動。

以下代碼在樹莓派B+上支行成功,系統Raspbian,Python代碼。

 

# -*- coding: utf-8 -*-
##轉載請注明:@小五義http://www.cnblogs.com/xiaowuyi  QQ群:64770604
import cv2.cv as cv  
import cv2  
from cv2 import VideoCapture  
      
#cv.NamedWindow("W1", cv.CV_WINDOW_AUTOSIZE)  
cv.NamedWindow("W1",cv.CV_WINDOW_NORMAL)

cv.ResizeWindow("W1", 600, 600)
      
    #找到設備對象  
capture = cv.CaptureFromCAM(0) 

      
    #檢測人臉函數  
      
def repeat():  
      
        #每次從攝像頭獲取一張圖片  
    frame = cv.QueryFrame(capture)

    image_size = cv.GetSize(frame)#獲取圖片的大小  
    #print image_size
          
    greyscale = cv.CreateImage(image_size, 8, 1)#建立一個相同大小的灰度圖像

    cv.CvtColor(frame, greyscale, cv.CV_BGR2GRAY)#將獲取的彩色圖像,轉換成灰度圖像

    storage = cv.CreateMemStorage(0)#創建一個內存空間,人臉檢測是要利用,具體作用不清楚
          
    cv.EqualizeHist(greyscale, greyscale)#將灰度圖像直方圖均衡化,貌似可以使灰度圖像信息量減少,加快檢測速度  
    
    #畫圖像分割線
         
    cv.Line(frame, (210,0),(210,480), (0,255,255),1) 
    cv.Line(frame, (420,0),(420,480), (0,255,255),1) 
    cv.Line(frame, (0,160),(640,160), (0,255,255),1) 
    cv.Line(frame, (0,320),(640,320), (0,255,255),1) 
        # detect objects  
    cascade = cv.Load('/usr/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml')
    #加載Intel公司的訓練庫  
      
        #檢測圖片中的人臉,並返回一個包含了人臉信息的對象faces  
    faces = cv.HaarDetectObjects(greyscale, cascade, storage, 1.2, 2,
                                 cv.CV_HAAR_DO_CANNY_PRUNING,
                                 (100, 100))  
      
        #獲得人臉所在位置的數據  
    for (x,y,w,h) , n in faces:
       # print x,y
        if x<210:
            print "right"
        elif x>310:
            print "left"
        cv.Rectangle(frame, (x,y), (x+w,y+h), (0,128,0),2)#在相應位置標識一個矩形 邊框屬性(0,0,255)紅色 20寬度
          
        cv.ShowImage("W1", greyscale)#顯示互有邊框的圖片
          
    cv.ShowImage("W1", frame)  
      
    #循環檢測每一幀的圖片 ESC鍵退出程序  
while True:  
    repeat()  
    c = cv.WaitKey(10)  
    if c == 27:  
        #cv2.VideoCapture(0).release()  
        cv2.destroyWindow("W1")  
        break  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM