使用opencv实现简单的人脸识别

article/2025/10/26 9:38:13

一、opencv模块的使用

1、简介

opencv-python是一个python绑定库,旨在解决计算机视觉问题。使用opencv模块,可以实现一些对图片和视频的操作。

2、安装

安装opencv之前需要先安装numpy, matplotlib。然后使用pip安装opencv库即可。

3、导入

使用import cv2进行导入即可,需要注意的是cv2读取图片的颜色通道是BGR(蓝绿红)。

4、使用

使用cv2.imread()接收读取的图片,此处需要注意的是读取路径必须为英文。

cat = cv2.imread("cat1.png")

使用cv2.imshow()函数显示读取的图片。

cv2.imshow("cat", cat)

其中,函数内的第一个参数为显示图片窗口左上角的名字,第二个参数为接收读取的图片。

注意:在调用显示图像的API后,要调用cv2.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。

cv2.waitKey(0)

其中,函数内的意思是等待键盘输入的时间,单位毫秒,如果为0则无限等待。

最后,使用cv2.destroyAllWindows()释放内存。

cv2.destroyAllWindows()

显示图像结果如下。

二、实现简单的人脸识别

1、下载人类特征数据

首先在github网站下载开源人脸特征数据。网址:opencv/data at 4.x · opencv/opencv · GitHub

选择如上文件

选择人脸数据进行下载。

2、简单的人脸识别代码

首先使用cv2.imread()接收要读取的图片。

yoogni = cv2.imread("myq.jpg")

CascadeClassifieropencvobjdetect模块中用来做目标检测的级联分类器的一个类。传入人脸特征数据,返回识别出的人脸对象。

detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

使用detectMultiScale()接收返回检测出的人脸对象。

face_zone = detector.detectMultiScale(yoogni)

打印接收的对象。

print(face_zone)

输出结果如下:

输出的为检测的人类区域。

3、在图上绘制识别出的人脸区域

使用cv2.rectangle()绘制出识别成功的人脸区域。

for x, y, w, h in face_zone:
    cv2.rectangle(yoogni
, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255))

其中pt1是左上角坐标,pt2是右下角坐标,w是识别区域的宽,h是识别区域的高。颜色选择的是红色。

使用cv2.imshow()函数显示绘制完成的图片。

cv2.imshow("myq",yoogni)

输出结果如下:

三、进行多个人脸识别

在进行一张图片的多个人脸识别时,常常会出现识别错误的情况,如下图。

所以在识别时进行参数的调整。

face_zone = detector.detectMultiScale(myq, scaleFactor=1.3, minNeighbors=5) 

scaleFactor表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%,此处调整为1.3。

minNeighbors表示构成检测目标的相邻矩形的最小个数(默认为3个)。该参数指定每一个候选矩形边界框需要有多少相邻的检测点,此处调整为5。

输出结果如下。

可以看出,检测精度明显上升。

四、进行视频人脸识别

本周在图片人脸识别的基础上进行扩展,进行视频的人脸识别。

1、视频捕获

首先进行视频捕获。

cap = cv2.VideoCapture("video2.mp4")

videocapture是按帧读取视频,就是读取视频里的图片,这个函数返回一张图片和一个布尔类型的值,布尔类型的值表示还有没有下一帧。

flag, frame = cap.read()
print(flag, frame.shape)

此时frame是第一帧图片,frame.shape输出的是图片维度。输出结果如下:

传入人脸特征数据

detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

2、将图像转为黑白影像再进行人脸识别

因为在识别人脸的时候,黑白和彩色不影响识别,所以为了运行速度更快,可以将识别时候的视频转为黑白。

gray = cv2.cvtColor(luo, code=cv2.COLOR_BGR2GRAY)

对黑白图像进行人脸识别

face_zone = detector.detectMultiScale(gray)

3、对视频进行人脸识别

首先要使用while语句进行判别,判断视频是否读到最后一帧。返回全部帧,使用isOpened函数判断视频是否还打开。

while cap.isOpened():

在while语句中,首先按帧读取视频。

flag, frame = cap.read()

由于原视频过大,所以将视频重新调整一下大小,使用luo接收返回值。

luo = cv2.resize(frame, dsize=(640, 360))

再将图片转为黑白色,并进行人脸识别。

gray = cv2.cvtColor(luo, code=cv2.COLOR_BGR2GRAY)
face_zone = detector.detectMultiScale(gray)

在按帧绘制出识别区域。

for x, y, w, h in face_zone:
    cv2.rectangle(luo
, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255))

写判断语句,当视频播放到最后一帧时退出循环。

if not flag:
   
break

显示视频。

cv2.imshow("me", luo)

下面判断语句的意思是,等待10毫秒,如果用户没有摁下q键,就显示下一帧视频,并且cv2只读了图片没有读声音。及摁下q键退出视频。

if ord("q") == cv2.waitKey(20):
   
break

以上代码均写在while语句中。下面释放内存。

cv2.destroyAllWindows()
cap.release()

输出结果如下。

 

五、进行摄像头人脸识别

1、调取本地摄像头

还是使用videocapture函数,参数为0调取本地摄像头。

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

2、人脸识别

与上一节的人脸识别代码一样,输出结果如下。

 

3、保存视频

获取宽高,方便写入视频,因为转换为整形数字时可能会把小数点后几位截走,所以+1,视频大一点可以,小一点不行。

w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + 1
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + 1

函数内第一个参数是视频名字;第二个是视频编码,及保存的视频格式;第三个是一秒几帧,第四个是视频的高宽。此处保存的视频名字为me,视频为avi格式。

vw = cv2.VideoWriter("me.avi", cv2.VideoWriter_fourcc("M", "P", "4", "2"), 24, (w, h))

在上一节人脸识别的while语句中,

cv2.imshow("me", frame)

这一句代码后面,判断摄像头录制是否结束。

if not flag:
   
break

如果视频没结束,把这一帧写入视频。

vw.write(frame)

保存结果如下。

 

 


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

相关文章

opencv实现人脸识别(c++实现)

1 说明 本文章基于opencv VS2015 实现人脸检测 2 效果 可以直接打开摄像头对人脸进行识别,这些标识框也会跟随你的人脸移动。隐私问题,我这里对图片进行了识别。 3 相关类及函数介绍 opencv中文文档 3.1 cv::VideoCapture 官方文档说明 功能 &am…

11 OpenCV图像识别之人脸识别

文章目录 1 Eigenfaces1.1 建模流程1.2 示例代码 2 Fisherfaces2.1 建模流程2.2 示例代码 3 Local Binary Histogram3.1 建模流程3.2 示例代码 OpenCV 提供了三种人脸识别方法: Eigenfaces Eigenfaces是一种基于PCA(Principal Component Analysis&#…

OpenCV人脸识别

OpenCV人脸识别与口罩检测 下载文件 人脸检测 人脸检测的检测方法主要有两类:基于知识(根据眼睛,眉毛,嘴巴,鼻子等器官特征及相互几何位置关系来检测)和基于统计(将人脸看作一个二维像素矩阵,通过大量人脸图像样本构造人脸模式空间,由相似度量判断人脸是否存在). 基于知识的…

【OpenCV】 人脸识别

目录 一:前言 二:人脸识别案例 实现步骤及完整代码 步骤1 灰度化处理 步骤2 将灰度图再次进行 行列压缩 步骤3 直方图均值化 步骤4 使用模型 对每一个像素点遍历 图像甄别 人脸识别案例 源码分享 结果测试:可对人脸框选识别 三&…

OpenCv人脸识别开发实战

一、OpenCV简介 OpenCV(全称:Open Source Computer Vision Library),是一个跨平台的计算机视觉库。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。 ​ OpenCV用C语言编写,它的主要接口也是C语言&#…

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…