小白带你查看如何用OpenCV检查人脸图像

1.人脸识别是个分类问题

  • 人脸
  • 不是人脸

2.OpenCV提供三种不同的训练级联分类器

通常的情况下,分类器会对多个图片特征进行识别,如一张【图】人脸识别图片1,图中有个可爱的小女孩和狗狗,

人可以一眼就是辨别出来,但计算机保存的是一组组像素文件RGB(0-255)的数组,如何让计算机识别是狗狗和人的图片,就需要进行不断的学习样本。

人脸识别图片1

 3.级联分类器

3.1 分类器原理

【图】级联分类原理图1,学过c或java的都知道的条件语句,级联分类器就是条件分支语句

开始,通过条件1,如果正确,继续,如果不正确,直接到符合条件的分类,如果满足条件1,继续判断,是否满足条件2,一层类推,直到最后判断条件为止,都满足条件,过滤出符合条件的分类值。

级联分类原理图1

3.2Haar特征反映的图像灰度变化

  • 矩形位置:矩形框要逐像素的划过整个图像的每个位置
  • 矩形大小:矩形大小可以任意调整
  • 矩形类型,可以垂直,水平,对角不同类型 

选择红框是可以定义大小进行图像灰度处理

3.3 Haar的特征进一步划分

  • 4个边特征
  • 8个线特征
  • 2个中心点特征
  • 1个对角线特征

3.4 cv2的级联分类器

faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
使用级联分类器时需要注意:

3.5  源代码

import cv2
# 读取待检测的图像
image = cv2.imread('/Users/keny/Downloads/1.jpg')
# 获取XML文件,加载人脸检测器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 色彩转换,转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 调用函数detectMultiScale
faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor = 1.15,
    minNeighbors = 5,
    minSize = (5,5)
)
print(faces)
# 打印输出的测试结果
print("是小女孩的脸吗?{0}!".format(len(faces)))
# 逐个标注人脸
for(x, y, w, h) in faces:
    cv2.circle(image, (int((x+x+w)/2), int((y+y+h)/2)), int(w/2), (0,255,0),2)
# 显示结果
cv2.imshow("dect", image)
# 保存检测结果
cv2.imwrite("reface.jpg", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

提示错误:

cascadedetect.cpp:1689: error: (-215:Assertion failed)

3.5.1错误提示解决方法

下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades

1.找到haarcascade_frontalface_default.xml等文件,点击进去.

2.找到Raw,右键链接(目标)另存为。

猜你喜欢

转载自blog.csdn.net/keny88888/article/details/105700126
今日推荐