人脸识别 opencv和python
2017-09-18 22:14
483 查看
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
**相关文章推荐
- 人脸识别(OpenCV+Python)
- Python+opencv人脸识别
- Python +OpenCV 人脸识别
- OpenCV+python 人脸识别
- 图像识别 python+opencv的简单人脸识别
- python+opencv 做人脸识别
- python使用opencv进行人脸识别
- python基于openCV3的人脸识别
- opencv+opencv_contrib 人脸识别和检测 python开发环境快速搭建(30分钟)图文教程
- Python调用OpenCV实现人脸识别
- OpenCV+python 人脸识别
- 图像识别 python+opencv的简单人脸识别
- OpenCV + Python 实现人脸识别
- (Windows下) Python3.6+OpenCV进行人脸识别的环境搭建
- 人脸识别opencv3.1 for python(基于LBH)
- python-opencv-人脸识别实现 从图片中扣人脸
- python+opencv之视频人脸识别
- python利用Opencv进行人脸识别(视频流+图片)
- python+opencv之视频人脸识别
- OpenCV Python 学习笔记(五) 人脸识别