OpenCv人脸识别开发实战

article/2025/10/26 12:32:11

一、OpenCV简介

OpenCV(全称:Open Source Computer Vision Library),是一个跨平台的计算机视觉库。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。
​ OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java和MATLAB/OCTAVE(2.5)的接口。如今也提供对于C#、Ch、Ruby、GO的支持。

二、OpenCV的基本使用

1.安装OpenCV模块

pip install opencv-python

2.读取图片

显示图像是OpenCV最基本的操作之一,imshow()函数可以实现该操作。imshow()函数有两个参数:显示图像的帧名称以及要显示的图像本身。
如果直接调用imshow()函数,只能短暂地显示图像。要保证图像一直在窗口上显示,要通过waitKey()函数。waitKey()函数的参数为等待键盘触发的时间,单位为毫秒,返回值为-1(表示没有键被按下)。

示例代码:

# 导入模块
import cv2 as cv# 读取图片
image = cv.imread('test.png')  # 路径中不能有中文,否则加载图片失败
# 显示图片
cv.imshow('read_img', image)
# 等待键盘输入 单位毫秒 传入0则是无限等待
cv.waitKey(0)
# 由于OpenCV底层是C++编写的,需要释放内存
cv.destroyAllWindows()

测试图片:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkdwYgoD-1657533164863)(assets/20220711163742.png)]

测试效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ae3Aakip-1657533164865)(assets/20220711164020.png)]


3.图片灰度转换

OpenCV中有数百种关于在不同色彩空间之间转换的方法。当前,在计算机视觉中有三种常用的色彩空间:灰度、BGR以及HSV(Hue,Saturation,Value)。

  • 灰度色彩空间是通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸识别。
  • BGR即蓝、绿、红色彩空间,每一个像素点都由一个三元数组来表示,分别代表蓝、绿、红三种颜色。网页开发者可能熟悉另一个与之相似的颜色空间——RGB,它们只是颜色顺序不同。
  • HSV,H(Hue)是色调,S(Saturation)是饱和度,V(Value)表示黑暗的程度(或光谱另一端的明亮程度)。
  • 灰度转换的作用是:转换成灰度的图片的计算强度得以降低。

示例代码:

import cv2 as cv# 加载图片
img = cv.imread('test.png')
# 显示图片
cv.imshow('BGR image', img)
# cv2读取图片的通道是BGR(蓝绿红)
# PIL读取图片的通道是RGB
# 将图片灰度转换
gray_img = cv.cvtColor(img, code=cv.COLOR_BGR2GRAY)
# 显示转换后的图片
cv.imshow('gray_image', gray_img)
# 保存图片
cv.imwrite('gray_test.png', gray_img)
# 等待键盘输入
cv.waitKey(0)
# 释放内存
cv.destroyAllWindows()

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ITsuMXuI-1657533164866)(assets/20220711164214.png)]

4.修改图片尺寸

示例代码:

import cv2 as cv# 加载图片
img = cv.imread('test.png')# 显示图片
# cv.imshow('input image', img)
print("原图片的形状", img.shape)
# 修改图片尺寸
# resize_img = cv.resize(img, dsize=(110, 160))
resize_img = cv.resize(img, dsize=(400, 360))
print("修改后图片的形状", resize_img.shape)
cv.imshow('resize_img', resize_img)
# 键盘输入q的时候,退出
while True:if ord('q') == cv.waitKey(0):break
# 释放内存
cv.destroyAllWindows()

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4VfcjlTI-1657533164868)(assets/20220711164753.png)]

5.绘制矩形、圆

OpenCV可以对图片进行任意编辑、处理。

示例代码

import cv2 as cv
img = cv.imread('test.png')
# 左上角的坐标是(x,y),矩形的宽度为w,高度为h
x, y, w, h = 50, 50, 80, 80
# 画矩形
cv.rectangle(img, (x, y, x+w, y+h), color=(0, 255, 255), thickness=2) # color=BGR,thickness参数表示画笔的粗细/线条宽度
# 画圆
# center元组指原点的坐标,radius为半径
cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 0, 255), thickness=2)
resize_img = cv.resize(img, dsize=(420, 360))
# 显示图片
cv.imshow('result_image', resize_img)
cv.waitKey(0)
# 释放内存
cv.destroyAllWindows()

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JC8j8C9T-1657533164869)(assets/20220711165258.png)]


6.人脸检测

6.1Haar级联的概念

由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,图像细节变得不稳定。因此,提取出图像的细节对产生稳定分类结果和跟踪结果很有用。这些提取的结果被称为特征,专业的表述为:从图像数据中提取特征。两个图像的相似程度可以通过它们对应特征的欧氏距离来度量。
Haar特征是一种用于实现人脸跟踪的特征。每一个Haar特征都描述了相邻图像区域的对比模式。例如,边、顶点和细线都能生成具有判别性的特征。

6.2获取Haar级联数据

OpenCV提供了人脸检测所需的XML文件,可用于检测静止图像、视频和摄像头所得到图像中的人脸。

  • 人脸检测器(默认):haarcascade_frontalface_default.xml
  • 人脸检测器(快速Harr):haarcascade_frontalface_alt2.xml
  • 人脸检测器(侧视):haarcascade_profileface.xml
  • 眼部检测器(左眼):haarcascade_lefteye_2splits.xml
  • 眼部检测器(右眼):haarcascade_righteye_2splits.xml
  • 嘴部检测器:haarcascade_mcs_mouth.xml
  • 鼻子检测器:haarcascade_mcs_nose.xml
  • 身体检测器:haarcascade_fullbody.xml
  • 人脸检测器(快速LBP):lbpcascade_frontalface.xml

6.3使用OpenCV进行人脸检测

6.3.1静态图像中人脸检测
6.3.1.1检测人脸

示例代码:

import cv2 as cvdef face_detect_demo():# 将图片转换为灰度gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 加载特征数据face_detector = cv.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# faces为检测区域faces = face_detector.detectMultiScale(gray)for x, y, w, h in faces:# 绘制矩形cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 255, 0), thickness=2)# 显示图片cv.imshow('result', img)# 加载图片
img = cv.imread('huge.jpeg')
face_detect_demo()
# cv.imshow('input image', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJKYaVVJ-1657533164870)(assets/20220711104954.png)]


6.3.1.2检测多张人脸

示例代码:

import cv2 as cv# 定义人脸检测方法
def face_detect_demo():# 将图片灰度gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 加载特征数据face_detector = cv.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# faces为检测区域# 发现有一些没检测出来faces = face_detector.detectMultiScale(gray, scaleFactor=1.01, minNeighbors=3, maxSize=(40, 40), minSize=(35, 35))for x, y, w, h in faces:print(x, y, w, h)cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=2)cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 255, 0), thickness=2)# 显示图片cv.imshow('result', img)# 加载图片
img = cv.imread('2.jpeg')
# 调用人脸检测方法
face_detect_demo()
cv.waitKey(0)
cv.destroyAllWindows()

测试图片:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QhDsacfc-1657533164871)(assets/2.jpeg)]

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XdVlQGyl-1657533164872)(assets/20220711171924.jpg)]


6.3.2视频中的人脸检测

视频是一张张图片组成的,在视频的帧上重复这个过程就能完成视频中的人脸检测。

示例代码:

import cv2 as cvdef face_detect_demo(img):# 将图片转换为灰度gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 加载特征数据face_detector = cv.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# faces为检测区域faces = face_detector.detectMultiScale(gray, flags=cv.CASCADE_SCALE_IMAGE)for x, y, w, h in faces:# 绘制矩形cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 255, 0), thickness=2)# 可调整窗口大小cv.namedWindow('result', 0)# 调整窗口大小cv.resizeWindow('result', 500, 500)# 显示图片cv.imshow('result', img)# 读取视频
cap = cv.VideoCapture('test.mp4')
while True:# frame就是每一帧的图像,是个三维矩阵(按帧读取)flag, frame = cap.read()print(f'flag:{flag}, frame.shape:{frame.shape}')if not flag:# 视频播放结束,退出breakface_detect_demo(frame)if ord('q') == cv.waitKey(0):break
# 释放内存
cv.destroyAllWindows()
cap.release()

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-idqVVKkC-1657533164872)(assets/20220711172317.jpg)]

6.3.3人脸识别

人脸识别其实就是一个程序能识别给定图像或视频中的人脸。实现这一目标的方法之一是用一系列分好类的图像来”训练“程序,并基于这些图像来进行识别。这就是OpenCV及其人脸识别模块进行人脸识别的过程。
人脸识别模块的另一个重要特征是:每个识别都具有转置信评分,因此可在实际应用中通过对其设置阈值来进行筛选。
人脸识别所需要的人脸可以通过两种方式来得到:自己获得图像或从人脸数据库免费获得可用的人脸图像。

6.3.3.1训练数据

有了数据,需要将这些样本图像加载到人脸识别算法中。所有的人脸识别算法在它们的train()函数都有两个参数:图像数组和标签数组。这些标签表示进行识别时某人人脸的ID,因此根据ID可以知道被识别的人是谁。要做到这一点,将在”trainer/“目录中保存为.yml文件。

在使用Python 3&OpenCV 3.0.0进行人脸识别训练时发现异常:
AttributeError:'module' object has no attribute 'LBPHFaceRecognizer_create' OpenCV ,需要安装opencv-contrib-python模块:

pip install opencv-contrib-python

示例代码:

import os
import cv2import numpy as np
from PIL import Imagedef getImageAndLabels(path):facesSamples = []ids = []imagePaths = [os.path.join(path, f) for f in os.listdir(path)]# 检测人脸face_detector = cv2.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 遍历列表中的图片for imagePath in imagePaths:# 打开图片PIL_img = Image.open(imagePath).convert('L')# 将图像转换为数组img_numpy = np.array(PIL_img, 'uint8')# faces为检测区域faces = face_detector.detectMultiScale(img_numpy)# 获取每张图片的idid = int(os.path.split(imagePath)[1].split('.')[0])for x, y, w, h in faces:facesSamples.append(img_numpy[y:y+h, x:x+w])ids.append(id)return facesSamples, idsif __name__ == '__main__':# 图片路径path = './data/jm/'# 获取图像数组和id标签数组faces, ids = getImageAndLabels(path)# 获取循环对象"""AttributeError: module 'cv2' has no attribute 'face'"""recognizer = cv2.face.LBPHFaceRecognizer_create()recognizer.train(faces, np.array(ids))# 保存文件recognizer.write('trainer/trainer.yml')

训练部分图像:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LVOKHwTR-1657533164873)(assets/20220711172816.jpg)]

6.3.3.2基于LBPH的人脸识别

LBPH(Local Binary Pattern Histogram)将检测到的人脸分为小单元,并将其与模型中的对应单位进行比较,对每个区域的匹配值产生一个直方图。由于这种方法的灵活性,LBPH是唯一允许模型样本人脸和检测到的人脸在形状、大小上可以不同的人脸识别算法。
调整后的区域中调用predict()函数,该函数返回两个元素的数组:第一个元素是所识别个体的标签,第二个是置信度评分。所有的算法都有一个置信度评分阈值,置信度评分用来衡量所识别人脸与原模型的差距,0表示完全匹配。
有时不想保留所有的识别结果,则需要进一步处理,因此可用自己的算法来估算识别的置信度评分。LBPH一个好的识别参考值要低于50,任何一个高于80的参考值都会被认为是低的置信度评分。

示例代码:

import cv2# 加载训练数据集文件
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')# 准备识别的图片
img = cv2.imread('7.bmp')
# 将图片转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载特征数据
face_detector = cv2.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
# faces为检测区域
faces = face_detector.detectMultiScale(gray)
for x, y, w, h in faces:# 绘制矩形cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)# 人脸识别id,confidence = recognizer.predict(gray[y:y+h, x:x+w])print(f"标签id:{id},置信评分:{confidence}")
# 显示图片
cv2.imshow('result', img)
cv2.waitKey(0)
# 释放内存
cv2.destroyAllWindows()

测试图像:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AsglNF4W-1657533164874)(assets/7.bmp)]

测试效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lPYiqfXL-1657533164874)(assets/20220711173412.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7NY7Vmpx-1657533164875)(assets/20220711173445.jpg)]

因为上面这个图像不在训练数据中,所以置信评分高于80。

换成下面这个图像(jim文件夹下的11.bmp)进行测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TjCbFTRw-1657533164875)(assets/11.bmp)]

测试效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SfYek7M2-1657533164876)(assets/20220711174034.jpg)]

在训练数据中,置信评分为0。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3kzoF2Mw-1657533164877)(assets/20220711174126.jpg)]


参考文章及其它:

  • https://blog.csdn.net/weixin_43493559/article/details/106600471
  • B站视频:OpenCv人脸识别开发实战
  • https://blog.csdn.net/shangxiaqiusuo1/article/details/84888408
  • ORL人脸数据库40个:http://www.qudong51.net/qudong/1040.html
  • http://www.webzuan.cn/szk/7194.html
  • https://blog.csdn.net/qq_52131774/article/details/121265931

http://chatgpt.dhexx.cn/article/CHyIndbK.shtml

相关文章

opencv-人脸识别

人脸识别即程序对输入的图像进行判别是否有人脸,并识别出有人脸的图像所对应的人。即我们常说的人脸识别一般包含了人脸检测和人脸识别两部分。下面对其在opencv中的相应模块进行分别介绍。 在opencv官网中,有许多推荐人脸在线数据集:http:/…

基于opencv的人脸识别

目录 一、OpenCV的简介 1、应用场景 二、人脸识别 1、人脸识别简介 2、人脸识别系统基本组成 三、人脸识别流程 四、主要代码注释 1、人脸采集函数 2、人脸训练函数 3、人脸识别函数(注取消语音播报识别会流畅多) 五、功能实现 六、演示视频…

最简单体验opencv人脸识别

所需软件:PyCharm 所需硬件:一台电脑 如果没有安装PyCharm,csdn上面搜一下安装教程就行,很简单的。 打开PyCharm,如果没有装opencv,则点击最下面的terminal,在终端下输入pip install opencn-p…

基于opencv的人脸识别(适合初学者)

简单易懂的人脸识别,学不会直接跪倒! 一、人脸识别步骤 二、直接上代码 (1)录入人脸.py import cv2face_name cjw # 该人脸的名字# 加载OpenCV人脸检测分类器 face_cascade cv2.CascadeClassifier("D:/BaiduNetdiskDow…

手把手教你opencv做人脸识别(附源码+文档)

文章目录 一、环境二、使用Haar级联进行人脸检测三、Haar级联结合摄像头四、使用SSD的人脸检测五、 SSD结合摄像头人脸检测六、结语 一、环境 pip install opencv-pythonpython3.9 pycharm2020 人狠话不多,直接上代码,注释在代码里面,不说废…

SIFT算法实现图片匹配

SIFT (Scale-Invariant Feature Transform)是David Lowe 在1999发明的一种算法。它在世界范围内,作为图像对齐和对象识别的参考方法。此方法的鲁棒性能够检测场景的不同比例、角度和照明的因素。silx 中可用的实现使用 OpenCL,这意味着它可以在图形处理单…

SIFT

SIFT features Scale Invariant Feature Transform (SIFT) is an approach for detecting and extracting local feature descriptors that are reasonably invariant to change in illumination, image noise, rotation, scaling, and small changes in viewpoint. SIFT是一…

对SIFT算法的理解,尤其是尺度不变性

SIFT算法四大块 1,尺度空间的建立,最难理解的部分,这一步是为了找到极值点的潜在位置 2,极值点精确定位,通过曲线拟合找到极值点的确切位置 3,分配主方向,为特征点赋予一个方向标志&#xff…

第九章三续:SIFT算法的应用--目标识别之Bag-of-words模型

SIFT算法的应用 -目标识别之用Bag-of-words模型表示一幅图像 作者:wawayu,July。编程艺术室出品。 出处:http://blog.csdn.net/v_JULY_v 。 引言 本blog之前已经写了四篇关于SIFT的文章,请参考九、图像特征提取与匹配…

SIFT算法简介

1、 STFT(Scale Invariant Feature Transform)简介 1.1 SIFT特征检测的步骤1.2 SIFT算法的特点1.3 SIFT算法可以解决的问题 2 、尺度空间 2.1 多分辨率金字塔2.2 高斯金字塔构建示例2.3 高斯尺度空间(使用不同的参数) 3、DoG空间极…

经典算法研究系列:九、图像特征提取与匹配之SIFT算法

经典算法研究系列:九、SIFT算法研究 作者:July、二零一一年二月十五日。 推荐阅读:David G. Lowe, "Distinctive image features from scale-invariant keypoints," International Journal of Computer Vision, 60, 2 (2004), pp. 91-110---…

SIFT算法原理详解

通过《图像局部不变性特征与描述》学习SIFT,遇到各种Issue,总结了这篇博客和另外九篇博客。感谢关注,希望可以互相学习,不断提升。转载请注明链接:https://www.cnblogs.com/Alliswell-WP/p/SIFT.html 如果想深入研究SI…

SIFT算法详解与代码解析

Sift算法详解及代码解析 学了SIFT也有1个半月了,真的是坎坷不断,也因为我可能接触图像邻域时间不长,有很多相关知识要学习,直至今日,才把SIFT大致弄明白。但还有些细节值得去深究,我先把我个人对SIFT算法的…

图像处理——SIFT算法

[SIFT算法原文(Distinctive Image Features from Scale-Invariant Keypoints) SIFT算法(Scale-invariant feature transform),即尺度不变特征变换,由David Lowe提出,是一种基于局部兴趣点的算法,因此不仅对…

特征点匹配——SIFT算法详解

之前在学习三维重建的过程中,了解过SIFT算法,现在老师要求详细的了解SIFT算法,看看能不能对它进行改进,于是又详细的看了一遍SIFT算法。记录一下。 一、SIFT算法综述 SIFT(Scale Invariant Feature Transform&#x…

SIFT算法之python实现

0. 算法原理细节可参考: https://blog.csdn.net/abcjennifer/article/details/7639681https://blog.csdn.net/zddblog/article/details/7521424?depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_sourcedistribute.pc_re…

Python实现SIFT算法,附详细公式推导和代码

SIFT特征点提取算法 1、算法简介 尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David …

图像特征匹配方法——SIFT算法原理及实现

传统图像处理中图像特征匹配有三个基本步骤:特征提取、特征描述和特征匹配。特征提取就是从图像中提取出关键点(或特征点、角点)等。特征描述就是用一组数学向量对特征点进行描述,其主要保证不同的向量和不同的特征点之间是一种对…

SIFT算法原理介绍

本文转自:https://blog.csdn.net/qq_37374643/article/details/88606351 SIFT算法 SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 一、SIFT算…

SIFT算法的个人理解

SIFT算法的个人理解——理论篇 1. 前言 本人目前共使用过两个版本的sift算法: (1)Matlab中的sift算法,可以从http://www.cs.ubc.ca/~lowe/keypoints/下载Lowe团队写的sift演示代码; (2)opencv中的sift…