python+opencv入門-動手實現人臉檢測
參考文章
https://www.educoder.net/shixuns/2pwliuxy/challenges
任務描述
本關任務:利用 openCV 對圖片進行相應的處理。
相關知識
爲了完成本關任務,你需要掌握:
1 . 人臉檢測。
2 . 如何利用 openCV 實現人臉檢測。
人臉檢測
在上一關,我們已經知道如何去檢測圖片中人物的性別。然而,在真實項目中,我們不僅僅是需要知道圖片中人物的性別,有時候還需要將圖片中人臉的位置檢測出來。
如上圖,我們用一個方框將人臉部分給劃分出來,人臉檢測就是需要找出這個方框的正確位置。需要將檢測框位置確定下來需要知道四個參數:
1.x:檢測框左上角點的橫座標。
2.y:檢測框左上角點的縱座標。
3.w:檢測框寬的值。
4.h:檢測框高的值。
如何確定這四個參數的值其實與上一關相似,都需要構建一個損失函數再進行優化,只不過上一關是分類問題,而這一關是迴歸問題。
如何利用openCV實現人臉檢測
跟其它任務一樣,要進行人臉檢測首先得加載待檢測圖片:
import cv2
#加載圖片
img = cv2.imread(img_path,1)
#轉換爲灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
其中,cv2.imread() 爲加載圖片方法,參數 img_path 爲待識別圖片路徑, 1 表示加載 BGR 圖片,接下來再使用 cv2.cvtColor() 方法將圖片轉換爲灰度圖。 img 爲待處理圖片,cv2.COLOR_BGR2GRAY 表示將 BGR 圖轉換爲灰度圖。
然後我們再加載已經訓練好的檢測模型:
#加載模型
face_cascade = cv2.CascadeClassifier(model_path)
cv2.CascadeClassifier()爲加載模型方法,model_path爲模型存放路徑。
利用訓練好的模型,我們就能檢測出人臉的位置,代碼如下:
#獲取識別框座標
face_rects = face_cascade.detectMultiScale(gray, 1.1, 10)
x, y, w, h = face_rects[0]
face_cascade.detectMultiScale() 爲人臉檢測方法, gray 爲待檢測灰度圖, 1.1 表示檢測框按 1.1 的比例放大, 10 表示一個目標至少要被檢測到 10 次纔算真正的目標。(x,y) 爲檢測框左上角座標,w,h 爲檢測框寬高長度值。
最後,我們將檢測框添加進圖像中並保存圖像:
#將識別框加入圖片中
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
#保存圖片
cv2.imwrite(img_save_path,img)
img 爲目標圖片,(x,y) 爲檢測框左上角座標,(x+w,y+h) 爲右下角座標。 (255,0,0) 表示藍色,(0,255,0) 表示綠色,(0,0,255) 表示紅色,3 表示 BGR 三個通道。
編程實踐
編輯器補充代碼,實現人臉檢測方法。
0 方便複製學習
# -*- coding: utf-8 -*-#完整代碼!
import cv2
def face_detection(img_path,img_save_path,model_path):
'''
img_path:待識別圖片路徑
img_save_path:圖片保存路徑
model_path:模型所在路徑
'''
#********* Begin *********#
#加載圖片
img = cv2.imread(img_path,1)
#轉換爲灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#加載模型
face_cascade = cv2.CascadeClassifier(model_path)
#獲取識別框座標
face_rects = face_cascade.detectMultiScale(gray, 1.1, 10)
x, y, w, h = face_rects[0]
#將識別框加入圖片中
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
#保存圖片
cv2.imwrite(img_save_path,img)
#********* End *********#
return face_rects[0]