题目  基于OpenCV和Python模式识别系统的设计与实现
1.1 题目的主要研究内容
(1)工作的主要描述(宋体小四号不加粗1.5倍行距)
利用python中自带的opencv库中的人脸识别算法制作一个简易的模式识别系统,使用自己搜集到的数据集对模型进行训练,最终完成特征提取、分类等工作,并且在最后的推理过程中,实现了人脸识别的工作。
(2)系统流程图
1.2 题目研究的工作基础或实验条件
软件环境:cv2是用于Python的OpenCV模块,我们将用于人脸检测和人脸识别。操作系
将使用此 Python 模块读取我们的训练目录和文件名numpy将使用此模块将Python列表转换为numpy数组,因为OpenCV人脸识别器接受numpy数组。
1.3 数据集描述
java资料大全pdf小白盘训练中使用的图像越多越好。通常,许多图像用于训练面部识别器,以便它可以学习同一个人的不同外观,例如戴眼镜,不戴眼镜,大笑,悲伤,快乐,哭泣,留胡子,无胡须等。为了使训练保持简单,将为每个人仅使用12张图像。因此,训练数据总共由2个人组成,每人有12张图像。所有训练数据都training-data文件夹中。training-data文件夹包含每个人的一个文件夹,每个文件夹都以sLabel格式命名例如s1,s2),其中标签实际上是分配给该人的整数标签。例如,名为 s1 的文件夹表示此文件夹包含人员 1 的图像。训练数据的目录结构树如下所示
training-data
|-------------- s1
|              |-- 1.jpg
|              |-- ...
|              |-- 12.jpg
|-------------- s2
|              |-- 1.jpginput英语怎么读
|              |-- ...
|              |-- 12.jpg
1.4 特征提取过程描述
该系统中采用的特征提取算法是局部二值模式直方图(LBPH)算法,而原始的LBP算子定义为在3*3的窗口内以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。提取的LBP算子在每个像
素点都可以得到一个LBP“编码”,那么,对一幅图像(记录的是每个像素点的灰度值)提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)。
  对LBP特征向量进行提取的步骤:
(1)首先将检测窗口划分为16×16的小区域(cell);
(2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值。
1.5 分类过程描述
该系统用到的分类器是opencv中提供训练好的级联分类器,该分类器是一种Harr级联分类器,Harr级联分类器的具体分类过程为:
1. 提取类Haar特征;
python基础代码大全下载
2. 利用积分图法对类Haar特征提取进行加速;
3. 使用Adaboost算法训练强分类器,区分出人脸和非人脸;
4. 使用筛选式级联把强的分类器级联在一起,从而提高检测准确度。
opencv中提供的Harr级联分类器共有20多种,它们都以xml文件的格式保存在opencv中的data文件夹下,这些级联分类器可以检测人脸,以及人脸的不同特征,或者人类和其它物体等等,本项目中保存的分类器除了Harr级联分类器还保存了LBP级联分类器,这两个分类器的分类过程本质基本相似,所以在此不对LBP级联分类器的分类过程做具体叙述。综上,我们选择对正面人脸为特征做检测的Haar和LBP级联分类器,在项目中以haarcascade_l文件和lbpcascade_frontalface_alt,xml文件存在。
1.6 主要程序代码
import cv2  #导入opencv模块
import os  #导入os模块用于读取训练数据目录和路径
import numpy as np  #导入numpy将ython列表转换为numpy数组
subjects = ["", "Ramiz Raja", "Elvis Presley"]  #定义需要分类目标的名字
def detect_face(img):  #定义使用opencv用来检测脸部的函数
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  #将测试图像转换为灰度图像
enterpassword翻译    face_cascade = cv2.CascadeClassifier('opencv-files/l')  #加载opencv人脸检测器
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5);  #结果是一张脸的列表
    if (len(faces) == 0):  #如果未检测到面部,则返回原始图像
        return None, None
    (x, y, w, h) = faces[0]  #只有一张脸,提取面部区域
    return gray[y:y+w, x:x+h], faces[0]  #只返回图像正面部分
def prepare_training_data(data_folder_path):  #该函数用于读取所有人的训练图像,从每个图像检测人脸,并将返回两个完全相同大小的列表,参数为目录的路径
    dirs = os.listdir(data_folder_path) 
    faces = []  #列表来保存所有主题的面孔
    labels = [] #列表来保存所有主题的标签
小程序开发一般要多钱
    for dir_name in dirs: 
        if not dir_name.startswith("s"):
            continue;
        label = int(place("s", ""))
        subject_dir_path = data_folder_path + "/" + dir_name 
        subject_images_names = os.listdir(subject_dir_path)
        for image_name in subject_images_names:  #检测脸部并将脸部添加到脸部列表
            if image_name.startswith("."):  #忽略.DS_Store之类的系统文件
                continue;
            image_path = subject_dir_path + "/" + image_name  #建立图像路径
            image = cv2.imread(image_path)  #阅读图像
            cv2.imshow("Training ", size(image, (400, 500))) 
            cv2.waitKey(100)  #显示图像窗口以显示图像
            face, rect = detect_face(image)  #侦测脸部
            if face is not None: #忽略未检测到的脸部
                faces.append(face)  #将这张脸添加到脸部列表
                labels.append(label) #为这张脸添加标签
           
    cv2.destroyAllWindows()
    cv2.waitKey(1)
    cv2.destroyAllWindows()
   
    return faces, labels
后台管理数据系统属于#准备好训练数据,数据将在两个大小相同的列表中,一个列表包含所有的面孔:
print("")
faces, labels = prepare_training_data("training-data")
print("Data prepared")
#打印总面和标签:
print("Total faces: ", len(faces))
print("Total labels: ", len(labels))
#训练人脸识别器,使用LBPH人脸识别器
face_recognizer = cv2.face.LBPHFaceRecognizer_create()  #创建LBPH人脸识别器
ain(faces, np.array(labels))  #训练人脸识别器
#此函数用于在图像上绘制矩形,根据给定的(x,y)坐标和给定的宽度和高度来绘制:
def draw_rectangle(img, rect): 
    (x, y, w, h) = rect
    angle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
   
#函数在此图像开始绘制文本,通过(x,y)坐标
def draw_text(img, text, x, y):
    cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0), 2)
def predict(test_img):
    img = py()  #制作图像的副本,不更改原始图像

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。