opencv 人脸识别 (二)训练和识别

合集下载

基于opencv的人脸识别开题报告

基于opencv的人脸识别开题报告

基于opencv的人脸识别开题报告一、选题背景随着人工智能技术的不断发展,人脸识别技术逐渐成为了热门研究领域。

人脸识别技术可以应用于安全监控、人脸支付、人脸解锁等多个领域,具有广阔的应用前景。

而OpenCV作为一个开源的计算机视觉库,提供了丰富的图像处理和分析工具,被广泛应用于人脸识别领域。

本文将基于OpenCV,探讨人脸识别技术的实现原理和应用。

二、研究目的本研究旨在通过OpenCV实现人脸识别技术,探索其在实际应用中的可行性和效果。

具体目标如下:1. 研究OpenCV中人脸识别的基本原理和算法;2. 实现基于OpenCV的人脸检测和识别功能;3. 评估所实现的人脸识别系统的准确性和稳定性;4. 探讨人脸识别技术在安全监控、人脸支付等领域的应用前景。

三、研究内容和方法1. 研究内容本研究将主要包括以下内容:(1)OpenCV中人脸识别的基本原理和算法研究:了解OpenCV中人脸识别的基本原理,包括人脸检测、特征提取和匹配等关键步骤。

(2)基于OpenCV的人脸检测和识别功能实现:利用OpenCV提供的函数和工具,实现人脸检测和识别功能,并进行算法优化和性能测试。

(3)人脸识别系统的准确性和稳定性评估:通过对已知人脸数据集的测试,评估所实现的人脸识别系统的准确性和稳定性,并进行性能分析和改进。

(4)人脸识别技术的应用前景探讨:结合实际应用场景,探讨人脸识别技术在安全监控、人脸支付等领域的应用前景,提出相应的建议和改进方案。

2. 研究方法本研究将采用以下方法进行实施:(1)文献调研:通过查阅相关文献和资料,了解人脸识别技术的发展历程、基本原理和算法。

(2)编程实现:利用OpenCV提供的函数和工具,使用Python或C++等编程语言,实现人脸检测和识别功能。

(3)数据集准备:收集和整理包含人脸图像的数据集,用于训练和测试人脸识别系统。

(4)系统评估:通过对已知人脸数据集的测试,评估所实现的人脸识别系统的准确性和稳定性,并进行性能分析和改进。

基于opencv的人脸识别毕业设计

基于opencv的人脸识别毕业设计

基于opencv的人脸识别毕业设计一、引言人脸识别技术是一种通过对图像或视频中的人脸进行识别和验证的技术。

随着计算机视觉和深度学习技术的发展,人脸识别技术已被广泛应用于安防监控、人脸支付、智能门禁等领域。

本文将以基于opencv 的人脸识别技术为研究对象,设计一种高效、准确的人脸识别方案,作为毕业设计的主题。

二、背景介绍1. 人脸识别技术发展历程人脸识别技术的发展经历了传统图像处理、特征提取、模式识别等阶段,近年来,随着深度学习技术的成熟,人脸识别技术取得了突破性进展。

基于深度学习的人脸识别算法不仅能够实现高精度的人脸检测和识别,还能适应不同光照、姿态和表情下的人脸识别任务。

2. opencv在人脸识别中的应用opencv是一个开源的计算机视觉库,提供了丰富的图像处理和机器视觉算法库。

opencv的简单易用、跨评台兼容等特性,使其成为人脸识别技术开发中的重要工具。

许多经典的人脸检测、人脸识别算法都有基于opencv的实现。

三、研究内容与目标本文拟以基于opencv的人脸识别技术为研究对象,结合深度学习技术和opencv图像处理算法,设计一种高效、准确的人脸识别方案。

具体研究内容和目标如下:1. 掌握opencv图像处理和人脸识别的基本原理与算法;2. 分析深度学习在人脸识别中的应用,并结合opencv实现深度学习模型;3. 设计并实现一个基于opencv的人脸检测和识别系统;4. 评估所设计系统的准确性、鲁棒性和实时性,并与市面上主流的人脸识别系统进行性能比较。

四、研究方法与流程1. 研究方法本研究将采用文献调研、实验分析和系统设计等方法,通过阅读相关文献,深入了解深度学习和opencv在人脸识别中的应用;结合实际数据集,分析人脸识别算法的性能和特点;基于opencv和深度学习框架,设计实现人脸识别系统,并进行性能评估。

2. 研究流程(1)文献综述:梳理文献,了解人脸识别领域的研究现状和发展趋势;(2)数据准备:收集人脸图像数据集,用于实验分析和算法训练;(3)算法实现:基于opencv和深度学习框架,实现人脸检测和识别算法;(4)系统设计:设计一个基于opencv的人脸识别系统,包括图像预处理、特征提取和匹配识别等模块;(5)性能评估:通过实验评估所设计系统的准确性、鲁棒性和实时性,并与市面上主流的人脸识别系统进行性能比较;(6)撰写毕业设计论文。

实现一个简单的人脸识别程序

实现一个简单的人脸识别程序

实现一个简单的人脸识别程序人脸识别技术在现代社会中广泛应用于安保、监控、人脸支付等领域。

本文将介绍如何实现一个简单的人脸识别程序,包括数据采集、特征提取、分类器训练和测试等步骤。

一、数据采集人脸识别程序的第一步是采集人脸图像数据,以便后续的特征提取和分类器训练。

数据采集有许多方法,例如使用相机、视频录像、人脸数据库等。

在本文中,我们将使用Python语言的OpenCV库来实现数据采集。

具体步骤如下:1.使用OpenCV库中的cv2.VideoCapture()函数打开摄像头,并设置视频分辨率和帧率。

2.使用while循环读取每一帧的图像,并用cv2.imshow()函数显示出来。

3.当用户按下键盘上的“q”键时,程序终止,并将采集到的人脸图像保存在本地。

二、特征提取在数据采集之后,我们需要从图像中提取出能够表征人脸特征的信息。

通常使用的特征包括颜色直方图、Haar-like特征、LBP特征等。

在本文中,我们将使用Haar-like特征来描述人脸的特征。

Haar-like特征是一种计算速度较快,效果也较好的特征提取方法。

可以通过OpenCV库的cv2.CascadeClassifier()函数来获取Haar-like特征分类器。

三、分类器训练在特征提取之后,我们需要使用机器学习算法来训练分类器,以便将人脸图像与非人脸图像进行区分。

通常使用的分类器包括SVM、KNN、随机森林等。

在本文中,我们将使用支持向量机(SVM)来训练分类器。

SVM是一种二分类器,通过寻找一个最优的超平面将样本分为两个类别。

分类器训练的步骤如下:1.将采集到的人脸图像和非人脸图像分别划分为训练集和测试集。

2.将训练集中的人脸图像和非人脸图像进行特征提取。

3.将特征向量和标签传入SVM进行训练。

四、测试在分类器训练完成之后,我们需要对训练好的分类器进行测试,以评估分类器的准确率。

通常使用的评估指标包括准确率、召回率、F1值等。

在本文中,我们将使用测试集来评估分类器的准确率。

opencv人脸识别原理

opencv人脸识别原理

opencv人脸识别原理OpenCV(开源计算机视觉库)是一个广泛使用的计算机视觉库,其中包含了很多用于处理图像和视频的函数和算法。

在OpenCV中,人脸识别是一个重要的应用领域。

其原理主要包括以下几个步骤:1. 图像预处理:首先,将输入的图像转换为灰度图像,这是因为灰度图像只有一个通道,便于加速运算。

然后,可以对图像进行一些预处理操作,如直方图均衡化、高斯滤波等,以提高识别效果。

2. 面部检测:OpenCV使用级联分类器(Cascade Classifier)来进行面部检测。

这是一种基于机器学习的方法,通过训练一个分类器来识别面部特征。

级联分类器是由多个简单特征分类器级联而成,使用Haar特征提取器和Adaboost训练技术来实现。

3. 特征提取:一旦检测到面部区域,OpenCV会使用特征提取算法来提取面部的特征。

这些特征可以是面部区域的几何特征,如眼睛、鼻子、嘴巴的位置和形状等,也可以是纹理特征,如局部二值模式(LBP)、小波变换等。

4. 特征匹配:接下来,OpenCV将使用已知的特征模板与提取到的面部特征进行匹配。

这可以通过比较特征向量之间的距离或使用分类器来完成。

匹配过程将对输入的面部特征与已知的人脸特征进行比对,以确定识别结果。

5. 人脸识别:最后,OpenCV将根据匹配结果进行人脸识别。

如果匹配率达到预设的阈值,则认为是同一个人。

否则,将确定为其他人或无法识别。

总的来说,OpenCV的人脸识别原理是通过面部检测、特征提取和特征匹配等步骤来实现的。

通过这些步骤,OpenCV能够准确地识别并区分不同的人脸。

OpenCV人脸识别C++实例代码

OpenCV人脸识别C++实例代码

OpenCV⼈脸识别C++实例代码#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/core/core.hpp>#include <opencv2/objdetect/objdetect.hpp>using namespace cv;using namespace std;void detectAndDraw( Mat& img, CascadeClassifier& cascade,CascadeClassifier& nestedCascade,double scale, bool tryflip );int main(){//VideoCapture cap(0); //打开默认摄像头//if(!cap.isOpened())//{// return -1;//}Mat frame;Mat edges;CascadeClassifier cascade, nestedCascade;bool stop = false;//训练好的⽂件名称,放置在可执⾏⽂件同⽬录下cascade.load("D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");nestedCascade.load("D:\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml");frame = imread("E:\\tmpimg\\hezhao.jpg");detectAndDraw( frame, cascade, nestedCascade,2,0 );waitKey();//while(!stop)//{// cap>>frame;// detectAndDraw( frame, cascade, nestedCascade,2,0 );// if(waitKey(30) >=0)// stop = true;//}return0;}void detectAndDraw( Mat& img, CascadeClassifier& cascade,CascadeClassifier& nestedCascade,double scale, bool tryflip ){int i = 0;double t = 0;//建⽴⽤于存放⼈脸的向量容器vector<Rect> faces, faces2;//定义⼀些颜⾊,⽤来标⽰不同的⼈脸const static Scalar colors[] = {CV_RGB(0,0,255),CV_RGB(0,128,255),CV_RGB(0,255,255),CV_RGB(0,255,0),CV_RGB(255,128,0),CV_RGB(255,255,0),CV_RGB(255,0,0),CV_RGB(255,0,255)} ;//建⽴缩⼩的图⽚,加快检测速度//nt cvRound (double value) 对⼀个double型的数进⾏四舍五⼊,并返回⼀个整型数!Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );//转成灰度图像,Harr特征基于灰度图cvtColor( img, gray, CV_BGR2GRAY );imshow("灰度",gray);//改变图像⼤⼩,使⽤双线性差值resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );imshow("缩⼩尺⼨",smallImg);//变换后的图像进⾏直⽅图均值化处理equalizeHist( smallImg, smallImg );imshow("直⽅图均值处理",smallImg);//程序开始和结束插⼊此函数获取时间,经过计算求得算法执⾏时间t = (double)cvGetTickCount();//检测⼈脸//detectMultiScale函数中smallImg表⽰的是要检测的输⼊图像为smallImg,faces表⽰检测到的⼈脸⽬标序列,1.1表⽰//每次图像尺⼨减⼩的⽐例为1.1,2表⽰每⼀个⽬标⾄少要被检测到3次才算是真的⽬标(因为周围的像素和不同的窗⼝⼤//⼩都可以检测到⼈脸),CV_HAAR_SCALE_IMAGE表⽰不是缩放分类器来检测,⽽是缩放图像,Size(30, 30)为⽬标的//最⼩最⼤尺⼨cascade.detectMultiScale( smallImg, faces,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30));//如果使能,翻转图像继续检测if( tryflip ){flip(smallImg, smallImg, 1);imshow("反转图像",smallImg);cascade.detectMultiScale( smallImg, faces2,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++ ){faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));}}t = (double)cvGetTickCount() - t;// qDebug( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ){Mat smallImgROI;vector<Rect> nestedObjects;Point center;Scalar color = colors[i%8];int radius;double aspect_ratio = (double)r->width/r->height;if( 0.75 < aspect_ratio && aspect_ratio < 1.3 ){//标⽰⼈脸时在缩⼩之前的图像上标⽰,所以这⾥根据缩放⽐例换算回去center.x = cvRound((r->x + r->width*0.5)*scale);center.y = cvRound((r->y + r->height*0.5)*scale);radius = cvRound((r->width + r->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );}elserectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),color, 3, 8, 0);if( nestedCascade.empty() )continue;smallImgROI = smallImg(*r);//同样⽅法检测⼈眼nestedCascade.detectMultiScale( smallImgROI, nestedObjects,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH//|CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ ) {center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);radius = cvRound((nr->width + nr->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );}}imshow( "识别结果", img );}opencv 连接器配置[debug]opencv_ml2413d.libopencv_calib3d2413d.libopencv_contrib2413d.libopencv_core2413d.libopencv_features2d2413d.lib opencv_flann2413d.libopencv_gpu2413d.libopencv_highgui2413d.libopencv_imgproc2413d.libopencv_legacy2413d.libopencv_objdetect2413d.lib opencv_ts2413d.libopencv_video2413d.libopencv_nonfree2413d.libopencv_ocl2413d.libopencv_photo2413d.libopencv_stitching2413d.lib opencv_superres2413d.lib opencv_videostab2413d.lib [release]opencv_ml2413.libopencv_calib3d2413.libopencv_contrib2413.libopencv_core2413.libopencv_features2d2413.lib opencv_flann2413.libopencv_gpu2413.libopencv_highgui2413.libopencv_imgproc2413.libopencv_legacy2413.libopencv_objdetect2413.libopencv_ts2413.libopencv_video2413.libopencv_nonfree2413.libopencv_ocl2413.libopencv_photo2413.libopencv_stitching2413.libopencv_superres2413.libopencv_videostab2413.lib// 根据你的版本批量替换2413版本号。

基于OpenCV的人脸识别系统

基于OpenCV的人脸识别系统

基于OpenCV的人脸识别系统本文针对课题要求,将Visual C++作为开发工具,在开源计算机视觉平台OpenCV上进行大量的研究和测试,所涉及的内容有:视频图像的采集、人脸图像的预处理、数学形态学图像处理、人脸定位和经典的AdaBoosting算法等。

进而为研究人脸识别技术提供参考依据。

标签:识别系统视频识别OpenCV1 研究背景近年来,在安全入口控制、金融贸易等方面,随着应用需求的增长,生物统计识别技术受到社会的普遍关注。

目前,微电子和视觉系统有了新的进展,在一定程度上使得高性能自动识别技术的实现代价不断降低。

而人脸检测是所有的生物识别方法中应用最广泛的技术之一,人脸检测最初来源于人脸识别。

人脸检测的目的是检测一张图像是否有人脸,如果有人脸,就把它从图像背景中分离出来,然后对特征进行人脸识别。

而在视频中的人脸检测在信息处理中,已经成为一项相当难突破的技术,越来越受到计算机视觉界的广泛关注,作为一个有价值课题,已经渗透到各不同领域中。

2 视频识别功能详细设计2.1 本系统的人脸检测算法2.1.1 基于Haar特征的人脸检测算法。

本系统开发过程中使用的人脸检测算法为基于Haar特征的人脸检测算法,Haar特征定义:HAAR 算法是一种基于特征(feature)的算法,而不是基于像素的算法。

利用Haar特征分类器实现人脸识别,其特点主要表现为检测速度快,性能好,实现流程如图1所示:对于每个特定分类器来说,通常情况下用形状、感兴趣区域中的位置以及比例系数来定义其特征。

在浏览了几种经典的人脸检测算法后,回到本系统中使用的人脸检测算法上。

基于Haar特征的人脸检测算法是最近几年被引用较多,较典型的人脸检测算法。

2.1.2 积分图像。

积分图是Haar分类器能够实时检测人脸的保证。

积分图像是数字图像的一种表示方法,对(x,y)点处的像素值,代表所有左上角像素的总和。

其中g(i,j)是原始的图像,i(x,y)是积分图像。

人脸识别代码详细解读

人脸识别代码详细解读

人脸识别代码详细解读人脸识别代码详细解读随着科技的不断进步,人脸识别技术已经逐步应用到了生活的各个领域,比如安防监控、人脸支付、智能门禁等,可以说已经成为了一种不可或缺的技术。

那么,在这些应用中,人脸识别又是如何实现的呢?这就要涉及到人脸识别的代码实现。

一、代码概述人脸识别的实现需要借助于计算机视觉技术和机器学习技术,有多种不同的实现方法,其中比较常用的是使用OpenCV库和Python语言进行编程。

本文将以使用OpenCV 和Python编程实现人脸识别为例进行讲解。

OpenCV是一个开源的计算机视觉库,提供了多种图像处理和计算机视觉相关的函数,包括人脸检测、人脸识别、目标跟踪、图像分割等。

Python是一种高级编程语言,易于学习和使用,已经成为了计算机视觉领域最为流行的编程语言之一。

二、代码实现步骤1. 导入所需的库和模块首先需要导入OpenCV库以及一些相关的模块,比如cv2模块、numpy模块等,如下所示:import cv2 import numpy as np2. 人脸检测接下来需要对输入的图像进行人脸检测。

OpenCV提供了多种人脸检测的方法,其中最常用的是基于Haar特征的级联分类器检测方法。

该方法使用训练好的分类器对输入的图像进行扫描,当图像中检测到具有特定特征的区域时,即认为该区域包含人脸。

以下是基于Haar特征的级联分类器人脸检测的代码实现:faceCascade =cv2.CascadeClassifier('haarcascade_frontalface_defa ult.xml') img = cv2.imread('test.jpg') gray =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))其中,faceCascade是已经训练好的级联分类器模型,通过调用detectMultiScale函数可以对输入图像进行人脸检测,scaleFactor控制图像缩放比例,minNeighbors 控制人脸检测的参数,minSize表示人脸检测的最小尺寸。

《2024年基于OpenCV的人脸识别系统设计》范文

《2024年基于OpenCV的人脸识别系统设计》范文

《基于OpenCV的人脸识别系统设计》篇一一、引言随着科技的快速发展,人脸识别技术已经成为现代计算机视觉领域的一个重要研究方向。

人脸识别系统能够自动识别和验证人的身份,广泛应用于安全监控、门禁系统、支付验证等众多领域。

本文将详细介绍基于OpenCV的人脸识别系统的设计。

二、系统需求分析1. 功能需求:人脸检测、人脸特征提取、人脸识别比对等。

2. 性能需求:高识别率、实时响应、系统稳定。

3. 环境需求:操作系统兼容性强,设备要求合理。

三、系统设计概述基于OpenCV的人脸识别系统主要包括预处理、特征提取和匹配三个部分。

通过图像处理和机器学习技术,实现人脸检测和识别的功能。

四、系统架构设计1. 数据预处理模块:主要完成图像的输入、格式转换、尺寸调整等操作,以满足后续处理的需球。

同时对图像进行去噪和锐化处理,提高识别的准确性。

2. 人脸检测模块:利用OpenCV中的人脸检测算法(如Haar 级联分类器或深度学习模型)进行人脸检测,确定图像中的人脸位置。

3. 特征提取模块:通过OpenCV的深度学习模型(如OpenCV DNN模块中的卷积神经网络)提取人脸特征,如面部关键点信息等。

4. 人脸比对模块:将提取的特征与数据库中已有人脸特征进行比对,找出相似度最高的匹配结果。

根据设定的阈值,判断是否为同一人。

五、关键技术实现1. 人脸检测算法:采用OpenCV中的人脸检测算法,如Haar 级联分类器或深度学习模型,实现对图像中人脸的快速定位。

2. 特征提取算法:利用OpenCV的深度学习模型(如OpenCV DNN模块中的卷积神经网络)进行特征提取,包括面部关键点信息等。

3. 人脸比对算法:采用相似度算法(如欧氏距离、余弦相似度等)进行人脸比对,找出相似度最高的匹配结果。

六、系统实现与测试1. 系统实现:根据设计架构,逐步实现各模块功能。

采用C++编程语言,利用OpenCV库进行开发。

2. 系统测试:对系统进行严格的测试,包括功能性测试、性能测试和稳定性测试等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

∙转为灰度和对齐是后面做训练时EigenFaceRecognizer的要求;∙归一化是防止光照带来的影响在上一篇的 2.2 Prehelper.cpp文件中加入函数void resizeandtogray(char* dir,int k, vector<Mat> &images, vector<int> &labels, vector<Mat> &testimages, vector<int> &testlabels);[cpp]view plaincopyprint?1.void resizeandtogray(char* dir,int K, vector<Mat> &images, vector<int> &labels,2. vector<Mat> &testimages, vector<int> &testlabels)3.{4. IplImage* standard = cvLoadImage("D:\\privacy\\picture\\photo\\2.jpg",CV_LOAD_IMAGE_GRAYSCALE);5. string cur_dir;6.char id[5];7.int i,j;8. for(int i=1; i<=K; i++)9. {10. cur_dir = dir;11. cur_dir.append("gray\\");12. _itoa(i,id,10);13. cur_dir.append(id);14. const char* dd = cur_dir.c_str();15. CStatDir statdir;16. if (!statdir.SetInitDir(dd))17. {18. puts("Dir not exist");19. return;20. }21. cout<<"Processing samples in Class "<<i<<endl;22. vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*");23. for (j=0;j<file_vec.size();j++)24. {25. IplImage* cur_img = cvLoadImage(file_vec[j],CV_LOAD_IMAGE_GRAYSCALE);26. cvResize(cur_img,standard,CV_INTER_AREA);27. Mat cur_mat = cvarrToMat(standard,true),des_mat;28. cv::normalize(cur_mat,des_mat,0, 255, NORM_MINMAX, CV_8UC1);29. cvSaveImage(file_vec[j],cvCloneImage(&(IplImage) des_mat));30. if(j!=file_vec.size())31. {32. images.push_back(des_mat);33. labels.push_back(i);34. }35. else36. {37. testimages.push_back(des_mat);38. testlabels.push_back(i);39. }40. }41. cout<<file_vec.size()<<" images."<<endl;42. }43.}并在main中调用:[cpp]view plaincopyprint?1.int main( )2.{3. CvCapture* capture = 0;4. Mat frame, frameCopy, image;5. string inputName;6.int mode;7.8.char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";9. //preprocess_trainingdata(dir,K); //face_detection and extract to file10. vector<Mat> images,testimages;11. vector<int> labels,testlabels;12. resizeandtogray(dir,K,images,labels,testimages,testlabels); //togray,normalize and resize13.14. system("pause");15. return 0;16.}2. 训练有了vector<Mat> images,testimages; vector<int> labels,testlabels; 可以开始训练了,我们采用EigenFaceRecognizer建模。

在Prehelper.cpp中加入函数Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int>labels,vector<Mat> testimages, vector<int> testlabels);[cpp]view plaincopyprint?1.Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int> labels,2. vector<Mat> testimages, vector<int> testlabels)3.{4. Ptr<FaceRecognizer> model = createEigenFaceRecognizer(10);//10 Principal components5. cout<<"train"<<endl;6. model->train(images,labels);7.int i,acc=0,predict_l;8. for (i=0;i<testimages.size();i++)9. {10. predict_l = model->predict(testimages[i]);11. if(predict_l != testlabels[i])12. {13. cout<<"An error in recognition: sample "<<i+1<<", predict "<<14. predict_l<<", groundtruth "<<testlabels[i]<<endl;15. imshow("error 1",testimages[i]);16. waitKey();17. }18. else19. acc++;20. }21. cout<<"Recognition Rate: "<<acc*1.0/testimages.size()<<endl;22. return model;23.}Recognization()输出分错的样本和正确率,最后返回建模结果Ptr<FaceRecognizer> model主函数改为:[cpp]view plaincopyprint?1.int main( )2.{3. CvCapture* capture = 0;4. Mat frame, frameCopy, image;5. string inputName;6.int mode;7.8.char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";9. //preprocess_trainingdata(dir,K); //face_detection and extract to file10. vector<Mat> images,testimages;11. vector<int> labels,testlabels;12. //togray, normalize and resize; load to images,labels,testimages,testlabels13. resizeandtogray(dir,K,images,labels,testimages,testlabels);14. //recognition15. Ptr<FaceRecognizer> model = Recognition(images,labels,testimages,testlabels);16.char* dirmodel = new char [256];17. strcpy(dirmodel,dir); strcat(dirmodel,"model.out");18.FILE* f = fopen(dirmodel,"w");19. fwrite(model,sizeof(model),1,f);20. system("pause");21. return 0;22.}最终结果:一个错分样本,正确率93.3%文章所用代码打包链接:/detail/abcjennifer/7047853关于Computer Vision更多的学习资料将继续更新,敬请关注本博客和新浪微博RachelZhang。

相关文档
最新文档