在Python中使用OpenCV進行人臉檢測

weixin_34146805發表於2018-05-17

OpenCV是如今最流行的計算機視覺庫,而我們今天就是要學習如何安裝使用OpenCV,以及如何去訪問我們的攝像頭。然後我們一起來看看寫一個人臉檢測程式是如何地簡單,簡單到只需要幾行程式碼。

在開始之前,我假設你已經對Python有一定的瞭解。當然,如果你覺得你還不夠格,這裡有推薦一些學習Python的電子書,你可以先學習下Python,如此可以讓你更好地理解接下來的步驟。另外,這裡還推薦一本電子書來學習OpenCV。

好,不浪費時間,開始吧。

To setup opencv in python environment you will need these things ready ( match the versions to follow along with this tutorial),
首先我們需要先準備好這些環境(版本記得配好):

  • Python 2.x
  • OpenCV 2.x
  • Numpy庫 (這個可以在稍後用pip下載)

首先,對於下載Python,我們可以先到官網上下對應的版本,如果是Windows就可能是msi格式的版本,如果是Mac就可能是pkg格式的安裝包,如果是Linux則可能是原始碼包。

安裝和Python後開啟命令列就可以使用pip命令進行Python包的安裝了,如:

1996593-7f2fafe66e40ac09.jpg
image

由於OpenCV使用Numpy庫,因此先通過命令pip install numpy安裝Numpy庫。安裝完後,嘗試匯入,沒有報錯則ok:

1996593-dcefb2d3121d5334.jpg
image

然後進入OpenCV官網下對應的版本並安裝,嘗試匯入:

1996593-c167a41c38d9714b.jpg
image

嘗試人臉檢測

萬事俱備,只欠東風。我們來寫程式碼檢測人臉吧,來一發OpenCV的Hello world。

在這裡我們準備使用pre-trained的XML檔案,這些XML檔案都較難訓練,但是我們不需要擔心,因此OpenCV已經為我們提供了很多人臉檢測相關的pre-trained分類器。

想要使用這寫分類器,我們需要將分類器的XML檔案haarcascade_frontalface_default.xmlopencv資料夾/sources/data/haarcascades/下複製到我們的專案目錄下,就是我們將要寫程式的目錄下。如果沒有opencv資料夾/sources/data/haarcascades/這個目錄,可以嘗試找一下opencv資料夾/share/OpenCV/haarcascades/。只要找到如下檔案即可:

1996593-c43c0b70ea974477.jpg
image

然後如果我們要載入這個分類器的話,如此就好:

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

然後接下來我們先來測試一下攝像頭吧,

cap = cv2.VideoCapture(0)
ret, img = cap.read()
cv2.imshow('windowname', img)
cv2.waitKey(0)

# 釋放攝像頭資源
cap.release()

以上的程式碼是呼叫你電腦的0號攝像頭,並展示出來。當然,如果你有多個攝像頭,那麼你也可以試試別的id,修改VideoCapture函式的引數即可。

其中cap.read()就是從攝像頭獲取到影象,這個函式返回了兩個變數,第一個為布林值表示成功與否,以及第二個是影象。

然後程式通過imshow()展示圖片,其第一個傳入的引數為視窗的名稱,而第二個就是要展示的圖片,以上程式碼傳入的就是我們的自拍。

而waitKey是用來停在圖片的展示介面,讓你看清楚,引數可以是10、100、1000等,單位是毫秒,這裡填0就是一直停著。注意了,如果停留的時間不夠久,就可能看不見imshow的照片了。

執行了這段程式碼,你將會看到攝像頭所拍攝的畫面,一般來說就是你自己了。

1996593-fa2674a706bfb3bb.jpg
image

接下來我們將圖片先轉換為灰度圖片,

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

然後就開始了人臉檢測之旅:

faces = detector.detectMultiScale(gray, 1.3, 5)

以上的這句程式碼會等到一串list,list中的每個都有x, y, height, width四個變數。其中list表示檢測到的人臉,即list的size就是人臉的個數,而每個人臉在圖片中的位置是(x, y, height, width)。

為了能讓我們更直觀地看出來檢測結果,我們將這些人臉框出來:

for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
1996593-cdc86e9aefd53038.jpg
image

更進一步

現在我們已經通過攝像頭檢測到人臉了,但是我們真正需要的是不是一張靜態的圖片,我們需要的是一個能檢測的實時動態視訊流。因此我們加一個迴圈,然後不斷的檢測,最終在顯示在新視窗中。

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)

while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.3, 5)
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

    cv2.imshow('frame', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

需要注意的是,結尾用了waitKey和ord實現了按q退出的功能,就是每一毫秒都在檢測鍵盤有沒有按下了q,要是按下了就退出迴圈了。接下來就釋放資源。

總結

在本文中,我們學習瞭如何使用Python中的OpenCV,即通過程式碼寫了一個人臉檢測的程式。我們溫習或學習了這些知識點:

  • 使用OpenCV的分類器
  • 從攝像頭中讀取照片
  • 在圖片上換框框
  • 在新視窗上展示圖片
  • 實時地進行人臉檢測

P.S. 你們發現了XML那裡有一個叫貓臉識別的檔案嗎!!!

先這樣吧

原文,若有錯誤之處請指出,更多地關注煎魚

相關文章