OpenCV+Python實現人臉識別

OpenCV是計算機視覺處理的庫,它是用C/C++實現的,通過安裝Python也可以進行使用。當然這個庫不止是能實現人臉識別,還能識別其他的事物,具體的內容可以參考官方說明:http://opencv-python-tutroals.readthedocs.io/en/latest/index.html。本文我們將使用這個庫來體驗一下簡單的人臉識別。

OpenCV+Python實現人臉識別

準備

在Python中可以先嚐試使用pip指令進行簡單的安裝,打開PowerShell窗口輸入pip install OpenCV。如果不成功需要下載.whl文件來安裝,可以到這個網站(https://www.lfd.uci.edu/~gohlke/pythonlibs/)找到合適的版本下載:

OpenCV+Python實現人臉識別

因為我的Windows系統為64位,Python版本為3.6,所以選擇倒數第三個。安裝完成之後在控制檯輸入import cv2回車沒有報錯則說明正常安裝完畢。使用OpenCV庫需要安裝numpy庫,如沒有則需先安裝numpy庫,如已經安裝了numpy庫還不能安裝成功,則需更新numpy到最新版本。

除此之外,需要安裝用於人臉識別的cascade文件,這個文件是一系列包含人臉識別數據的xml文件,詳細的下載地址通過以下鏈接下載,這個鏈接也包含一些例子以及代碼:https://codeload.github.com/shantnu/FaceDetect/zip/master

實現過程

在OpenCV安裝好之後我們可以正式開始這個庫的使用,這個庫使用的基本思路是這樣:引入cv2庫->創建一個可以人臉識別的對象->讀取照片並將照片進行處理以方便識別->調用對象的方法進行人臉識別->將結果輸出顯示。這就是整個人臉識別的過程,接下來實現,體會一下人臉識別的過程,並把我在實現過程中遇到的問題以及解決方法分享一下。

首先實現前兩三個步驟:引入cv2庫->創建一個可以人臉識別的對象->讀取照片並將照片進行處理以方便識別,實現代碼以及註釋如下:

OpenCV+Python實現人臉識別

將照片的存放路徑存儲在變量image_path中,將人臉識別用到的cascade文件的存放路徑存儲在變量cascade_path中,需要注意的是照片的名稱不能出現中文,否則會報錯。

接下來就到了程序中的核心部分:調用對象的方法進行人臉識別,這裡調用已經創建好的對象facecascade的detectMultiScale方法來檢測物體,因為使用了檢測人臉的cascade文件haarcascade_frontalface_default.xml來創建對象,所以本文檢測的物體為人臉。

在https://codeload.github.com/shantnu/FaceDetect/zip/master給出的例子代碼中,detectMultiScale的方法如下:

OpenCV+Python實現人臉識別

gray為我們灰度處理後的灰度照片;scaleFactor可以理解為距離補償,人在拍照時距離鏡頭的遠近會影響到識別效果;minNeighbors用來定義周圍有多少個物體,minSize用來定義檢測窗口的大小,其中scaleFactor、minNeighbors以及minSize是可以自己修改來糾正識別的效果。最後這個flags=cv2.cv.CV_HAAR_SCALE_IMAGE其實時有誤的,可能是因為OpenCV更新到3.0之後的關係,運行之後會出現AttributeError: module 'cv2' has no attribute 'cv'錯誤,經過一番折騰之後終於在StackOverflow上找到解決方法:https://stackoverflow.com/questions/30013009/opencv-3-0-0-dev-python-bindings-not-working-properly/30013069#30013069,需要將flags置為0。所以者部分的代碼如下:

OpenCV+Python實現人臉識別

可以再想一下,既然flags為0了,那我們直接刪除行不行呢?經過運行證明也是可以的,具體的原因是什麼,有興趣的看官可以查詢一下。這裡我們只追求能正常運行即可。

在檢測到有人臉之後,會返回一個列表,存儲再變量detectfaces中,我們遍歷這個列表,調用cv2模塊的rectangle方法來進行處理,將人臉標註出來,最後展示處理後的圖片效果:

OpenCV+Python實現人臉識別

實現效果

選取兩張照片進行測試,實現效果如下:

OpenCV+Python實現人臉識別

OpenCV+Python實現人臉識別

照片大小調整

在檢測的時候選取來幾張比較大的照片,在運行的時候發現照片顯示窗口只能顯示一部分,不能縮小,經過一番折騰之後在以下鏈接找到解決方法:https://www.tutorialkart.com/opencv/python/opencv-python-resize-image/#Downscale,可以調整輸出照片的大小,實現後的代碼如下:

OpenCV+Python實現人臉識別

結束

以上就是圖片人臉識別的體驗,既然有了圖片的人臉識別,就會有視頻的識別,視頻的識別可以拆分成一幀一幀的圖片進行識別;除了人臉識別,還可以有其他物體的識別,車、人等。有興趣的看官可以查讀相關的資料,歡迎各位看官關注!


分享到:


相關文章: