人脸识别和人脸采集走偏——OpenCV踩坑
cv2.CascadeClassifier()级联分类器
CascadeClassifier()是Opencv中做人脸检测时的一个级联分类器。
- 既可以使用Haar(使用Adaboost集成学习分类器来构建);
可参考:三个臭皮匠——集成学习AdaBoost简单代码实现示例 - 也可以使用LBP特征(局部二值化,具有旋转不变性,对光线不敏感)。
Haar特征
返回顶部
Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。
它分为四类:边缘特征、线性特征、中心特征和对角线特征。
用黑白两种矩形框组合成特征模板,在特征模板内用【黑色矩形像素和】减去【白色矩形像素和】来表示这个模版的特征值。
脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。
但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。
常见报错error: (-215:Assertion failed) !empty()
找不到训练好的haarcascade_eye.xml
分类器,如下:
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'
可能报错的代码:
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
可以消除报错的代码,注意使用绝对路径(路径中的双斜杠\\
)
# 注意使用绝对路径及路径中的双斜杠
path_e = "C:\\Users\\13721\\AppData\\Roaming\\Python\\Python37\\site-packages\\cv2\\data\\haarcascade_eye.xml"
eye_cascade = cv2.CascadeClassifier(path_e)
另一方法:将haarcascade_eye.xml与主程序放在同一目录下。
人脸识别(眼睛和嘴巴)代码示例
返回顶部
注:黄渤头像是节日气氛道具,邓超头像识别走偏,团队图片和twins组合图片识别良好。
import numpy as np
import cv2
# 运行之前,检查cascade文件路径是否在相应的目录下
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 与主程序在同一目录。
# eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') # 会报错,改绝对路径
# 注意路径中的双斜杠
path_e = "C:\\Users\\13721\\AppData\\Roaming\\Python\\Python37\\site-packages\\cv2\\data\\haarcascade_eye.xml"
eye_cascade = cv2.CascadeClassifier(path_e)
# 读取图像
# img = cv2.imread('team.jpg') # 团队
# img = cv2.imread('deng.jpg') # 邓超
img = cv2.imread('twins.jpg') # twins组合
# img = cv2.imread('huang.jpg') # 黄渤人脸假面
gray = cv2.cvtColor(img, cv2.COLOR_BG