(项目笔记)opencv人脸识别

这篇具有很好参考价值的文章主要介绍了(项目笔记)opencv人脸识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Haar级联:

Haar特征:边缘特征,线性特征,中心环绕特征,对角线特征
(项目笔记)opencv人脸识别

这些特征组合为特征模板,特征模板里有白色和黑色矩形,模板特征即为白色矩形像素和减去黑色矩形像素和。

Haar 特征的提取简单说就是通过不断改变模版的大小、位置和类型,白色矩形区域像素和‘减 去’黑色矩形区域像素和,以得到每种类型模版的大量子特征。

Haar特征提取需要大量重复计算各个像素,因此使用积分图可以很好减少计算量。积分图将图像以线性时间初始化(仅第二次遍历图像时),并可以通过矩形区域 四个角的值,提供像素的总和
(项目笔记)opencv人脸识别

在此例中,如要知道ABCD面积,只需要将左上角作为基准,计算以下四部分面积,最后图3 - 图1 - 图2 - 图4即为ABCD面积

Haar 级联是一个基于 Haar 特征的级联分类器,级联分类器把弱分类器转换为强分类器

人脸识别流程:

人脸检测,图像采集:
加载人脸检测器
图像预处理(灰度化,直方图均衡化)
detectMultiscal识别
rectangle函数绘制矩形框
在原图截取人脸图像

人脸识别:
样本归一化
加载训练好的分类器
预测输入图像值
判断角色

人脸数据采集程序

注:单纯安装opencv-python没有包含人脸识别所使用函数,因为人脸识别函数还属于opencv测试版内容,稳定性还无法保证,因此没有放在常规发行版。要安装opencv-contrib-python

pip install opencv-contrib-python -i https://mirrors.aliyun.com/pypi/simple/

import cv2
import numpy as np
import os

def generate_img(dirname):
    face_cascade = cv2.CascadeClassifier('D:\\opencv\\data\\haarcascades\\haarcascade_frontalface_default.xml')
    if (not os.path.isdir(dirname)):
        os.makedirs(dirname)
    cap = cv2.VideoCapture(0)
    count = 0
    while True:
        ret,frame = cap.read()
        x,y = frame.shape[0:2]
        small_frame = cv2.resize(frame, (int(y/2), int(x/2)))
        result = small_frame.copy()
        gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray,1.3,5)
        for (x, y, w, h) in faces:
            result = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)
            f = cv2.resize(gray[y: y + h, x: x + w], (200, 200))
            if count < 20:
                cv2.imwrite(dirname + '%s.pgm' % str(count), f)
                print(count)
                count += 1
        cv2.imshow('face', result)
        if cv2.waitKey(30) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()
    
if __name__ == '__main__':
    generate_img(".\\photos\\raine")

说明:
1 face_cascade = cv2.CascadeClassifier('D:\\opencv\\data\\haarcascades\\haarcascade_frontalface_default.xml')
引入opencv的人脸检测器。该程序参数路径为标记好的图片的xml文件,关于人脸图片的xml文件可以自己标记创建,也可以直接下载opencv官方库(https://github.com/opencv/opencv/tree/master/data/haarcascades)。这里引入其中一个xml文件路径(我用的是正脸照片文件)。注意windows里路径要使用 \ 而非 \ 。 因为 \ 为转义字符标注,使用 \ 为 \ 的转义字符。

2

ret,frame = cap.read()
x,y = frame.shape[0:2]
small_frame = cv2.resize(frame, (int(y/2), int(x/2)))
result = small_frame.copy()
gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)

获取相机照片,缩放图片使长宽缩为一半,复制图片,转换图片为灰度图

3 faces = face_cascade.detectMultiScale(gray,1.3,5)
调用face_cascade对象识别人脸,参数:
1 image表示的是要检测的输入图像
2 objects表示检测到的人脸目标序列
3 scaleFactor表示每次图像尺寸减小的比例
4 minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)
5 minSize为目标的最小尺寸
6 minSize为目标的最大尺寸

4

 for (x, y, w, h) in faces:
            result = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)
            f = cv2.resize(gray[y: y + h, x: x + w], (200, 200))

用矩形框框出人脸。创建图像 f 为截取的人脸部分图片

5

if count < 20:
                cv2.imwrite(dirname + '%s.pgm' % str(count), f)
                print(count)
                count += 1

保存图片,count加一,count为20时停止保存
效果如下:

(项目笔记)opencv人脸识别

人脸识别
opencv有三种人脸识别方法:
1 Fisherfaces:PCA 衍生版本,更高级,速度更快
2 Eigenfaces:通过 PCA 处理,计算训练集相对于数据库发散程度,越小则数据库与检测 到人脸差别越小
3 Local Binary Pattern Histogram(LBPH):将人脸分成小单元,与模型对应单元比对,每 个比对区域产生一个直方图

人脸数据模型训练及识别

import os
import sys
import cv2
import numpy as np


# search for face photos in the files 
def read_images(path, sz = None):
    index = 0
    images, indexes = [], []
    names = []
    # find path for samples
    for root, dirs, files in os.walk(path): # transverse the path
        for subdirs in dirs:    # get files in the childrens in path
            subject_path = os.path.join(root, subdirs)
            for filename in os.listdir(subject_path):   # get each photos
                try:
                    if (filename == ".directory"):
                        continue
                    # find the path for each photo
                    filepath = os.path.join(subject_path, filename)
                    im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE) # read face samples
                    # negative samples
                    if (im is None):
                        print("image" + filepath + "is None")
                    # positive samples
                    if (sz is not None):    
                        im = cv2.resize(im, sz)
                        images.append(np.asarray(im, dtype = np.uint8))
                        indexes.append(index)
                except:
                    print("unexpected error")
                    raise # throw an exception
            index = index + 1
            names.append(subdirs)
    return [names, images, indexes]


# detect and classify face images
def face_rec(read_dir):
    # get face samples
    [names, x, y] = read_images(read_dir, sz = (200, 200))
    y = np.asarray(y, dtype=np.int32)
    model = cv2.face_EigenFaceRecognizer.create() # create face classifier model
    model.train(np.asarray(x), np.asarray(y))   # train model
    # create face detector model
    face_cascade = cv2.CascadeClassifier('C:/Users/linli/Desktop/faceDetect/haarcascade_frontalface_default.xml')
    cap = cv2.VideoCapture(0)
    while True:
        # get gray image
        ret, frame = cap.read()
        x, y = frame.shape[0:2]
        small_frame = cv2.resize(frame, (int(y / 2), int(x / 2)))
        result = small_frame.copy()
        gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)
        # find face in the video frame
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)

        for (x, y, w, h) in faces:
            # mark the face with a rectangle
            result = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)
            roi = gray[x:x + w, y:y + h]
            centerX = int(x + w / 2)
            centerY = int(y + h / 2)
            result = cv2.circle(result, (centerX, centerY), 5, (0, 0, 255), -1)
            try:
                roi = cv2.resize(roi, (200,200), interpolation=cv2.INTER_LINEAR)
                [p_label, p_confidence] = model.predict(roi)    # predict the face identity
                print(p_confidence)
                # showthe prediction in text
                cv2.putText(result, names[p_label], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
            except:
                continue
        cv2.imshow("recognize_face", result)
        if cv2.waitKey(30) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    face_rec("./photos")       

1 Python里os获取路径基本函数
os.path.join(String*):接受多个字符串为参数,将字符串连接为文件路径,如果出现以 / 开头的参数,路径从最后一个以 / 开头参数开始
os.listdir(path):参数为一个路径,返回该路径下所有文件和文件夹名称
os.walk(path):遍历选定路径文件夹,返回root,dirs,files。其中root为当前文件夹path的绝对路径,dirs为当前文件夹子文件夹,files为当前文件夹下文件

2 def read_images(path, sz = None):
该函数搜索文件夹里已有的人脸样本,得到一个路径(names)+图像(images)+序号(indexes)二维列表

3

model = cv2.face_EigenFaceRecognizer.create() # create face classifier model
model.train(np.asarray(x), np.asarray(y))   # train model

创建人脸分类对象并利用之前获得的人脸图片训练模型

4

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

调用人脸识别模型,在视频画面中寻找人脸图像

5

roi = cv2.resize(roi, (200,200), interpolation=cv2.INTER_LINEAR)

Eigenfaces算法要求识别目标图像和样本图像大小一致,这里统一设为200*200

6

centerX = int(x + w / 2)
centerY = int(y + h / 2)
result = cv2.circle(result, (centerX, centerY), 5, (0, 0, 255), -1)

找到人脸中心并绘制圆
注:circle函数参数:图像,圆心,半径,颜色,线宽(负数代表填充)
圆心必须为int型

7

[p_label, p_confidence] = model.predict(roi) 

获取预测结构,包括标签名称和置信区间

效果如下:
(项目笔记)opencv人脸识别文章来源地址https://www.toymoban.com/news/detail-451197.html

到了这里,关于(项目笔记)opencv人脸识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用OpenCV实现人脸特征点检测与实时表情识别

    引言:         本文介绍了如何利用 OpenCV 库实现人脸特征点检测,并进一步实现实时表情识别的案例。首先,通过 OpenCV 的Dlib库进行人脸特征点的定位,然后基于特征点的变化来识别不同的表情。这种方法不仅准确度高,而且实时性好,可以广泛应用于人脸表情分析、人

    2024年04月15日
    浏览(48)
  • OpenCV级联分类器识别车辆实践笔记

    基于Haar特征的级联分类器的目标检测是Paul Viola和Michael Jones在2001年的论文中提出的一种有效的目标检测方法。这是一种基于机器学习的方法,从大量的正面和负面图像中训练级联函数。然后用它来检测其他图像中的物体。 Haar特征是一种反映图像的灰度变化的,像素分模块求

    2024年02月06日
    浏览(50)
  • 项目:基于OpenCV+百度云人脸识别项目

    基于OpenCV和百度云人脸识别的项目可以使用以下的框架来实现: 数据采集和预处理:使用OpenCV来采集摄像头或读取图像文件,并对图像进行预处理操作,例如裁剪、调整大小、灰度化等。 人脸检测:使用OpenCV的人脸检测功能来检测图像中的人脸。可以使用预训练的人脸检测

    2024年01月16日
    浏览(46)
  • OpenCV人脸识别项目(训练+测试)

    图片来自网上,如果侵权,告知则删除 批量修改文件名(常见文件操作,可以学习一下) 进入正题  (一)读取图片 (二)灰度转换 (三)修改尺寸 (四)绘制矩形 (五)人脸检测 (六)检测多个人脸 (七)视频检测  (八)拍照保存 准备数据集 训练集train  注意:第

    2024年02月04日
    浏览(41)
  • 人脸检测:经典的VJ人脸检测器(类Harr特征,积分图加速法,级联的Adaboost强分类器)

    著名的VJ人脸检测算法就是一种基于Adaboost分类器的方法。该检测器由Paul Viola和Michael Jones在2001年的 Robust Real-Time Face Detection 提出。在当年的硬件条件下VJ算法可以达到每秒15帧图像的处理速度,是人脸检测技术发展的一个里程碑。虽然性能跟现在基于深度学习的方法没法比,

    2024年02月06日
    浏览(38)
  • Qt-OpenCV学习笔记--人脸识别

    本人从事机械设计12年,业余时间自学编程。 2022年4月6日,开始学习C#, 2022年9月7日,开始学习c++和Qt, 2022年10月28日,开始学习OpenCV, 今天终于搞定了传说中的 人脸识别  ,在此,做个记录。 人脸检测,是基于Haar特征的cascade分类器, 人脸识别,是基于LDA理论的Fisherface算

    2024年02月09日
    浏览(39)
  • 做一个人脸识别考勤机项目(利用OpenCV)

    重要说明 :此项目直接跟进操作的话只能在Ubuntu16.04上面编译成功!目前已经补上18.04上的编译操作。         本文主要跟随B站Up主【物联网小学妹】上传的【从0到1做一个物联网人脸识别考勤机项目!】视频教程做一个简要笔记 视频地址:【大厂敲门砖】从0到1做一个物

    2024年04月22日
    浏览(49)
  • Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

    ​ 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用,主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术,其中包括以下几个关键步骤: 图像预处理 :首先,对输入图像进行预处理,包括读取图片、将图片灰度转换、修改图片的尺寸、绘制矩形

    2024年04月13日
    浏览(64)
  • 简易机器学习笔记(十一)opencv 简易使用-人脸识别、分类任务

    前段时间摸了下机器学习,然后我发现其实openCV还是一个很浩瀚的库的,现在也正在写一篇有关yolo的博客,不过感觉理论偏多,所以在学yolo之前先摸一下opencv,简单先写个项目感受感受opencv。 openCV实际上已经有一个比较完整的模型了,下载在haarcascades 这里我们下haarcascade

    2024年01月21日
    浏览(45)
  • 基于python-opencv,svm的开源人脸识别项目

      前言       本项目是我自己在学校里完成的一个小项目,本项目为基于python-opencv,svm的人脸识别开源项目,不同于其他的直接从kaggle等获取划分好的数据集,本项目致力于从无到有的完成机器学习的所有步骤,即: 目录 项目展示: 一、数据采集 1.创建爬虫项目 2.修改set

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包