人臉識別 opencv和python
opencv人臉識別–opencv和python MultiScale
目錄:
一、 Haar特徵分類器介紹
二、detectMultiScale函式
三、python OpenCV 解決人臉識別報錯
四、識別框的形狀
五、程式碼
首先、來兩張帥帥的識別效果圖:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一、Haar特徵分類器介紹
Haar特徵分類器就是一個XML檔案,該檔案中會描述人體各個部位的Haar特徵值。包括人臉、眼睛、嘴脣等等。
Haar特徵分類器存放目錄:OpenCV安裝目錄中的\data\ haarcascades目錄下,opencv2.4.8版本下的Haar特徵分類器如下:
haarcascade_eye.xml
haarcascade_eye_tree_eyeglasses.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt_tree.xml
haarcascade_frontalface_alt2.xml
haarcascade_frontalface_default.xml
haarcascade_fullbody.xml
haarcascade_lefteye_2splits.xml
haarcascade_lowerbody.xml
haarcascade_mcs_eyepair_big.xml
haarcascade_mcs_eyepair_small.xml
haarcascade_mcs_leftear.xml
haarcascade_mcs_lefteye.xml
haarcascade_mcs_mouth.xml
haarcascade_mcs_nose.xml
haarcascade_mcs_rightear.xml
haarcascade_mcs_righteye.xml
haarcascade_mcs_upperbody.xml
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml
haarcascade_smile.xml
haarcascade_upperbody.xml
根據命名就可以很快知道各個分類器的用途。
其中:haarcascade_frontalface_alt.xml與haarcascade_frontalface_alt2.xml都是人臉識別的Haar特徵分類器了。
二、detectMultiScale函式
cvHaarDetectObjects是opencv1中的函式,opencv2中人臉檢測使用的是 detectMultiScale函式。它可以檢測出圖片中所有的人臉。
rects = cascade.detectMultiScale(img,1.3, 6,cv2.CASCADE_SCALE_IMAGE,(20,20))
img–待檢測圖片,一般為灰度影象加快檢測速度;
rects–被檢測物體的矩形框向量組;
其他引數–調節識別程度……
三、python OpenCV 解決人臉識別報錯
錯誤提示:
cv2.error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp:1639: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
到底是什麼問題呢?
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
我們在這段程式碼後面,加上下面這句話,就是你自己找下分類器文件的位置,把path寫清楚。
face_cascade.load('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
四、識別框的形狀
選擇輸出識別框的形狀,對rects(被檢測物體的矩形框向量組)中的資料進行處理
cv2.circle(img, (x, y), r, (co1,co2,co3), 2) #圓形
cv2.rectangle(img, (x1, y1), (x2, y2), (co1,co2,co3), 2) #矩形
Then it works happily ! φ(゜▽゜*)♪
再來張識別對比圖:
五、程式碼
import cv2
import numpy as np
def detect(img, cascade):
rects = cascade.detectMultiScale(img,1.3, 6,cv2.CASCADE_SCALE_IMAGE,(20,20))
if len(rects) == 0:
return []
rects[:, 2:] += rects[:, :2]
print rects
return rects
def draw_rects(img, rects):
r =0
x = 0
y = 0
num = 0
for x1, y1, x2, y2 in rects:
num = num + 1
co1 = 0
co2 = 0
co3 = 0
if(num%3 == 0): co1 = 255
if(num%3 == 1): co2 = 255
if(num%3 == 2): co3 = 255
x = np.int((x1 + x2) * 0.5)
y = np.int((y1 + y2) * 0.5)
r = np.int(( abs(x1 - x2) + abs(y1-y2) ) * 0.25)
cv2.circle(img, (x, y), r, (co1,co2,co3), 2)
# cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
img = cv2.imread("2.jpg")
cv2.namedWindow("frame", cv2.WINDOW_NORMAL)
cv2.imshow("frame", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#cv2.namedWindow("gray", cv2.WINDOW_NORMAL)
#cv2.imshow("gray", gray)
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_cascade.load('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
rects = detect(gray, face_cascade)
vis = img.copy()
draw_rects(vis,rects)
cv2.namedWindow("facedetect", cv2.WINDOW_NORMAL)
cv2.imshow("facedetect", vis)
cv2.imwrite("facedetect.jpg", vis)
cv2.waitKey(0)
cv2.destroyAllWindows()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
當然,這個識別效果也不是特別好,再來張識別對比圖(頭像太小識別效果不是特別準確):
**
END
**