1. 程式人生 > >人臉識別 opencv和python

人臉識別 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

**