人脸识别-图像识别

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)  img = cv2.imread("2.jpg") cv2.namedWindow("frame", cv2.WINDOW_NORMAL) cv2.imshow("frame", img) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   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

**

本网页由快兔兔AI采集器生成,目的为演示采集效果,若侵权请及时联系删除。

原文链接:https://bbs.csdn.net/skill/opencv/opencv-cc6f5f3a5c2d494c8574a55c8e43c237

更多内容