主題:人臉檢測原理及示例(OpenCV+Python)
前言
關於opencv
OpenCV 是 Intel 開源計算機視覺庫 (Computer Version) 。它由一系列 C 函式和少量 C++類構成,實現了影像處理和計算機視覺方面的很多通用演算法。
OpenCV 擁有包括 300 多個 C 函式的跨平臺的中、高層 API 。它不依賴於其它的外部庫 —— 儘管也可以使用某些外部庫。OpenCV 對非商業應用和商業應用都是免費 的。同時 OpenCV 提供了對硬體的訪問,可以直接訪問攝像頭,並且 opencv 還提供了一個簡單的 GUI(graphics user interface) 系統 :highgui 。 我們就通過 OpenCV 提供的一些方法來構造出這個人臉檢測 (face detection ) 程式來。
opencv的python包裝
OpenCV 本身是有 C/C++ 編寫的,如果要在其他語言中使用,我們可以通過對其動態連結庫檔案進行包裝即可,幸運的是,Python 下有很多個這樣的包裝,本文中使用的是 Cvtypes 。
事實上,在 Python 中很多的包都是來自第三方的,比如 PIL(Python Image Library) 即為 C 語言實現的一個圖形處理包,被包裝到了 Python 中,這些包裝可以讓你像使用 Python 的內建函式一樣的使用這些 API 。
人臉檢測原理
人臉檢測屬於目標檢測(object detection) 的一部分,主要涉及兩個方面
- 先對要檢測的目標物件進行概率統計,從而知道待檢測物件的一些特徵,建立起目標檢測模型。
- 用得到的模型來匹配輸入的影像,如果有匹配則輸出匹配的區域,否則什麼也不做。
計算機視覺
計算機的視覺系統,跟人的眼睛是大不相同的,但是其中也有類似之處。人眼之能夠看到物體,是通過物體上反射出來的光線刺激人眼的感光細胞,然後視覺神經在大腦中形成物體的像。計算機通過攝像頭看到的東西要簡單的多,簡單來說,就是一堆由數字組成的矩陣。這些數字表明瞭物體發出的光的強弱,攝像頭的光敏元件將光訊號轉化成數字訊號,將其量化為矩陣。
如何從這些數字中得出:"這是一個人臉"的結論,是一個比較複雜的事情。物理世界是彩色的,一般來說,計算機中的彩色圖片都是由若干個色彩通道累積出來的,比如RGB模式的圖片,有紅色通道(Red),綠色通道(Green)和藍色通道(Blue),這三個通道都是灰度圖,比如一個點由8位來表示,則一個通道可以表示2^8=256個灰度。那樣三個通道進行疊加以後可以表3*8=24位種色彩,也就是我們常說的24位真彩。
對這樣的圖片做處理,無疑是一件很複雜的事,所以有必要先將彩色圖轉為灰度圖,那樣可以減少資料量(比如RGB模式,可以減少到原圖片的1/3),同時可以去掉一些噪聲訊號。先將圖片轉化為灰度圖,然後將這個灰度圖的對比度增高,這樣可以使得圖片本來暗的地方更暗,亮的地方更亮一些。這樣處理以後,圖片就更容易被演算法設別出來了。
Harr特徵級聯表
OpenCV在物體檢測上使用的是haar特徵的級聯表,這個級聯表中包含的是boost的分類器。首先,人們採用樣本的haar特徵進行分類器的訓練,從而得到一個級聯的boost分類器。訓練的方式包含兩方面:
首先將這些圖片統一成相同的尺寸,這個過程被稱為歸一化,然後進行統計。一旦分類器建立完成,就可以用來檢測輸入圖片中的感興趣區域的檢測了,一般來說,輸入的圖片會大於樣本,那樣,需要移動搜尋視窗,為了檢索出不同大小的目標,分類器可以按比例的改變自己的尺寸,這樣可能要對輸入圖片進行多次的掃描。
什麼是級聯的分類器呢?級聯分類器是由若干個簡單分類器級聯成的一個大的分類器,被檢測的視窗依次通過每一個分類器,可以通過所有分類器的視窗即可判定為目標區域。同時,為了考慮效率問題,可以將最嚴格的分類器放在整個級聯分類器的最頂端,那樣可以減少匹配次數。
Haar特徵
- 邊界特徵,包含四種
- 線性特徵,包含8種
- 中心圍繞特徵,包含兩種
在掃描待檢測圖片的時候,以邊界特徵中的(a)為例,正如前面提到的那樣,計算機中的圖片是一個數字組成的矩陣,程式先計算整個視窗中的灰度值x,然後計算矩形框中的黑色灰度值y,然後計算(x-2y)的值,得到的數值與x做比較,如果這個比值在某一個範圍內,則表示待檢測圖片的當前掃描區域符合邊界特徵(a),然後繼續掃描。
非固定大小目標檢測
因為是基於視訊流的目標檢測,我們事先不太可能知道要檢測的目標的大小,這就要求我們的級聯表中的分類器具有按比例增大(或者縮小)的能力,這樣,當小的視窗移動完整個待檢測圖片沒有發現目標時,我們可以調整分類器的大小,然後繼續檢測,直到檢測到目標或者視窗與待檢測圖片的大小相當為止。
步驟一:圖片預處理
在從攝像頭中獲得一個幀(一張圖片)後,我們需要先對這張圖片進行一些預處理:
- 將圖片從RGB模式轉為灰度圖將灰度圖
- 進行灰度圖直方圖均衡化操作
- image_size = cv.cvGetSize(image)#獲取原始影像尺寸
- grayscale = cv.cvCreateImage(image_size, 8, 1)# 建立一個空的灰度圖
- cv.cvCvtColor(image, grayscale, cv.CV_BGR2GRAY)#轉換
- storage = cv.cvCreateMemStorage(0)#新建一塊儲存區,以備後用
- cv.cvClearMemStorage(storage)
- cv.cvEqualizeHist(grayscale, grayscale)# 灰度圖直方圖均衡化
步驟二:檢測並標記目標
OpenCV中,對於人臉檢測的模型已經建立為一個XML檔案,其中包含了上面提到的harr特徵的分類器的訓練結果,我們可以通過載入這個檔案而省略掉自己建立級聯表的過程。有了級聯表,我們只需要將待檢測圖片和級聯表一同傳遞給OpenCV的目標檢測演算法即可得到一個檢測到的人臉的集合。
- # detect objects
- cascade = cv.cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml',
- cv.cvSize(1,1))
- faces = cv.cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2,
- cv.CV_HAAR_DO_CANNY_PRUNING,
- cv.cvSize(50, 50))#設定最小的人臉為50*50畫素
- if faces:
- print 'face detected here', cv.cvGetSize(grayscale)
- for i in faces:
- cv.cvRectangle(image, cv.cvPoint( int(i.x), int(i.y)),
- cv.cvPoint(int(i.x + i.width), int(i.y + i.height)),
- cv.CV_RGB(0, 255, 0), 1, 8, 0)#畫一個綠色的矩形框
步驟三:用highgui畫出視訊視窗
- highgui.cvNamedWindow ('camera', highgui.CV_WINDOW_AUTOSIZE)
- highgui.cvMoveWindow ('camera', 50, 50)
- highgui.cvShowImage('camera', detimg)
由於視訊流是動態的,所以我們可以在程式的入口中使用一個無限迴圈,在迴圈中,每次從視訊中讀入一個幀,將這個幀傳輸給人臉檢測模組,檢測模組在這個幀上進行標記(如果有人臉的話),然後返回這個幀,主程式拿到這個幀後,更新顯示視窗。
opencv的其他特性
拉普拉斯邊緣檢測
- def laplaceTransform(image):
- laplace = None
- colorlaplace = None
- planes = [None, None, None]
- image_size = cv.cvGetSize(image)
- if not laplace:
- for i in range(len(planes)):
- planes[i] = cv.cvCreateImage(image_size, 8, 1)
- laplace = cv.cvCreateImage(image_size, cv.IPL_DEPTH_16S, 1)
- colorlaplace = cv.cvCreateImage(image_size, 8, 3)
- cv.cvSplit(image, planes[0], planes[1], planes[2], None)
- for plane in planes:
- cv.cvLaplace(plane, laplace, 3)
- cv.cvConvertScaleAbs(laplace, plane, 1, 0)
- cv.cvMerge(planes[0], planes[1], planes[2], None, colorlaplace)
- colorlaplace.origin = image.origin
- return colorlaplace
結束語
OpenCV的功能十分強大,而且提供了大量的演算法實現,文中涉及到的內容只是計算機視覺中很小的一部分。讀者可以考慮將採集到的人臉進行標識,從而實現特定人的人臉識別。或者考慮將人臉檢測移植到網路上,從而實現遠端監控。試想一下,原來沒有生命的機器,我們可以通過自己的思想,動作來使得它們看起來像是有思想一樣,這件事本身就非常的有趣。
相關文章
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- 人臉檢測 二
- [計算機視覺]人臉應用:人臉檢測、人臉對比、五官檢測、眨眼檢測、活體檢測、疲勞檢測計算機視覺
- 人臉活體檢測
- 前端人臉檢測指南前端
- 人臉檢測的harr檢測函式函式
- 人臉檢測(detection)與人臉校準(alignment)
- opencv視訊人臉檢測OpenCV
- OpenCV 人臉檢測自學(3)OpenCV
- 人臉活體檢測人臉識別:眨眼+張口
- iOS 人臉關鍵點檢測iOS
- Android人臉檢測介紹Android
- FaceDetector 人臉檢測追蹤demo
- 人臉識別之人臉檢測的重要性
- IOS人臉識別開發入門教程--人臉檢測篇iOS
- Python人臉識別微笑檢測Python
- 視訊人臉檢測——OpenCV版(三)OpenCV
- 圖片人臉檢測——OpenCV版(二)OpenCV
- JavaScript人臉檢測的實現方法JavaScript
- Android API 人臉檢測(Face Detect)AndroidAPI
- 人臉檢測技術發展及百度“框”實踐
- 從零玩轉人臉識別之RGB人臉活體檢測
- OpenCv人臉檢測技術-(實現抖音特效-給人臉戴上墨鏡)OpenCV特效
- canvas+face-api人臉實時檢測CanvasAPI
- 3分鐘內實現人臉檢測
- 人臉識別檢測專案實戰
- APISpace的 人臉檢測API 它來啦~API
- 圖片人臉檢測——Dlib版(四)
- 視訊人臉檢測——Dlib版(六)
- 目標檢測 YOLO v3 訓練 人臉檢測模型YOLO模型
- 虹軟人臉識別 - faceId及IR活體檢測的介紹
- 基於opencv實現簡單人臉檢測OpenCV
- MTCNN人臉檢測與校準(5特徵點)CNN特徵
- 人臉檢測中的AdaBoost演算法演算法
- TF專案實戰(基於SSD目標檢測)——人臉檢測1
- OpenCV檢測篇(一)——貓臉檢測OpenCV
- 尺度不變人臉檢測:Group Sampling
- 人臉檢測背景介紹和發展現狀