OpenCV(项目)人脸识别(图片识别、摄像头识别)

目录

一、基础理论

1、基于特征的算法

2、基于图像的算法

3、Haar特征

4、adaboost级联决策器

二、人脸识别(图片)

1、图片灰度化

2、训练一组数据

3、检测人脸

4、遍历人脸,画出矩形框并显示

出错的情况

总代码

三、摄像头人脸识别

1、打开摄像头

2、按帧读取视频

3、图像左右翻转

4、识别每一帧图像

5、退出设置(必要步骤)

总代码

参考资料

一、基础理论

根据该方法,人脸检测算法可以分为两类:基于特征的算法和基于图像的算法。

[En]

According to the method, face detection algorithms can be divided into two categories: * feature-based algorithm and image-based algorithm.*

1、基于特征的算法

基于特征的算法就是通过 提取图像中的特征和人脸特征进行匹配,如果匹配上了就说明是人脸,反之则不是。提取的特征是人为设计的特征,例如 Haar,FHOG,特征提取完之后,再利用分类器去进行判断。通俗的说就是采用模板匹配,就是用人脸的模板图像与待检测的图像中的各个位置进行匹配,匹配的内容就是提取的特征,然后再利用分类器进行判断是否有人脸。

2、基于图像的算法

基于图像的算法, 将图像分为很多小窗口,然后分别判断每个小窗是否有人脸。通常基于图像的方法依赖于统计分析和机器学习,通过统计分析或者学习的过程来找到人脸和非人脸之间的统计关系来进行人脸检测。最具代表性的就是CNN, CNN用来做人脸检测也是目前效果最好,速度最快的。

3、Haar特征

我们使用 机器学习的方法完成 人脸检测,首先 需要大量的正样本图像(面部图像)和负样本图像〈不含面部的图像)来训练分类器。我们需要 从其中提取特征。下图中的 Haar特征会被使用,就像我们的卷积核, 每一个特征是一个值,这个值等于 黑色矩形中的像素值之和减去 白色矩形中的像素值之和。

Haar特征:

(核)

(切片)

Haar特征值反映了 图像的灰度变化情况。例如︰脸部的一些特征能由矩形特征简单的描述,眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。

Haar特征可用于于 图像任意位置, 大小也可以任意改变,所以 矩形特征值是 矩形模版类别、 矩形位置和 矩形大小这三个因素的函数。故 类别、大小 和位置的变化, 使得很小的检测窗口含有非常多的矩形特征。

4、adaboost级联决策器

得到图像的特征后, 训练一个决策树构建的adaboost级联决策器来 识别是否为人脸。

人脸检测,把图像分成一个个小块,对每一个小块判断是否是人脸, 假如一张图被分成了5000块,则速度非常慢。为了提高效率,OpenCV 提供 cascades 来避免这种情况。提供了一系列的xml文件。(cascades :级联)

cascade 对于每个数据块,它都进行一个简单快速的检测。 若过,会再进行一个更仔细的检测。该算法有 30 到 50 个这样的阶段,或者说 cascade。 只有通过全部阶段,cascade才会判断检测到人脸。这样做的好处是: 大多数小块都会在前几步就产生否定反馈,节约时间。

二、人脸识别(图片)1、图片灰度化# 1、转灰度图 gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) cv2.imshow(“gray”, gray)

2、训练一组数据

级联分类器CascadeClassifier:CascadeClassifier是用来做目标检测的级联分类器的一个类 。

face_detector = cv2.CascadeClassifier(src)

src:待训练数据的地址。这里用来训练一组人脸数据,xml文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。

# 1、训练一组人脸 face_detector = cv2.CascadeClassifier(“D:/Software/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml”)3、检测人脸

检测API, detectMultiScale:在 灰度图上 检测人脸,输出是 人脸区域的外接矩形框。

faces = face_cascade.detectMultiScale(self,                      image: Any,                      scaleFactor: Any = None,                     minNeighbors: Any = None,                     flags: Any = None,                      minSize: Any = None,                      maxSize: Any = None) -> None

参数:1.image:表示的是要检测的输入图像2.scaleFactor:表示每次图像尺寸减小的比例3. minNeighbors:至少检测次数。若为3,表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)4.flags,要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域5.minSize为目标的最小尺寸6.minSize为目标的最大尺寸返回:返回检测到的区域矩形坐标(4个角)。

# 2、检测人脸(用灰度图检测,返回人脸矩形坐标(4个角)) faces_rect = face_detector.detectMultiScale(gray, 1.05, 3) # 灰度图 图像尺寸缩小比例 至少检测次数(若为3,表示一个目标至少检测到3次才是真正目标)

得到结果:

4、遍历人脸,画出矩形框并显示# 3、遍历每个人脸,画出矩形框 dst = img.copy() for x, y, w, h in faces_rect: cv2.rectangle(dst, (x, y), (x + w, y + h), (0, 0, 255), 3) #画出矩形框 # 显示 cv2.imshow(“dst”, dst)

出错的情况

可以发现,这一方人脸识别失败。我们降低了要求,并将最小测试次数更改为1次:

[En]

It can be found that this side face recognition failed. We lowered the requirement and changed the minimum number of tests to 1:

# 2、检测人脸(用灰度图检测,返回人脸矩形坐标(4个角)) faces_rect = face_detector.detectMultiScale(gray, 1.05, 1) # 灰度图 图像尺寸缩小比例 至少检测次数(若为3,表示一个目标至少检测到3次才是真正目标)

总代码# 人脸识别import cv2# 图片中人脸识别def Face_Detect_Pic(image): # 1、转灰度图 gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) cv2.imshow(“gray”, gray) # 2、训练一组人脸 face_detector = cv2.CascadeClassifier(“D:/Software/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml”) # 3、检测人脸(用灰度图检测,返回人脸矩形坐标(4个角)) faces_rect = face_detector.detectMultiScale(gray, 1.05, 3) # 灰度图 图像尺寸缩小比例 至少检测次数(若为3,表示一个目标至少检测到3次才是真正目标) print(“人脸矩形坐标faces_rect:”, faces_rect) # 4、遍历每个人脸,画出矩形框 dst = img.copy() for x, y, w, h in faces_rect: cv2.rectangle(dst, (x, y), (x + w, y + h), (0, 0, 255), 3) #画出矩形框 # 显示 cv2.imshow(“dst”, dst)if __name__ == “__main__”: # 读取图片 img = cv2.imread(“Resource/faces.jpg”) cv2.imshow(“img”, img) Face_Detect_Pic(img) #人脸识别(图片) cv2.waitKey(0)三、摄像头人脸识别

注意:最小测试次数已更改为7次,否则将出现错误检测。

[En]

Note: the minimum number of tests has been changed to 7, otherwise there will be error detection.

1、打开摄像头# 打开摄像头 capture = cv2.VideoCapture(0) #0:本地摄像头 1:外接摄像头2、按帧读取视频 while (True): # 1、按帧读取视频 ret, frame = capture.read() #frame为每一帧的图像3、图像左右翻转

您需要左右翻转,否则当您左右移动时,对象会左右移动,反之亦然。

[En]

You need to flip left and right, otherwise when you move left and right, the object moves right and left and vice versa.

# 2、左右翻转(否则向左右移动的时候,对象右左移动,反着移) frame = cv2.flip(frame, 1)4、识别每一帧图像

在用于面部识别的每一帧的提取图像上调用面部识别函数。

[En]

The face recognition function is called on the extracted image of each frame for face recognition.

# 3、对每一帧图像人脸识别 result = Face_Detect_Pic(frame)5、退出设置(必要步骤)# q键退出 if cv2.waitKey(1) & 0XFF == ord(“q”): break

总代码# 人脸识别(图片、摄像头)import cv2# 图片中人脸识别def Face_Detect_Pic(image): # 1、转灰度图 gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) cv2.imshow(“gray”, gray) # 2、训练一组人脸 face_detector = cv2.CascadeClassifier(“D:/Software/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml”) # 3、检测人脸(用灰度图检测,返回人脸矩形坐标(4个角)) faces_rect = face_detector.detectMultiScale(gray, 1.05, 7) # 灰度图 图像尺寸缩小比例 至少检测次数(若为3,表示一个目标至少检测到3次才是真正目标) # print(“人脸矩形坐标faces_rect:”, faces_rect) # 4、遍历每个人脸,画出矩形框 dst = image.copy() for x, y, w, h in faces_rect: cv2.rectangle(dst, (x, y), (x + w, y + h), (0, 0, 255), 3) #画出矩形框 # 显示 cv2.imshow(“dst”, dst) return dst# 摄像头中人脸识别def Face_Detect_Cam(): # 打开摄像头 capture = cv2.VideoCapture(0) #0:本地摄像头 1:外接摄像头 while (True): # 1、按帧读取视频 ret, frame = capture.read() #frame为每一帧的图像 # 2、左右翻转(否则向左右移动的时候,对象右左移动,反着移) frame = cv2.flip(frame, 1) # 3、对每一帧图像人脸识别 result = Face_Detect_Pic(frame) # q键退出(设置读帧间隔时间) if cv2.waitKey(1) & 0XFF == ord(“q”): breakif __name__ == “__main__”: # 读取图片 img = cv2.imread(“Resource/faces.jpg”) cv2.imshow(“img”, img) Face_Detect_Pic(img) #人脸识别(图片) Face_Detect_Cam() #人脸识别(视频) cv2.waitKey(0)参考资料

黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程_哔哩哔哩_bilibili

python-opencv人脸检测和识别实现(有代码和资源)_总裁余(余登武)博客-CSDN博客

【OpenCV】⚠️实战⚠️ 人脸识别 ☢️建议手收藏☢️_我是小白呀的博客-CSDN博客

Python实现人脸识别_yan_dk的专栏-CSDN博客_python人脸识别

Original: https://blog.csdn.net/great_yzl/article/details/119844700Author: 睿智Title: OpenCV(项目)人脸识别(图片识别、摄像头识别)

相关阅读Title: Python软件设计基础 第八节-Tesseract-Ocr视频字幕提取目录

一、Tesseract-Ocr概述与环境配置

(一)Tesseract-Ocr介绍

(二)Tesseract-Ocr安装

1、程序下载及安装

2、配置环境变量

3、语言配置与程序测试

二、视频字幕提取实现

(一)实现原理

(二)代码实现

三、总结

一、Tesseract-Ocr概述与环境配置(一)Tesseract-Ocr介绍

Tesseract是一款由HP实验室开发、由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引 擎。Tesseract可以处理很多自然语言,如英语、葡萄牙语等。截止到2015年为止,它可以支持超过100种书面语言,并且可以通过训练学习轻松掌握其他语言。

(二)Tesseract-Ocr安装1、程序下载及安装

官方网站:https://github.com/tesseract-ocr/tesseract官方文档:https://github.com/tesseract-ocr/tessdoc语言包地址:https://github.com/tesseract-ocr/tessdata下载地址:https://digi.bib.uni-mannheim.de/tesseract/

进入下载页面后,下载正式稳定版本,文件名为”tesseract-ocr-w64-setup-v5.0.0.20190623.exe”。

下载完成后,在PC上进行安装。安装时要注意路径中不要有中文,避免出现问题。

安装过程可以选择要安装的语言包,如简体中文。但速度较慢,建议通过其他途径下载语言包,并在本地进行安装。

2、配置环境变量

在电脑上按”Win+R”打开命令行,输入”sysdm.cpl”打开设置Path的窗口。

依次选择”高级”-“环境变量”。

在path变量中添加tesseract-ocr的安装路径。

3、语言配置与程序测试

把语言文件”chi_sim.traineddata”拷贝tesseract-ocr安装目录下的tessdata文件夹中,使程序语言显示为中文。并在tesseract-ocr安装目录下打开命令窗口,输入”tesseract -v”命令,对tesseract-ocr的安装进行检测。

出现下图提示,安装配置完成。

二、视频字幕提取实现(一)实现原理

1、读取视频,并获取视频尺寸,便于查找字幕位置2、截取字幕所在的区域,存为变量3、将字幕区域转化为灰度图4、利用cv2对字幕区域沿X轴方向边缘特征矩阵二值化5、利用tesseract-ocr中的文字识别模块对处理后的字幕区域进行识别6、输出识别后的字幕文字

(二)代码实现

选取《让子弹飞》的片段进行识别,并输出字幕信息。

以下为视频画面:

实现代码如下:

import pytesseractimport cv2import numpy as npfrom scipy import statsimport matplotlib.pyplot as plt#导入第三方库if __name__ == ‘__main__’: path = “让子弹飞.mp4” #定义读取的视频路径 cap = cv2.VideoCapture(path) frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) print(frame_count) #计算视频的帧数 i=0 #定义初始的帧数 while i

输出结果如下:

文字识别的效果和准确度还是不错的。

三、总结

在使用上述代码进行字幕识别时,需要不断调整截取字幕的位置。由于不同视频的字幕位置不同、画面比例不同,因此识别不同的视频需要使用不同的参数。

经过多次比较,发现当字幕位于截图中心时,识别效果最好。且字幕与画面不重叠的情况下,识别效果最好。

其次就是要根据不同的字幕类型,采取不同的画面处理方法。例如,有的字幕本身比较淡,不是纯白色的,这时再进行边缘二值化就容易导致字幕不完全,最终识别的效果欠佳。

解决思路:在进行最终识别前,先将灰度化、二值化的字幕截图输出,看看两者的效果,再去选择合适的处理方法。例如,下方二图,上面为灰度化处理的图片,下面为二值化处理的图片。经过二值化处理的图片明显存在缺失,不容易识别,因此可以不选二值化,仅选择灰度化即可。

Original: https://blog.csdn.net/weixin_48138515/article/details/121371139Author: 惊蛰鼬神Title: Python软件设计基础 第八节-Tesseract-Ocr视频字幕提取

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/271180/

转载文章受原作者版权保护。转载请注明原作者出处!


比丘资源网 » OpenCV(项目)人脸识别(图片识别、摄像头识别)

发表回复

提供最优质的资源集合

立即查看 了解详情