您的位置:首页 > 编程语言 > Python开发

人脸识别 opencv和python

2017-09-18 22:14 441 查看

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

**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: