人脸识别课程设计附带代码

合集下载

人脸识别python课程设计

人脸识别python课程设计

人脸识别python课程设计一、教学目标本节课的知识目标是让学生了解人脸识别的基本概念和技术原理,掌握Python 编程语言的基本操作,能够使用Python编写简单的人脸识别程序。

技能目标是培养学生运用Python语言进行编程的能力,提高学生解决实际问题的能力。

情感态度价值观目标是培养学生对技术的兴趣和好奇心,增强学生对科学探究的热爱,培养学生的创新精神和团队合作意识。

二、教学内容本节课的教学内容主要包括以下几个部分:1. 人脸识别的基本概念和技术原理;2. Python编程语言的基本操作;3. Python人脸识别库的安装和使用;4. 编写简单的人脸识别程序。

三、教学方法本节课采用多种教学方法相结合的方式,以激发学生的学习兴趣和主动性。

主要包括以下几种方法:1. 讲授法:讲解人脸识别的基本概念和技术原理;2. 案例分析法:分析人脸识别的实际应用案例,让学生了解人脸识别技术的应用场景;3. 实验法:让学生动手编写人脸识别程序,培养学生的实际操作能力;4. 讨论法:分组讨论人脸识别程序的编写过程中遇到的问题,培养学生的团队合作意识。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1. 教材:提供《Python编程:从入门到实践》等相关教材,为学生提供学习参考;2. 参考书:提供人脸识别相关的论文和书籍,为学生提供深入学习的资料;3. 多媒体资料:制作PPT、视频等多媒体资料,帮助学生更好地理解人脸识别技术;4. 实验设备:准备计算机、摄像头等实验设备,让学生能够动手实践编写人脸识别程序。

五、教学评估为了全面、客观、公正地评估学生的学习成果,我们将采取以下评估方式:1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和理解程度,占总评的30%。

2.作业:布置相关的人脸识别编程作业,评估学生的编程能力和应用能力,占总评的30%。

3.考试:进行人脸识别编程知识的考试,评估学生的知识掌握程度,占总评的40%。

教你如何用Python实现人脸识别(含源代码)

教你如何用Python实现人脸识别(含源代码)

教你如何⽤Python实现⼈脸识别(含源代码)⼯具与图书馆Python-3.xCV2-4.5.2矮胖-1.20.3⼈脸识别-1.3.0若要安装上述软件包,请使⽤以下命令。

pip install numpy opencv-python要安装FaceRecognition,⾸先安装dlib包。

pip install dlib现在,使⽤以下命令安装⾯部识别模块pip install face_recognition下载⼈脸识别Python代码请下载python⾯部识别项⽬的源代码:项⽬数据集我们可以使⽤我们⾃⼰的数据集来完成这个⼈脸识别项⽬。

对于这个项⽬,让我们以受欢迎的美国⽹络系列“⽼友记”为数据集。

该数据集包含在⾯部识别项⽬代码中,您在上⼀节中下载了该代码。

建⽴⼈脸识别模型的步骤在继续之前,让我们知道什么是⼈脸识别和检测。

⼈脸识别是从照⽚和视频帧中识别或验证⼀个⼈的脸的过程。

⼈脸检测是指在图像中定位和提取⼈脸(位置和⼤⼩)以供⼈脸检测算法使⽤的过程。

⼈脸识别⽅法⽤于定位图像中唯⼀指定的特征。

在⼤多数情况下,⾯部图⽚已经被移除、裁剪、缩放和转换为灰度。

⼈脸识别包括三个步骤:⼈脸检测、特征提取、⼈脸识别。

OpenCV是⼀个⽤C++编写的开源库.它包含了⽤于计算机视觉任务的各种算法和深度神经⽹络的实现。

1.准备数据集创建2个⽬录,训练和测试。

从互联⽹上为每个演员选择⼀个图⽚,并下载到我们的“⽕车”⽬录中。

确保您所选择的图像能够很好地显⽰⼈脸的特征,以便对分类器进⾏分类。

为了测试模型,让我们拍摄⼀张包含所有强制转换的图⽚,并将其放到我们的“test”⽬录中。

为了您的舒适,我们增加了培训和测试数据与项⽬代码。

2.模型的训练⾸先导⼊必要的模块。

import face_recognition as frimport cv2import numpy as npimport os⼈脸识别库包含帮助⼈脸识别过程的各种实⽤程序的实现。

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版本号。

人脸识别程序源代码

人脸识别程序源代码

1.利用OpenCV进行人脸检测
人脸检测程序主要完成3部分功能,即加载分类器、加载待检测图象以及检测并标示;本程序使用OpenCV中提供的“haarcascade_frontalface_alt.xml”文件存储的目标检测分类,用cvLoad函数载入后,进行强制类型转换;OpenCV中提供的用于检测图像中目标的函数是cvHaarDetectObjects,该函数使用指针对某目标物体如人脸训练的级联分类器在图象中找到包含目标物体的矩形区域,并将这些区域作为一序列的矩形框返回;分类器在使用后需要被显式释放,所用的函数为cvReleaseHaarCla ssifierCascade;这些函数原型请参看有关OpenCV手册;
2.程序实现
1新建一个VisualC++MFC项目,取名为“FaceDetection”,选择应用程序类型为“单文档”;将菜单中多余的项去掉,并添加一项“人脸检测”,其ID为“ID_FaceDe tected”,并生成该菜单项的消息映射函数;
2在“FaceDetectionView.h”头文件中添加以下灰底色部分程序代码:
3在“FaceDetectionView.cpp”文件中添加以下灰底色部分程序代码:
需要注意的是,本程序运行时应将分类器文件置于程序目录下,如果运行的是生成的EXE文件,则应将分类器文件与该EXE文件放在同一个目录下;
三、程序运行结果
运行该程序,选择人脸检测菜单项,弹出文件打开对话框,选择要检测的图像文件,程序就会将检测到的人脸用圆圈标示出来,如图3所示;本程序能顺利检测出大部分人脸,但由于光照、遮挡和倾斜等原因,部分人脸不能正确检测,另外,也有一些非人脸部分由于具有人脸的某些特征,也被当成了人脸,这些都是本程序需要改进的部分;。

人脸识别MATLAB代码

人脸识别MATLAB代码

人脸识别MATLAB代码第一篇:人脸识别MATLAB代码1.色彩空间转换function[r,g]=rgb_RGB(Ori_Face)R=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_ Face(:,:,3);R1=im2double(R);% 将uint8型转换成double型G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;row=size(Ori_Face,1);% 行像素 column=size(Ori_Face,2);% 列像素 for i=1:row for j=1:columnrr(i,j)=R1(i,j)/RGB(i,j);gg(i,j)=G1(i,j)/RGB(i,j);end end rrr=mean(rr);r=mean(rrr);ggg=mean(gg);g=mean(ggg);2.均值和协方差t1=imread('D:matlab皮肤库1.jpg');[r1,g1]=rgb_RGB(t1);t2=imread('D:matlab皮肤库2.jpg');[r2,g2]=rgb_RGB(t2);t3=imread('D:matlab皮肤库3.jpg');[r3,g3]=rgb_RGB(t3);t4=imread('D:matlab皮肤库4.jpg');[r4,g4]=rgb_RGB(t4);t5=imread('D:matlab皮肤库5.jpg');[r5,g5]=rgb_RGB(t5);t6=imread('D:matlab皮肤库6.jpg');[r6,g6]=rgb_RGB(t6);t7=imread('D:matlab皮肤库7.jpg');[r7,g7]=rgb_RGB(t7);t8=imread('D:matlab皮肤库8.jpg');[r8,g8]=rgb_RGB(t8);t9=imread('D:matlab皮肤库9.jpg');[r9,g9]=rgb_RGB(t9);t10=imread('D:matlab皮肤库10.jpg');[r10,g10]=rgb_RGB(t10);t11=imread('D:matlab皮肤库11.jpg');[r11,g11]=rgb_RGB(t11);t12=imread('D:matlab皮肤库12.jpg');[r12,g12]=rgb_RGB(t12);t13=imread('D:matlab皮肤库13.jpg');[r13,g13]=rgb_RGB(t13);t14=imread('D:matlab皮肤库14.jpg');[r14,g14]=rgb_RGB(t14);t15=imread('D:matlab皮肤库15.jpg');[r15,g15]=rgb_RGB(t15);t16=imread('D:matlab皮肤库16.jpg');[r16,g16]=rgb_RGB(t16);t17=imread('D:matlab皮肤库17.jpg');[r17,g17]=rgb_RGB(t17);t18=imread('D:matlab皮肤库18.jpg');[r18,g18]=rgb_RGB(t18);t19=imread('D:matlab皮肤库19.jpg');[r19,g19]=rgb_RGB(t19);t20=imread('D:matlab皮肤库20.jpg');[r20,g20]=rgb_RGB(t20);t21=imread('D:matlab皮肤库21.jpg');[r21,g21]=rgb_RGB(t21);t22=imread('D:matlab皮肤库22.jpg');[r22,g22]=rgb_RGB(t22);t23=imread('D:matlab皮肤库23.jpg');[r23,g23]=rgb_RGB(t23);t24=imread('D:matlab皮肤库24.jpg');[r24,g24]=rgb_RGB(t24);t25=imread('D:matlab皮肤库25.jpg');[r25,g25]=rgb_RGB(t25);t26=imread('D:matlab皮肤库26.jpg');[r26,g26]=rgb_RGB(t26);t27=imread('D:matlab皮肤库27.jpg');[r27,g27]=rgb_RGB(t27);r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17 ,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27);g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g1 5,g16,g17,g18,g19,g20,g21,g22,g23,g24,g25,g26,g27);m=mean( [r,g])n=cov([r,g])3.求质心function [xmean, ymean] = center(bw)bw=bwfill(bw,'holes');area = bwarea(bw);[m n] =size(bw);bw=double(bw);xmean =0;ymean = 0;for i=1:m, for j=1:n,xmean = xmean + j*bw(i,j);ymean = ymean + i*bw(i,j);end;end;if(area==0)xmean=0;ymean=0;elsexmean = xmean/area;ymean = ymean/area;xmean = round(xmean);ymean = round(ymean);end4.求偏转角度function [theta] = orient(bw,xmean,ymean)[m n] =size(bw);bw=double(bw);a = 0;b = 0;c = 0;for i=1:m, for j=1:n,a = a +(jxmean)*(iymean)^2 * bw(i,j);end;end;b = 2 * b;theta = atan(b/(a-c))/2;theta = theta*(180/pi);% 从幅度转换到角度 5.找区域边界function [left, right, up, down] = bianjie(A)[m n] = size(A);left =-1;right =-1;up =-1;down =-1;for j=1:n,for i=1:m,if(A(i,j)~= 0) left = j;break;end;end;if(left ~=-1)break;end;end;for j=n:-1:1, for i=1:m, if(A(i,j)~= 0)right = j;break;end;end;if(right ~=-1)break;end;end;for i=1:m, for j=1:n,if(A(i,j)~= 0) up = i;break;end;end;if(up ~=-1)break;end;end;for i=m:-1:1,for j=1:n,if(A(i,j)~= 0)down = i;break;end;end;if(down ~=-1)break;end;end;6.求起始坐标function newcoord = checklimit(coord,maxval)newcoord = coord;if(newcoord<1)newcoord=1;end;if(newcoord>maxval)newcoord=maxval;end;7.模板匹配function [ccorr, mfit, RectCoord] = mobanpipei(mult, frontalmodel,ly,wx,cx, cy, angle)frontalmodel=rgb2gray(frontalmodel);model_rot = imresize(frontalmodel,[ly wx],'bilinear');% 调整模板大小 model_rot = imrotate(model_rot,angle,'bilinear');% 旋转模板 [l,r,u,d] = bianjie(model_rot);% 求边界坐标 bwmodel_rot=imcrop(model_rot,[l u(r-l)(d-u)]);% 选择模板人脸区域 [modx,mody] =center(bwmodel_rot);% 求质心 [morig, norig] = size(bwmodel_rot);% 产生一个覆盖了人脸模板的灰度图像mfit = zeros(size(mult));mfitbw = zeros(size(mult));[limy, limx] = size(mfit);% 计算原图像中人脸模板的坐标 startx = cx-modx;starty = cy-mody;endx = startx + norig-1;endy = starty + morig-1;startx = checklimit(startx,limx);starty = checklimit(starty,limy);endx = checklimit(endx,limx);endy = checklimit(endy,limy);for i=starty:endy, for j=startx:endx,mfit(i,j)= model_rot(i-starty+1,j-startx+1);end;end;ccorr = corr2(mfit,mult)% 计算相关度 [l,r,u,d] = bianjie(bwmodel_rot);sx = startx+l;sy = starty+u;RectCoord = [sx sy(r-1)(d-u)];% 产生矩形坐标 8.主程序 clear;[fname,pname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.gif'},'Please choose a color picture...');% 返回打开的图片名与图片路径名 [u,v]=size(fname);y=fname(v);% 图片格式代表值switch ycase 0errordlg('You Should Load Image File First...','Warning...');case{'g';'G';'p';'P';'f';'F'};% 图片格式若是JPG/jpg、BMP/bmp、TIF/tif或者GIF/gif,才打开I=cat(2,pname,fname);Ori_Face=imread(I);subplot(2,3,1),imshow(Ori_Face);otherwiseerrordlg('You Should Load Image File First...','Warning...');end R=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R);% 将uint8型转换成double型处理G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;m=[ 0.4144,0.3174];% 均值 n=[0.0031,-0.0004;-0.0004,0.0003];% 方差 row=size(Ori_Face,1);% 行像素数 column=size(Ori_Face,2);% 列像素数 for i=1:rowfor j=1:columnif RGB(i,j)==0rr(i,j)=0;gg(i,j)=0;elserr(i,j)=R1(i,j)/RGB(i,j);gg(i,j)=G1(i,j)/RGB(i,j);x=[rr(i,j),gg(i,j)];p(i,j)=exp((-0.5)*(x-m)*inv(n)*(x-m)');endend endsubplot(2,3,2);imshow(p);low_pass=1/9*ones(3);image_low=filter2(low_pass, p);subplot(2,3,3);imshow(image_low);% 自适应阀值程序previousSkin2 = zeros(i,j);changelist = [];for threshold = 0.55:-0.1:0.05 two_value = zeros(i,j);two_value(find(image_low>threshold))= 1;change = sum(sum(two_valuel +1);% 宽度 ly =(d-u + 1);% 高度 wratio = ly/wx% 高宽比if((0.8<=wratio)&(wratio<=2))% 如果目标区域的高度/宽度比例大于0.8且小于2.0,则将其选出进行下一步运算S=ly*wx;% 计算包含此区域矩形的面积A=bwarea(bwsegment);% 计算此区域面积if(A/S>0.35)[ccorr,mfit, RectCoord] = mobanpipei(justface,frontalmodel,ly,wx, cx,cy, angle);endif(ccorr>=0.6)mfitbw=(mfit>=1);invbw = xor(mfitbw,ones(size(mfitbw)));source_with_hole = uint8(double(invbw).*double(imsourcegray));final_image = uint8(double(source_with_hole)+ double(mfit));subplot(2,3,5);imshow(final_image);% 显示覆盖了模板脸的灰度图像imsourcegray = final_image;subplot(2,3,6);imshow(Ori_Face);% 显示检测效果图end;if(RectCoord ~=-1)FaceCoord = [FaceCoord;RectCoord];endend end end% 在认为是人脸的区域画矩形[numfaces x] = size(FaceCoord);for i=1:numfaces,hd = rectangle('Position',FaceCoord(i,:));set(hd, 'edgecolor', 'y');end 人脸检测是人脸识别、人机交互、智能视觉监控等工作的前提。

python人脸识别系统课程设计

python人脸识别系统课程设计

python人脸识别系统课程设计一、课程目标知识目标:1. 学生能理解人脸识别的基本原理,掌握Python编程中与人脸识别相关的库(如OpenCV、face_recognition)的使用方法。

2. 学生能描述人脸检测、人脸识别的技术流程,了解影响识别准确率的因素。

3. 学生掌握数据集的收集、处理和模型训练的基本步骤。

技能目标:1. 学生能够独立编写简单的Python人脸识别程序,实现人脸检测、人脸识别等功能。

2. 学生能够通过调整算法参数,优化人脸识别效果,提高识别准确率。

3. 学生具备分析人脸识别结果,发现并解决问题的能力。

情感态度价值观目标:1. 学生通过学习人脸识别技术,增强对人工智能领域的兴趣和认识,激发创新意识。

2. 学生在项目实践过程中,培养团队协作精神,学会分享和交流。

3. 学生了解人脸识别技术在现实生活中的应用,认识到技术对社会的影响,树立正确的科技伦理观。

本课程针对高中年级学生,结合Python编程和人脸识别技术,注重理论与实践相结合,旨在提高学生的编程能力、数据处理能力和实际问题解决能力。

通过课程学习,使学生能够在掌握基本知识技能的基础上,深入体验人工智能的魅力,培养对科技的兴趣和热情。

同时,注重培养学生的团队协作精神和科技伦理观念,为学生的全面发展奠定基础。

二、教学内容1. Python基础回顾:变量、数据类型、运算符、条件语句和循环语句。

2. OpenCV和face_recognition库的安装与使用:介绍库的功能,演示基本的图像处理和人脸识别操作。

- OpenCV库:图像读取、显示、保存;颜色空间转换;图像滤波;边缘检测;人脸检测。

- face_recognition库:人脸编码生成;人脸匹配;人脸识别。

3. 人脸识别原理与流程:介绍特征提取、模型训练、人脸匹配等关键步骤。

4. 数据集准备:收集人脸图片,构建训练集和测试集;数据预处理。

5. 编程实践:- 人脸检测:使用OpenCV实现实时人脸检测。

(完整版)人脸识别MATLAB代码

(完整版)人脸识别MATLAB代码

1.色彩空间转换function [r,g]=rgb_RGB(Ori_Face)R=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R); % 将uint8型转换成double型G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;row=size(Ori_Face,1); % 行像素column=size(Ori_Face,2); % 列像素for i=1:rowfor j=1:columnrr(i,j)=R1(i,j)/RGB(i,j);gg(i,j)=G1(i,j)/RGB(i,j);endendrrr=mean(rr);r=mean(rrr);ggg=mean(gg);g=mean(ggg);2.均值和协方差t1=imread('D:\matlab\皮肤库\1.jpg');[r1,g1]=rgb_RGB(t1); t2=imread('D:\matlab\皮肤库\2.jpg');[r2,g2]=rgb_RGB(t2); t3=imread('D:\matlab\皮肤库\3.jpg');[r3,g3]=rgb_RGB(t3); t4=imread('D:\matlab\皮肤库\4.jpg');[r4,g4]=rgb_RGB(t4); t5=imread('D:\matlab\皮肤库\5.jpg');[r5,g5]=rgb_RGB(t5); t6=imread('D:\matlab\皮肤库\6.jpg');[r6,g6]=rgb_RGB(t6); t7=imread('D:\matlab\皮肤库\7.jpg');[r7,g7]=rgb_RGB(t7); t8=imread('D:\matlab\皮肤库\8.jpg');[r8,g8]=rgb_RGB(t8);t9=imread('D:\matlab\皮肤库\9.jpg');[r9,g9]=rgb_RGB(t9);t10=imread('D:\matlab\皮肤库\10.jpg');[r10,g10]=rgb_RGB(t10);t11=imread('D:\matlab\皮肤库\11.jpg');[r11,g11]=rgb_RGB(t11);t12=imread('D:\matlab\皮肤库\12.jpg');[r12,g12]=rgb_RGB(t12);t13=imread('D:\matlab\皮肤库\13.jpg');[r13,g13]=rgb_RGB(t13);t14=imread('D:\matlab\皮肤库\14.jpg');[r14,g14]=rgb_RGB(t14);t15=imread('D:\matlab\皮肤库\15.jpg');[r15,g15]=rgb_RGB(t15);t16=imread('D:\matlab\皮肤库\16.jpg');[r16,g16]=rgb_RGB(t16);t17=imread('D:\matlab\皮肤库\17.jpg');[r17,g17]=rgb_RGB(t17);t18=imread('D:\matlab\皮肤库\18.jpg');[r18,g18]=rgb_RGB(t18);t19=imread('D:\matlab\皮肤库\19.jpg');[r19,g19]=rgb_RGB(t19);t20=imread('D:\matlab\皮肤库\20.jpg');[r20,g20]=rgb_RGB(t20);t21=imread('D:\matlab\皮肤库\21.jpg');[r21,g21]=rgb_RGB(t21);t22=imread('D:\matlab\皮肤库\22.jpg');[r22,g22]=rgb_RGB(t22);t23=imread('D:\matlab\皮肤库\23.jpg');[r23,g23]=rgb_RGB(t23);t24=imread('D:\matlab\皮肤库\24.jpg');[r24,g24]=rgb_RGB(t24);t25=imread('D:\matlab\皮肤库\25.jpg');[r25,g25]=rgb_RGB(t25);t26=imread('D:\matlab\皮肤库\26.jpg');[r26,g26]=rgb_RGB(t26);t27=imread('D:\matlab\皮肤库\27.jpg');[r27,g27]=rgb_RGB(t27);r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22, r23,r24,r25,r26,r27);g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20 ,g21,g22,g23,g24,g25,g26,g27);m=mean([r,g])n=cov([r,g])3.求质心function [xmean, ymean] = center(bw)bw=bwfill(bw,'holes');area = bwarea(bw);[m n] =size(bw);bw=double(bw);xmean =0; ymean = 0;for i=1:m,for j=1:n,xmean = xmean + j*bw(i,j);ymean = ymean + i*bw(i,j);end;end;if(area==0)xmean=0;ymean=0;elsexmean = xmean/area;ymean = ymean/area;xmean = round(xmean);ymean = round(ymean);end4. 求偏转角度function [theta] = orient(bw,xmean,ymean) [m n] =size(bw);bw=double(bw);a = 0;b = 0;c = 0;for i=1:m,for j=1:n,a = a + (j - xmean)^2 * bw(i,j);b = b + (j - xmean) * (i - ymean) * bw(i,j);c = c + (i - ymean)^2 * bw(i,j);end;b = 2 * b;theta = atan(b/(a-c))/2;theta = theta*(180/pi); % 从幅度转换到角度5. 找区域边界function [left, right, up, down] = bianjie(A)[m n] = size(A);left = -1;right = -1;up = -1;down = -1;for j=1:n,for i=1:m,if (A(i,j) ~= 0)left = j;break;end;end;if (left ~= -1) break;end;end;for j=n:-1:1,for i=1:m,if (A(i,j) ~= 0)right = j;break;end;end;if (right ~= -1) break;end;for i=1:m,for j=1:n,if (A(i,j) ~= 0)up = i;break;end;end;if (up ~= -1)break;end;end;for i=m:-1:1,for j=1:n,if (A(i,j) ~= 0)down = i;break;end;end;if (down ~= -1)break;end;end;6. 求起始坐标function newcoord = checklimit(coord,maxval) newcoord = coord;if (newcoord<1)newcoord=1;end;if (newcoord>maxval)newcoord=maxval;end;7.模板匹配function [ccorr, mfit, RectCoord] = mobanpipei(mult, frontalmodel,ly,wx,cx, cy, angle)frontalmodel=rgb2gray(frontalmodel);model_rot = imresize(frontalmodel,[ly wx],'bilinear'); % 调整模板大小model_rot = imrotate(model_rot,angle,'bilinear'); % 旋转模板[l,r,u,d] = bianjie(model_rot); % 求边界坐标bwmodel_rot=imcrop(model_rot,[l u (r-l) (d-u)]); % 选择模板人脸区域[modx,mody] =center(bwmodel_rot); % 求质心[morig, norig] = size(bwmodel_rot);% 产生一个覆盖了人脸模板的灰度图像mfit = zeros(size(mult));mfitbw = zeros(size(mult));[limy, limx] = size(mfit);% 计算原图像中人脸模板的坐标startx = cx-modx;starty = cy-mody;endx = startx + norig-1;endy = starty + morig-1;startx = checklimit(startx,limx);starty = checklimit(starty,limy);endx = checklimit(endx,limx);endy = checklimit(endy,limy);for i=starty:endy,for j=startx:endx,mfit(i,j) = model_rot(i-starty+1,j-startx+1);end;end;ccorr = corr2(mfit,mult) % 计算相关度[l,r,u,d] = bianjie(bwmodel_rot);sx = startx+l;sy = starty+u;RectCoord = [sx sy (r-1) (d-u)]; % 产生矩形坐标8.主程序clear;[fname,pname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.gif'},'Please choose a color picture...'); % 返回打开的图片名与图片路径名[u,v]=size(fname);y=fname(v); % 图片格式代表值switch ycase 0errordlg('You Should Load Image File First...','Warning...');case{'g';'G';'p';'P';'f';'F'}; % 图片格式若是JPG/jpg、BMP/bmp、TIF/tif 或者GIF/gif,才打开I=cat(2,pname,fname);Ori_Face=imread(I);subplot(2,3,1),imshow(Ori_Face);otherwiseerrordlg('You Should Load Image File First...','Warning...');endR=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R); % 将uint8型转换成double型处理G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;m=[ 0.4144,0.3174]; % 均值n=[0.0031,-0.0004;-0.0004,0.0003]; % 方差row=size(Ori_Face,1); % 行像素数column=size(Ori_Face,2); % 列像素数for i=1:rowfor j=1:columnif RGB(i,j)==0rr(i,j)=0;gg(i,j)=0;elserr(i,j)=R1(i,j)/RGB(i,j); % rgb归一化gg(i,j)=G1(i,j)/RGB(i,j);x=[rr(i,j),gg(i,j)];p(i,j)=exp((-0.5)*(x-m)*inv(n)*(x-m)'); % 皮肤概率服从高斯分布endendendsubplot(2,3,2);imshow(p); % 显示皮肤灰度图像low_pass=1/9*ones(3);image_low=filter2(low_pass, p); % 低通滤波去噪声subplot(2,3,3);imshow(image_low);% 自适应阀值程序previousSkin2 = zeros(i,j);changelist = [];for threshold = 0.55:-0.1:0.05two_value = zeros(i,j);two_value(find(image_low>threshold)) = 1;change = sum(sum(two_value - previousSkin2));changelist = [changelist change];previousSkin2 = two_value;end[C, I] = min(changelist);optimalThreshold = (7-I)*0.1two_value = zeros(i,j);two_value(find(image_low>optimalThreshold)) = 1; % 二值化subplot(2,3,4);imshow(two_value); % 显示二值图像frontalmodel=imread('E:\我的照片\人脸模板.jpg'); % 读入人脸模板照片FaceCoord=[];imsourcegray=rgb2gray(Ori_Face); % 将原照片转换为灰度图像[L,N]=bwlabel(two_value,8); % 标注二值图像中连接的部分,L为数据矩阵,N为颗粒的个数for i=1:N,[x,y]=find(bwlabel(two_value)==i); % 寻找矩阵中标号为i的行和列的下标bwsegment = bwselect(two_value,y,x,8); % 选择出第i个颗粒numholes = 1-bweuler(bwsegment,4); % 计算此区域的空洞数if (numholes >= 1) % 若此区域至少包含一个洞,则将其选出进行下一步运算RectCoord = -1;[m n] = size(bwsegment);[cx,cy]=center(bwsegment); % 求此区域的质心bwnohole=bwfill(bwsegment,'holes'); % 将洞封住(将灰度值赋为1)justface = uint8(double(bwnohole) .* double(imsourcegray));% 只在原照片的灰度图像中保留该候选区域angle = orient(bwsegment,cx,cy); % 求此区域的偏转角度bw = imrotate(bwsegment, angle, 'bilinear');bw = bwfill(bw,'holes');[l,r,u,d] =bianjie(bw);wx = (r - l +1); % 宽度ly = (d - u + 1); % 高度wratio = ly/wx % 高宽比if ((0.8<=wratio)&(wratio<=2))% 如果目标区域的高度/宽度比例大于0.8且小于2.0,则将其选出进行下一步运算S=ly*wx; % 计算包含此区域矩形的面积A=bwarea(bwsegment); % 计算此区域面积if (A/S>0.35)[ccorr,mfit, RectCoord] = mobanpipei(justface,frontalmodel,ly,wx, cx,cy, angle);endif (ccorr>=0.6)mfitbw=(mfit>=1);invbw = xor(mfitbw,ones(size(mfitbw)));source_with_hole = uint8(double(invbw) .* double(imsourcegray));final_image = uint8(double(source_with_hole) + double(mfit));subplot(2,3,5);imshow(final_image); % 显示覆盖了模板脸的灰度图像imsourcegray = final_image;subplot(2,3,6);imshow(Ori_Face); % 显示检测效果图end;if (RectCoord ~= -1)FaceCoord = [FaceCoord; RectCoord];endendendend% 在认为是人脸的区域画矩形[numfaces x] = size(FaceCoord);for i=1:numfaces,hd = rectangle('Position',FaceCoord(i,:));set(hd, 'edgecolor', 'y');end人脸检测是人脸识别、人机交互、智能视觉监控等工作的前提。

人脸识别实验报告模板(3篇)

人脸识别实验报告模板(3篇)

第1篇一、实验目的1. 了解人脸识别的基本原理和流程。

2. 掌握人脸识别算法的实现和应用。

3. 分析不同人脸识别算法的性能和优缺点。

4. 评估人脸识别技术在实际应用中的可行性和效果。

二、实验环境1. 操作系统:Windows 10/Ubuntu 18.042. 编程语言:Python3. 开发工具:PyCharm/VS Code4. 库:OpenCV、dlib、TensorFlow、Keras等5. 硬件要求:CPU:Intel Core i5以上;内存:8GB以上三、实验内容1. 人脸检测2. 特征提取3. 人脸识别4. 性能评估四、实验步骤1. 人脸检测- 使用OpenCV或dlib库实现人脸检测功能。

- 预处理输入图像,如灰度化、缩放、裁剪等。

- 运用人脸检测算法(如Haar cascades、SSD、MTCNN等)进行人脸定位。

- 输出检测到的人脸位置信息。

2. 特征提取- 使用深度学习或传统方法提取人脸特征。

- 深度学习方法:使用卷积神经网络(CNN)提取人脸特征,如VGG、ResNet 等。

- 传统方法:使用LBP、HOG、PCA等算法提取人脸特征。

- 将提取到的特征进行归一化处理。

3. 人脸识别- 使用训练好的模型进行人脸识别。

- 将提取到的人脸特征与数据库中的特征进行比对。

- 根据比对结果判断是否为同一个人。

4. 性能评估- 使用测试集评估人脸识别算法的性能。

- 计算识别准确率、召回率、F1值等指标。

- 分析不同算法的性能和优缺点。

五、实验结果与分析1. 人脸检测- 比较不同人脸检测算法的检测速度和准确率。

- 分析算法在不同光照、姿态、表情等条件下的表现。

2. 特征提取- 比较不同特征提取方法的提取效果。

- 分析特征提取对识别性能的影响。

3. 人脸识别- 计算识别准确率、召回率、F1值等指标。

- 分析不同算法的识别性能。

1. 总结实验过程中遇到的问题和解决方法。

2. 分析实验结果,得出实验结论。

人脸识别代码

人脸识别代码
//若faces==0(即没检测到人脸),则不执行循环;若faces==1,则执行循环的次数等于检测到的人脸个数
//标记人脸
for(int i=0;i<(objects? objects->total:0);++i)
{
CvRect* r=(CvRect*)cvGetSeqElem(objects,i);//取出脸
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);
//把small_img灰度图像直方图均衡化,结果保存在small_img中,目的是归一化图Fra bibliotek亮度和增强对比度
cvEqualizeHist(small_img,small_img); //直方图均
//Detect objects if any
//清空一块内存区域等待使用
cvRectangle(img, cvPoint(r->x*scale,r->y*scale), cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale), colors[i%8]);
}
for( int i = 0; i < (objects? objects->total : 0); i++ )

基于 MATLAB 人脸识别系统的设计与实现代码大全

基于 MATLAB 人脸识别系统的设计与实现代码大全

基于MATLAB人脸识别系统的设计与实现1.1题目的主要研究内容(宋体四号加粗左对齐)(1)对于一幅图像可以看作一个由像素值组成的矩阵,也可以扩展开,看成一个矢量。

如一幅N*N象素的图像可以视为长度为N2的矢量,这样就认为这幅图像是位于N2维空间中的一个点,这种图像的矢量表示就是原始的图像空间,但是这个空间仅是可以表示或者检测图像的许多个空间中的一个。

不管子空间的具体形式如何,这种方法用于图像识别的基本思想都是一样的,首先选择一个合适的子空间,图像将被投影到这个子空间上,然后利用对图像的这种投影间的某种度量来确定图像间的相似度,最常见的就是各种距离度量。

因此,本次采用PCA 算法确定一个子空间,最后使用最小距离法进行识别,并用matlab实现。

(2)系统流程图1.2题目研究的工作基础或实验条件(1)给出所需图像,软件实现中已知程序代码的设计和算法应用。

(2)软件环境(开发工具用MATLAB)。

1.3数据集描述计算数据库中每张图片在子空间中的坐标,得到一组坐标,作为下一步识别匹配的搜索空间。

计算新输入图片在子空间中的坐标,采用最小距离法,遍历搜索空间,得到与其距离最小的坐标向量,该向量对应的人脸图像即为识别匹配的结果。

假设一幅人脸图像包含N个像素点,它可以用一个N维向量Γ表示。

这样,训练样本库就可以用Γi(i=1,...,M)表示。

协方差矩阵C的正交特征向量就是组成人脸空间的基向量,即特征脸。

将特征值由大到小排列:λ1≥λ2≥...≥λr,其对应的特征向量为μk。

这样每一幅人脸图像都可以投影到由u1,u2,...,ur张成的子空间中。

因此,每一幅人脸图像对应于子空间中的一点。

同样,子空间的任意一点也对应于一幅图像。

1.4特征提取过程描述通过人脸特征点的检测与标定可以确定人脸图像中显著特征点的位置(如眼睛、眉毛、鼻子、嘴巴等器官),同时还可以得到这些器官及其面部轮廓的形状信息的描述。

根据人脸特征点检测与标定的结果,通过某些运算得到人脸特征的描述(这些特征包括:全局特征和局部特征,显式特征和统计特征等)。

人脸识别MATLAB代码

人脸识别MATLAB代码

1.色彩空间转换function [r,g]=rgb_RGB(Ori_Face)R=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R); % 将uint8型转换成double型G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;row=size(Ori_Face,1); % 行像素column=size(Ori_Face,2); % 列像素for i=1:rowfor j=1:columnrr(i,j)=R1(i,j)/RGB(i,j);gg(i,j)=G1(i,j)/RGB(i,j);endendrrr=mean(rr);r=mean(rrr);ggg=mean(gg);g=mean(ggg);2.均值和协方差t1=imread('D:\matlab\皮肤库\1.jpg');[r1,g1]=rgb_RGB(t1); t2=imread('D:\matlab\皮肤库\2.jpg');[r2,g2]=rgb_RGB(t2); t3=imread('D:\matlab\皮肤库\3.jpg');[r3,g3]=rgb_RGB(t3); t4=imread('D:\matlab\皮肤库\4.jpg');[r4,g4]=rgb_RGB(t4); t5=imread('D:\matlab\皮肤库\5.jpg');[r5,g5]=rgb_RGB(t5); t6=imread('D:\matlab\皮肤库\6.jpg');[r6,g6]=rgb_RGB(t6); t7=imread('D:\matlab\皮肤库\7.jpg');[r7,g7]=rgb_RGB(t7); t8=imread('D:\matlab\皮肤库\8.jpg');[r8,g8]=rgb_RGB(t8);-t9=imread('D:\matlab\皮肤库\9.jpg');[r9,g9]=rgb_RGB(t9);t10=imread('D:\matlab\皮肤库\10.jpg');[r10,g10]=rgb_RGB(t10);t11=imread('D:\matlab\皮肤库\11.jpg');[r11,g11]=rgb_RGB(t11);t12=imread('D:\matlab\皮肤库\12.jpg');[r12,g12]=rgb_RGB(t12);t13=imread('D:\matlab\皮肤库\13.jpg');[r13,g13]=rgb_RGB(t13);t14=imread('D:\matlab\皮肤库\14.jpg');[r14,g14]=rgb_RGB(t14);t15=imread('D:\matlab\皮肤库\15.jpg');[r15,g15]=rgb_RGB(t15);t16=imread('D:\matlab\皮肤库\16.jpg');[r16,g16]=rgb_RGB(t16);t17=imread('D:\matlab\皮肤库\17.jpg');[r17,g17]=rgb_RGB(t17);t18=imread('D:\matlab\皮肤库\18.jpg');[r18,g18]=rgb_RGB(t18);t19=imread('D:\matlab\皮肤库\19.jpg');[r19,g19]=rgb_RGB(t19);t20=imread('D:\matlab\皮肤库\20.jpg');[r20,g20]=rgb_RGB(t20);t21=imread('D:\matlab\皮肤库\21.jpg');[r21,g21]=rgb_RGB(t21);t22=imread('D:\matlab\皮肤库\22.jpg');[r22,g22]=rgb_RGB(t22);t23=imread('D:\matlab\皮肤库\23.jpg');[r23,g23]=rgb_RGB(t23);t24=imread('D:\matlab\皮肤库\24.jpg');[r24,g24]=rgb_RGB(t24);t25=imread('D:\matlab\皮肤库\25.jpg');[r25,g25]=rgb_RGB(t25);t26=imread('D:\matlab\皮肤库\26.jpg');[r26,g26]=rgb_RGB(t26);t27=imread('D:\matlab\皮肤库\27.jpg');[r27,g27]=rgb_RGB(t27);r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22, r23,r24,r25,r26,r27);g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20 ,g21,g22,g23,g24,g25,g26,g27);m=mean([r,g])n=cov([r,g])3.求质心function [xmean, ymean] = center(bw)bw=bwfill(bw,'holes');area = bwarea(bw);-[m n] =size(bw);bw=double(bw);xmean =0; ymean = 0;for i=1:m,for j=1:n,xmean = xmean + j*bw(i,j);ymean = ymean + i*bw(i,j);end;end;if(area==0)xmean=0;ymean=0;elsexmean = xmean/area;ymean = ymean/area;xmean = round(xmean);ymean = round(ymean);end4. 求偏转角度function [theta] = orient(bw,xmean,ymean)[m n] =size(bw);bw=double(bw);a = 0;b = 0;c = 0;for i=1:m,for j=1:n,a = a + (j - xmean)^2 * bw(i,j);b = b + (j - xmean) * (i - ymean) * bw(i,j);c = c + (i - ymean)^2 * bw(i,j);-end;end;b = 2 * b;theta = atan(b/(a-c))/2;theta = theta*(180/pi); % 从幅度转换到角度5. 找区域边界function [left, right, up, down] = bianjie(A)[m n] = size(A);left = -1;right = -1;up = -1;down = -1;for j=1:n,for i=1:m,if (A(i,j) ~= 0)left = j;break;end;end;if (left ~= -1) break;end;end;for j=n:-1:1,for i=1:m,if (A(i,j) ~= 0)right = j;break;end;end;if (right ~= -1) break;end;-end;for i=1:m,for j=1:n,if (A(i,j) ~= 0)up = i;break;end;end;if (up ~= -1)break;end;end;for i=m:-1:1,for j=1:n,if (A(i,j) ~= 0)down = i;break;end;end;if (down ~= -1)break;end;end;6. 求起始坐标function newcoord = checklimit(coord,maxval)newcoord = coord;if (newcoord<1)newcoord=1;end;-if (newcoord>maxval)newcoord=maxval;end;7.模板匹配function [ccorr, mfit, RectCoord] = mobanpipei(mult, frontalmodel,ly,wx,cx, cy, angle)frontalmodel=rgb2gray(frontalmodel);model_rot = imresize(frontalmodel,[ly wx],'bilinear'); % 调整模板大小model_rot = imrotate(model_rot,angle,'bilinear'); % 旋转模板[l,r,u,d] = bianjie(model_rot); % 求边界坐标bwmodel_rot=imcrop(model_rot,[l u (r-l) (d-u)]); % 选择模板人脸区域[modx,mody] =center(bwmodel_rot); % 求质心[morig, norig] = size(bwmodel_rot);% 产生一个覆盖了人脸模板的灰度图像mfit = zeros(size(mult));mfitbw = zeros(size(mult));[limy, limx] = size(mfit);% 计算原图像中人脸模板的坐标startx = cx-modx;starty = cy-mody;endx = startx + norig-1;endy = starty + morig-1;startx = checklimit(startx,limx);starty = checklimit(starty,limy);endx = checklimit(endx,limx);endy = checklimit(endy,limy);for i=starty:endy,for j=startx:endx,mfit(i,j) = model_rot(i-starty+1,j-startx+1);end;end;ccorr = corr2(mfit,mult) % 计算相关度[l,r,u,d] = bianjie(bwmodel_rot);sx = startx+l;sy = starty+u;RectCoord = [sx sy (r-1) (d-u)]; % 产生矩形坐标8.主程序clear;[fname,pname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.gif'},'Please choose a color picture...'); % 返回打开的图片名与图片路径名[u,v]=size(fname);y=fname(v); % 图片格式代表值switch ycase 0errordlg('You Should Load Image File First...','Warning...');case{'g';'G';'p';'P';'f';'F'}; % 图片格式若是JPG/jpg、BMP/bmp、TIF/tif 或者GIF/gif,才打开I=cat(2,pname,fname);Ori_Face=imread(I);subplot(2,3,1),imshow(Ori_Face);otherwiseerrordlg('You Should Load Image File First...','Warning...');endR=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R); % 将uint8型转换成double型处理G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;m=[ 0.4144,0.3174]; % 均值n=[0.0031,-0.0004;-0.0004,0.0003]; % 方差row=size(Ori_Face,1); % 行像素数column=size(Ori_Face,2); % 列像素数for i=1:rowfor j=1:columnif RGB(i,j)==0rr(i,j)=0;gg(i,j)=0;elserr(i,j)=R1(i,j)/RGB(i,j); % rgb归一化gg(i,j)=G1(i,j)/RGB(i,j);x=[rr(i,j),gg(i,j)];p(i,j)=exp((-0.5)*(x-m)*inv(n)*(x-m)'); % 皮肤概率服从高斯分布endendendsubplot(2,3,2);imshow(p); % 显示皮肤灰度图像low_pass=1/9*ones(3);image_low=filter2(low_pass, p); % 低通滤波去噪声subplot(2,3,3);imshow(image_low);% 自适应阀值程序previousSkin2 = zeros(i,j);changelist = [];for threshold = 0.55:-0.1:0.05two_value = zeros(i,j);two_value(find(image_low>threshold)) = 1;change = sum(sum(two_value - previousSkin2));changelist = [changelist change];previousSkin2 = two_value;end[C, I] = min(changelist);optimalThreshold = (7-I)*0.1two_value = zeros(i,j);two_value(find(image_low>optimalThreshold)) = 1; % 二值化subplot(2,3,4);imshow(two_value); % 显示二值图像frontalmodel=imread('E:\我的照片\人脸模板.jpg'); % 读入人脸模板照片FaceCoord=[];imsourcegray=rgb2gray(Ori_Face); % 将原照片转换为灰度图像[L,N]=bwlabel(two_value,8); % 标注二值图像中连接的部分,L为数据矩阵,N为颗粒的个数for i=1:N,[x,y]=find(bwlabel(two_value)==i); % 寻找矩阵中标号为i的行和列的下标bwsegment = bwselect(two_value,y,x,8); % 选择出第i个颗粒numholes = 1-bweuler(bwsegment,4); % 计算此区域的空洞数if (numholes >= 1) % 若此区域至少包含一个洞,则将其选出进行下一步运算RectCoord = -1;[m n] = size(bwsegment);[cx,cy]=center(bwsegment); % 求此区域的质心bwnohole=bwfill(bwsegment,'holes'); % 将洞封住(将灰度值赋为1)justface = uint8(double(bwnohole) .* double(imsourcegray));% 只在原照片的灰度图像中保留该候选区域angle = orient(bwsegment,cx,cy); % 求此区域的偏转角度bw = imrotate(bwsegment, angle, 'bilinear');bw = bwfill(bw,'holes');[l,r,u,d] =bianjie(bw);wx = (r - l +1); % 宽度ly = (d - u + 1); % 高度wratio = ly/wx % 高宽比if ((0.8<=wratio)&(wratio<=2))% 如果目标区域的高度/宽度比例大于0.8且小于2.0,则将其选出进行下一步运算S=ly*wx; % 计算包含此区域矩形的面积A=bwarea(bwsegment); % 计算此区域面积if (A/S>0.35)[ccorr,mfit, RectCoord] = mobanpipei(justface,frontalmodel,ly,wx, cx,cy, angle);endif (ccorr>=0.6)mfitbw=(mfit>=1);invbw = xor(mfitbw,ones(size(mfitbw)));source_with_hole = uint8(double(invbw) .* double(imsourcegray));final_image = uint8(double(source_with_hole) + double(mfit));subplot(2,3,5);imshow(final_image); % 显示覆盖了模板脸的灰度图像imsourcegray = final_image;subplot(2,3,6);imshow(Ori_Face); % 显示检测效果图end;if (RectCoord ~= -1)FaceCoord = [FaceCoord; RectCoord];endendendend% 在认为是人脸的区域画矩形[numfaces x] = size(FaceCoord);for i=1:numfaces,hd = rectangle('Position',FaceCoord(i,:));set(hd, 'edgecolor', 'y');end-人脸检测是人脸识别、人机交互、智能视觉监控等工作的前提。

人脸识别MATLAB代码

人脸识别MATLAB代码

1.色彩空间转换function [r,g]=rgb_RGB(Ori_Face)R=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R); % 将uint8型转换成double型G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;row=size(Ori_Face,1); % 行像素column=size(Ori_Face,2); % 列像素for i=1:rowfor j=1:columnrr(i,j)=R1(i,j)/RGB(i,j);gg(i,j)=G1(i,j)/RGB(i,j);endendrrr=mean(rr);r=mean(rrr);ggg=mean(gg);g=mean(ggg);2.均值和协方差t1=imread('D:\matlab\皮肤库\1.jpg');[r1,g1]=rgb_RGB(t1); t2=imread('D:\matlab\皮肤库\2.jpg');[r2,g2]=rgb_RGB(t2); t3=imread('D:\matlab\皮肤库\3.jpg');[r3,g3]=rgb_RGB(t3); t4=imread('D:\matlab\皮肤库\4.jpg');[r4,g4]=rgb_RGB(t4); t5=imread('D:\matlab\皮肤库\5.jpg');[r5,g5]=rgb_RGB(t5); t6=imread('D:\matlab\皮肤库\6.jpg');[r6,g6]=rgb_RGB(t6); t7=imread('D:\matlab\皮肤库\7.jpg');[r7,g7]=rgb_RGB(t7); t8=imread('D:\matlab\皮肤库\8.jpg');[r8,g8]=rgb_RGB(t8);t9=imread('D:\matlab\皮肤库\9.jpg');[r9,g9]=rgb_RGB(t9);t10=imread('D:\matlab\皮肤库\10.jpg');[r10,g10]=rgb_RGB(t10);t11=imread('D:\matlab\皮肤库\11.jpg');[r11,g11]=rgb_RGB(t11);t12=imread('D:\matlab\皮肤库\12.jpg');[r12,g12]=rgb_RGB(t12);t13=imread('D:\matlab\皮肤库\13.jpg');[r13,g13]=rgb_RGB(t13);t14=imread('D:\matlab\皮肤库\14.jpg');[r14,g14]=rgb_RGB(t14);t15=imread('D:\matlab\皮肤库\15.jpg');[r15,g15]=rgb_RGB(t15);t16=imread('D:\matlab\皮肤库\16.jpg');[r16,g16]=rgb_RGB(t16);t17=imread('D:\matlab\皮肤库\17.jpg');[r17,g17]=rgb_RGB(t17);t18=imread('D:\matlab\皮肤库\18.jpg');[r18,g18]=rgb_RGB(t18);t19=imread('D:\matlab\皮肤库\19.jpg');[r19,g19]=rgb_RGB(t19);t20=imread('D:\matlab\皮肤库\20.jpg');[r20,g20]=rgb_RGB(t20);t21=imread('D:\matlab\皮肤库\21.jpg');[r21,g21]=rgb_RGB(t21);t22=imread('D:\matlab\皮肤库\22.jpg');[r22,g22]=rgb_RGB(t22);t23=imread('D:\matlab\皮肤库\23.jpg');[r23,g23]=rgb_RGB(t23);t24=imread('D:\matlab\皮肤库\24.jpg');[r24,g24]=rgb_RGB(t24);t25=imread('D:\matlab\皮肤库\25.jpg');[r25,g25]=rgb_RGB(t25);t26=imread('D:\matlab\皮肤库\26.jpg');[r26,g26]=rgb_RGB(t26);t27=imread('D:\matlab\皮肤库\27.jpg');[r27,g27]=rgb_RGB(t27);r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22, r23,r24,r25,r26,r27);g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20 ,g21,g22,g23,g24,g25,g26,g27);m=mean([r,g])n=cov([r,g])3.求质心function [xmean, ymean] = center(bw)bw=bwfill(bw,'holes');area = bwarea(bw);[m n] =size(bw);bw=double(bw);xmean =0; ymean = 0;for i=1:m,for j=1:n,xmean = xmean + j*bw(i,j);ymean = ymean + i*bw(i,j);end;end;if(area==0)xmean=0;ymean=0;elsexmean = xmean/area;ymean = ymean/area;xmean = round(xmean);ymean = round(ymean);end4. 求偏转角度function [theta] = orient(bw,xmean,ymean) [m n] =size(bw);bw=double(bw);a = 0;b = 0;c = 0;for i=1:m,for j=1:n,a = a + (j - xmean)^2 * bw(i,j);b = b + (j - xmean) * (i - ymean) * bw(i,j);c = c + (i - ymean)^2 * bw(i,j);end;end;b = 2 * b;theta = atan(b/(a-c))/2;theta = theta*(180/pi); % 从幅度转换到角度5. 找区域边界function [left, right, up, down] = bianjie(A)[m n] = size(A);left = -1;right = -1;up = -1;down = -1;for j=1:n,for i=1:m,if (A(i,j) ~= 0)left = j;break;end;end;if (left ~= -1) break;end;end;for j=n:-1:1,for i=1:m,if (A(i,j) ~= 0)right = j;break;end;end;if (right ~= -1) break;end;end;for i=1:m,for j=1:n,if (A(i,j) ~= 0)up = i;break;end;end;if (up ~= -1)break;end;end;for i=m:-1:1,for j=1:n,if (A(i,j) ~= 0)down = i;break;end;end;if (down ~= -1)break;end;end;6. 求起始坐标function newcoord = checklimit(coord,maxval) newcoord = coord;if (newcoord<1)newcoord=1;end;if (newcoord>maxval)newcoord=maxval;end;7.模板匹配function [ccorr, mfit, RectCoord] = mobanpipei(mult, frontalmodel,ly,wx,cx, cy, angle)frontalmodel=rgb2gray(frontalmodel);model_rot = imresize(frontalmodel,[ly wx],'bilinear'); % 调整模板大小model_rot = imrotate(model_rot,angle,'bilinear'); % 旋转模板[l,r,u,d] = bianjie(model_rot); % 求边界坐标bwmodel_rot=imcrop(model_rot,[l u (r-l) (d-u)]); % 选择模板人脸区域[modx,mody] =center(bwmodel_rot); % 求质心[morig, norig] = size(bwmodel_rot);% 产生一个覆盖了人脸模板的灰度图像mfit = zeros(size(mult));mfitbw = zeros(size(mult));[limy, limx] = size(mfit);% 计算原图像中人脸模板的坐标startx = cx-modx;starty = cy-mody;endx = startx + norig-1;endy = starty + morig-1;startx = checklimit(startx,limx);starty = checklimit(starty,limy);endx = checklimit(endx,limx);endy = checklimit(endy,limy);for i=starty:endy,for j=startx:endx,mfit(i,j) = model_rot(i-starty+1,j-startx+1);end;end;ccorr = corr2(mfit,mult) % 计算相关度[l,r,u,d] = bianjie(bwmodel_rot);sx = startx+l;sy = starty+u;RectCoord = [sx sy (r-1) (d-u)]; % 产生矩形坐标8.主程序clear;[fname,pname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.gif'},'Please choose a color picture...'); % 返回打开的图片名与图片路径名[u,v]=size(fname);y=fname(v); % 图片格式代表值switch ycase 0errordlg('You Should Load Image File First...','Warning...');case{'g';'G';'p';'P';'f';'F'}; % 图片格式若是JPG/jpg、BMP/bmp、TIF/tif 或者GIF/gif,才打开I=cat(2,pname,fname);Ori_Face=imread(I);subplot(2,3,1),imshow(Ori_Face);otherwiseerrordlg('You Should Load Image File First...','Warning...');endR=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R); % 将uint8型转换成double型处理G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;m=[ 0.4144,0.3174]; % 均值n=[0.0031,-0.0004;-0.0004,0.0003]; % 方差row=size(Ori_Face,1); % 行像素数column=size(Ori_Face,2); % 列像素数for i=1:rowfor j=1:columnif RGB(i,j)==0rr(i,j)=0;gg(i,j)=0;elserr(i,j)=R1(i,j)/RGB(i,j); % rgb归一化gg(i,j)=G1(i,j)/RGB(i,j);x=[rr(i,j),gg(i,j)];p(i,j)=exp((-0.5)*(x-m)*inv(n)*(x-m)'); % 皮肤概率服从高斯分布endendendsubplot(2,3,2);imshow(p); % 显示皮肤灰度图像low_pass=1/9*ones(3);image_low=filter2(low_pass, p); % 低通滤波去噪声subplot(2,3,3);imshow(image_low);% 自适应阀值程序previousSkin2 = zeros(i,j);changelist = [];for threshold = 0.55:-0.1:0.05two_value = zeros(i,j);two_value(find(image_low>threshold)) = 1;change = sum(sum(two_value - previousSkin2));changelist = [changelist change];previousSkin2 = two_value;end[C, I] = min(changelist);optimalThreshold = (7-I)*0.1two_value = zeros(i,j);two_value(find(image_low>optimalThreshold)) = 1; % 二值化subplot(2,3,4);imshow(two_value); % 显示二值图像frontalmodel=imread('E:\我的照片\人脸模板.jpg'); % 读入人脸模板照片FaceCoord=[];imsourcegray=rgb2gray(Ori_Face); % 将原照片转换为灰度图像[L,N]=bwlabel(two_value,8); % 标注二值图像中连接的部分,L为数据矩阵,N为颗粒的个数for i=1:N,[x,y]=find(bwlabel(two_value)==i); % 寻找矩阵中标号为i的行和列的下标bwsegment = bwselect(two_value,y,x,8); % 选择出第i个颗粒numholes = 1-bweuler(bwsegment,4); % 计算此区域的空洞数if (numholes >= 1) % 若此区域至少包含一个洞,则将其选出进行下一步运算RectCoord = -1;[m n] = size(bwsegment);[cx,cy]=center(bwsegment); % 求此区域的质心bwnohole=bwfill(bwsegment,'holes'); % 将洞封住(将灰度值赋为1)justface = uint8(double(bwnohole) .* double(imsourcegray));% 只在原照片的灰度图像中保留该候选区域angle = orient(bwsegment,cx,cy); % 求此区域的偏转角度bw = imrotate(bwsegment, angle, 'bilinear');bw = bwfill(bw,'holes');[l,r,u,d] =bianjie(bw);wx = (r - l +1); % 宽度ly = (d - u + 1); % 高度wratio = ly/wx % 高宽比if ((0.8<=wratio)&(wratio<=2))% 如果目标区域的高度/宽度比例大于0.8且小于2.0,则将其选出进行下一步运算S=ly*wx; % 计算包含此区域矩形的面积A=bwarea(bwsegment); % 计算此区域面积if (A/S>0.35)[ccorr,mfit, RectCoord] = mobanpipei(justface,frontalmodel,ly,wx, cx,cy, angle);endif (ccorr>=0.6)mfitbw=(mfit>=1);invbw = xor(mfitbw,ones(size(mfitbw)));source_with_hole = uint8(double(invbw) .* double(imsourcegray));final_image = uint8(double(source_with_hole) + double(mfit));subplot(2,3,5);imshow(final_image); % 显示覆盖了模板脸的灰度图像imsourcegray = final_image;subplot(2,3,6);imshow(Ori_Face); % 显示检测效果图end;if (RectCoord ~= -1)FaceCoord = [FaceCoord; RectCoord];endendendend% 在认为是人脸的区域画矩形[numfaces x] = size(FaceCoord);for i=1:numfaces,hd = rectangle('Position',FaceCoord(i,:));set(hd, 'edgecolor', 'y');end人脸检测是人脸识别、人机交互、智能视觉监控等工作的前提。

【毕业设计】人脸识别算法研究与实现-(附完整源码)

【毕业设计】人脸识别算法研究与实现-(附完整源码)

河北农业大学信息学院本科毕业论文题目:人脸识别算法研究与实现学院: 信息科学与技术学院专业:电子信息科学与技术学生姓名:学号:指导教师:职称:副教授提交日期: 2013 年 6 月 1 日答辩日期: 2013年 6 月 4 日中国•河北 2013年 5 月摘要人脸识别技术,作为目前模式识别领域研究的热点也是难点之一,其最早提出可以追溯到1888年”。

然而,到目前为止,由于人脸识别问题自身的复杂性,使得虽然有众多科学研究人员潜心研究多年,也做出了许多的成果,但离彻底解决并达到实用,仍旧有很多关键性的问题需要解决。

本文对人脸识别做了一定的研究。

论文首先介绍了人脸识别的背景、研究范围以及方法,对人脸识别领域的一些理论方法作了总体的介绍。

本文中所采用的人脸识别方法是比较经典的PCA(Principle Component Analysis)主成分分析。

主要包括:结合人脸库对人脸识别的预处理方法作了较为详细的介绍;介绍了PCA人脸识别的方法;实现了一个基于PCA的实时人脸检测识别原型系统。

关键字:MATLAB、图形用户界面GUI、人脸识别、PCAABSTRACTFace recognition technology, as one of the hotspot in researchof pattern recognition is also difficult, its first suggested dates back to 1888. "so far, however, because of the complexit yof the face recognition problem itself, that although there are many scientific researchers studying for manyyears,ha s made many achievements,butfrom the resolve and achieve p ractical, there are still many keyproblemsneed to solve. In this paper, the face recognition to do some research. Pap er first introduces the background offace recognition, research scope and method, to some theoretical methods in the field of face recognition has made the overall introduction. Face recogn itionmethods used in thisarticle is the classical PCA(Pr inciple Component Analysis), principal Component Analysis. Ma inly includes: combiningface library pretreatment method offace recognition hasmade the detailed introduction; This paper in troduces themethods of PCAface recognition; Implements a real-time face detection prototype system basedon PCA.keywords:MATLAB, graphical user interface GUI, face recognition, PCA目录第一章绪论 01.1概述.................................................................................................................... 错误!未定义书签。

基于OpenCv的人脸识别系统设计与实现代码大全

基于OpenCv的人脸识别系统设计与实现代码大全

基于OpenCv的人脸识别系统设计与实现1.1 题目的主要研究内容(宋体四号加粗左对齐)(1)工作的主要描述:本文设计了基于 OpenCV 库的人脸识别系统,采用Haar 人脸特征,详细描述了人脸识别设计实现的方式,并设计所对应阶段的逻辑框架,最后结合逻辑框架运用 Python 语言编写并验证本文设计的人脸识别系统。

通过多次训练验证并实现人脸识别及判别功能。

(2)系统流程图:1.2 题目研究的工作基础或实验条件(1)硬件环境笔记本电脑,处理器:R7 5800H(2)软件环境开发语言:Python开发工具:PyCharm20211.3 数据集描述一个程序能识别给定图像或视频中的人脸。

实现这一目标的方法之一是用一系列分类好的图像来“训练”数据,并基于这些图像来进行识别。

获取数据:可以通过网上搜索图片或者自己录入(我们选择的是从网上下载某些人的图片来训练数据)有了数据,需要将这些样本图像加载到人脸识别算法中。

所有的人脸识别算法在它们的train()函数中都有两个参数:图像数组和标签数组。

这些标签表示进行识别时候某人人脸的ID,因此根据ID可以知道被识别的人是谁。

要做的这一点需要生成一个.yml文件。

1.4 人脸特征提取过程描述特征提取是人脸识别的关键问题之一。

本设计中主要采用的是Harr特征提取方法。

摄影作品可能包含很多令人愉悦的细节。

但是,由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,图像细节变得不稳定。

人们在分类时不会受这些物理细节方面差异的影响。

提取出图像的细节对产生稳定分类结果和跟踪结果很有用处。

这些提取的结果被称为特征,专业的表述为:从图像数据中提取特征。

Haar特征是一种用于实现实时人脸跟踪的特征。

每一个Haar特征都描述了相邻图像区域的对比模式。

1.5 人脸识别过程描述人脸识别采用的是LBPH算法,LBPH(Local Binary Pattern Histogram)将检测到的人脸分为小单元,并将其与模型中的对应单元进行比较,对每个区域的匹配值产生一个直方图。

基于python的人脸识别系统毕业设计

基于python的人脸识别系统毕业设计

基于Python的人脸识别系统毕业设计简介本篇文章将详细介绍基于Python的人脸识别系统的毕业设计。

人脸识别是一种通过计算机对输入图像或视频中的人脸进行检测、识别和验证的技术。

本毕业设计旨在使用Python编写一个完整的人脸识别系统,包括人脸检测、特征提取、模型训练和识别等功能。

1. 人脸检测人脸检测是人脸识别系统中的第一步,它用于从图像或视频中定位和标记出所有出现的人脸。

在Python中,我们可以使用OpenCV库来实现这一功能。

OpenCV提供了许多现成的方法和算法,可以轻松地进行人脸检测。

import cv2def detect_faces(image):# 加载分类器face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 将图像转换为灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行人脸检测faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors= 5, minSize=(30, 30))# 标记检测到的人脸for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) return image# 加载图像image = cv2.imread('image.jpg')# 进行人脸检测result = detect_faces(image)# 显示结果cv2.imshow('Faces Detected', result)cv2.destroyAllWindows()上述代码中,我们首先加载了一个已经训练好的人脸分类器,然后将图像转换为灰度图,接着使用detectMultiScale方法进行人脸检测。

python人脸识别课程设计

python人脸识别课程设计

python人脸识别课程设计一、课程目标知识目标:1. 让学生理解人脸识别的基本概念,掌握人脸检测、特征提取和识别等关键技术;2. 引导学生了解Python编程语言在人脸识别领域的应用,熟悉相关库函数的使用;3. 帮助学生掌握图像处理的基本方法,提高对人脸图像的分析和处理能力。

技能目标:1. 培养学生运用Python编写人脸识别程序的能力,实现简单的人脸检测、特征提取和识别功能;2. 培养学生独立解决人脸识别实际问题的能力,提高编程实践操作技巧;3. 培养学生团队协作和沟通能力,通过小组讨论和实践,共同完成课程任务。

情感态度价值观目标:1. 激发学生对人工智能和人脸识别技术的兴趣,培养其探索精神和创新意识;2. 培养学生关注人脸识别技术在现实生活中的应用,提高对科技发展的认识和责任感;3. 引导学生遵循道德规范和法律法规,正确使用人脸识别技术,保护个人隐私。

本课程针对高年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果。

通过本课程的学习,学生能够掌握人脸识别的基本知识,具备实际操作能力,并树立正确的价值观。

为实现课程目标,后续教学设计将注重理论与实践相结合,充分调动学生的积极性,提高教学效果。

二、教学内容1. 人脸识别基本概念:人脸检测、特征提取、人脸识别;2. Python编程基础:语法、数据结构、函数、类;3. 图像处理库OpenCV:安装与配置、基本操作、图像处理方法;4. 人脸识别库face_recognition:安装与使用、人脸检测、特征提取、人脸识别;5. 实践项目:设计并实现一个简单的人脸识别系统。

教学内容安排与进度:第一周:介绍人脸识别基本概念,学习Python编程基础;第二周:学习图像处理库OpenCV,掌握基本图像操作;第三周:学习人脸识别库face_recognition,了解其功能和用法;第四周:实践项目,小组分工合作,设计并实现人脸识别系统;第五周:项目展示与评价,总结课程学习成果。

人脸识别专业课程设计附带代码

人脸识别专业课程设计附带代码

人脸识别中图像预处理研究1.课程设计目标伴随人工智能技术兴起,和人类视觉研究进展,大家逐步对人脸图像机器识别投入很大热情,并形成了一个人脸图像识别研究领域,这一领域除了它重大理论价值外,也极具实用价值。

如同人指纹一样,人脸也含有唯一性,也可用来判别一个人身份。

人脸图像自动识别系统较之指纹识别系统、DNA判定等更具方便性,开发研究实际意义更大。

然而人脸图像受很多原因干扰,给识别带来很大难度。

国外对于人脸图像识别研究较早,现己有实用系统面世,只是对于成像条件要求较苛刻,应用范围也就较窄,中国也有很多科研机构从事这方而研究,并己取得很多结果。

2. 方法综述2.1特征脸法(PCA):把单个图像看成一维向量,众多一维向量形成了人脸图像特征空间,再将其变换到一个新相对简单特征空间,经过计算矩阵特征值和特征向量,利用图像代数特征信息,寻求“人脸”、“非人脸”两种模式在该特征空间中分布规律。

2.2人工神经网络(ANN)法:经过训练一个网络结构,把模式统计特征隐含在神经网络结构和参数之中。

基于人工神经网络方法对于复杂、难以显式描述模式,含有独特优势。

2.3支撑向量机(SVM)法:在统计学习理论基础上发展出一个新模式识别方法,它基于结构风险最小化原理,较之于基于经验风险最小化人工神经网络,部分难以逾越问题,如:模型选择和过学习问题、非线性和维数灾难问题、局部极小点问题等全部得到了很大程度上处理。

不过直接使用SVM方法进行人脸识别有两方面困难:第一,训练时需要求解二次计划问题计算复杂度高,内存需求量巨大;第二,在非人脸样本不受限制时,需要极大规模训练集合,得到支持向量会很多,使得分类器计算量过高。

2.4基于积分图像特征人脸检测方法:是Viola等新近提出一个算法,它综合使用了积分图像描述方法、Adaboost学习算法及训练方法、级联弱分类器。

3.试验结果和分析3.1 人脸识别整体过程图3.1 人脸识别技术处理步骤图3.1.1人脸图像获取通常来说,图像获取全部是经过摄像头摄取,但摄取图像能够是真人,也能够是人脸图片或为了相对简单,能够不考虑经过摄像头来摄取头像,而是直接给定要识别图像。

如何快速搭建智能人脸识别系统(附代码)

如何快速搭建智能人脸识别系统(附代码)

如何快速搭建智能人脸识别系统(附代码)重磅干货,第一时间送达网络安全是现代社会最关心的问题之一,确保只有特定的人才能访问设备变得极其重要,这是我们的智能手机设有两级安全系统的主要原因之一。

这是为了确保我们的隐私得到维护,只有真正的所有者才能访问他们的设备。

基于人脸识别的智能人脸识别技术就是这样一种安全措施,本文我们将研究如何利用VGG-16的深度学习和迁移学习,构建我们自己的人脸识别系统。

本项目构建的人脸识别模型将能够检测到授权所有者的人脸并拒绝任何其他人脸,如果面部被授予访问权限或访问被拒绝,模型将提供语音响应。

用户将有 3 次尝试验证相同,在第三次尝试失败时,整个系统将关闭,从而保持安全。

如果识别出正确的面部,则授予访问权限并且用户可以继续控制设备。

完整代码将在文章末尾提供Github下载链接。

首先,我们将研究如何收集所有者的人脸图像。

然后,如果我们想添加更多可以访问我们系统的人,我们将创建一个额外的文件夹。

我们的下一步是将图像大小调整为 (224, 224, 3) 形状,以便我们可以将其通过 VGG-16 架构。

请注意,VGG-16 架构是在具有上述形状的图像净权重上进行预训练的。

然后我们将通过对数据集执行图像数据增强来创建图像的变化。

在此之后,我们可以通过排除顶层来自由地在 VGG-16 架构之上创建我们的自定义模型。

接下来是编译、训练和相应地使用基本回调拟合模型。

在这一步中,我们将编写一个简单的 Python 代码,通过单击空格键按钮来收集图像,我们可以单击“q”按钮退出图形窗口。

图像的收集是一个重要的步骤,本步骤将授予设备人脸信息收集的访问权限。

执行以下代码将完成本步骤:import cv2import oscapture = cv2.VideoCapture(0)directory = "Bharath/"path = os.listdir(directory)count = 0我们将“打开”我们的默认网络摄像头,然后继续捕获数据集所需的面部图像。

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

人脸识别中图像预处理的研究1.课程设计目的随着人工智能技术的兴起,以及人类视觉研究的进展,人们逐渐对人脸图像的机器识别投入很大的热情,并形成了一个人脸图像识别研究领域,这一领域除了它的重大理论价值外,也极具实用价值。

如同人的指纹一样,人脸也具有唯一性,也可用来鉴别一个人的身份。

人脸图像的自动识别系统较之指纹识别系统、DNA鉴定等更具方便性,开发研究的实际意义更大。

然而人脸图像受很多因素的干扰,给识别带来很大难度。

国外对于人脸图像识别的研究较早,现己有实用系统面世,只是对于成像条件要求较苛刻,应用范围也就较窄,国内也有许多科研机构从事这方而的研究,并己取得许多成果。

2. 方法综述特征脸法(PCA):把单个图像看成一维向量,众多的一维向量形成了人脸图像特征空间,再将其变换到一个新的相对简单的特征空间,通过计算矩阵的特征值和特征向量,利用图像的代数特征信息,寻找“人脸”、“非人脸”两种模式在该特征空间中的分布规律。

人工神经网络(ANN)法:通过训练一个网络结构,把模式的统计特性隐含在神经网络的结构和参数之中。

基于人工神经网络的方法对于复杂的、难以显式描述的模式,具有独特的优势。

支撑向量机(SVM)法:在统计学习理论基础上发展出的一种新的模式识别方法,它基于结构风险最小化的原理,较之于基于经验风险最小化的人工神经网络,一些难以逾越的问题,如:模型选择和过学习问题、非线性和维数灾难问题、局部极小点问题等都得到了很大程度上的解决。

但是直接使用SVM方法进行人脸识别有两方面的困难:第一,训练时需要求解二次规划问题计算复杂度高,内存需求量巨大;第二,在非人脸样本不受限制时,需要极大规模的训练集合,得到的支持向量会很多,使得分类器的计算量过高。

基于积分图像特征的人脸检测方法:是Viola等新近提出的一种算法,它综合使用了积分图像描述方法、Adaboost学习算法及训练方法、级联弱分类器。

3.实验结果与分析图人脸识别技术处理流程图人脸图像的获取一般来说,图像的获取都是通过摄像头摄取,但摄取的图像可以是真人,也可以是人脸的图片或者为了相对简单,可以不考虑通过摄像头来摄取头像,而是直接给定要识别的图像。

人脸定位对人脸图像打上网格,对区域块图像做二值分析,通过像素比例来做处理,进而得到人脸区域。

在彩色图像中,颜色是人脸表面最为显著的特征之一,利用颜色检测人脸是很自然的想法。

研究人员在考察了不同种族、不同个体的肤色后,认为人类的肤色能在颜色空间中聚成单独的一类,而影响肤色值变化的最主要因素是亮度变化。

因此他们采用广泛使用的RGB 颜色空间,在滤去亮度值的图像中通过比较像素点的r、g值与肤色范围来推断该像素点及其邻域是否属于人脸区域。

除了RGB颜色空间,还有诸如HIS,LUV,GLHS等其它颜色空间被使用。

寻找到肤色区域后,必须进行验证,排除类肤色区域。

利用肤色像素的连通性分割出区域,使用椭圆拟合各个区域,根据椭圆长短轴的比率判断是否为人脸。

如图所示。

原图像网格标记图像二值图像标记图像图人脸定位过程图像预处理①滤波去噪:空域滤波按照空域滤波器的功能又可分为平滑滤波器和锐化滤波器。

平滑滤波器可以用低通滤波实现,目的在于模糊图像或消除噪声;锐化滤波器是用高通滤波来实现,目的在于强调图像被模糊的细节。

②灰度变换:有多种方法可以实现图像的灰度变换,其中最常用的就是直方图变换的方法,即直方图的均衡化。

这种方法是一种使输出图像直方图近似服从均匀分布的变换算法。

③边缘检测:数字图像的边缘检测是图像分割、目标区域识别、区域形状提取等图像分析领域十分重要的基础,也是图像识别中提取图像特征的一个重要属性。

边缘检测算子可以检查每个像素的邻域并对灰度变化率进行量化,也包括对方向的确定,其中大多数是基于方向导数掩模求卷积的方法。

常用的有Sobel算子,Prewitt算子,Roberts算子,Log算子等。

人脸识别把单个图像看成一维向量,众多的一维向量形成了人脸图像特征空间,再将其变换到一个新的相对简单的特征空间,通过计算矩阵的特征值和特征向量,利用图像的代数特征信息,寻找“人脸”、“非人脸”两种模式在该特征空间中的分布规律。

传统主成成份分析方法的基本原理是:利用K-L变换抽取人脸的主要成分,构成特征脸空间,识别时将测试图像投影到此空间,得到一组投影系数,通过与各个人脸图像比较进行识别。

对于一幅M*N的人脸图像,将其每列相连构成一个大小为D=M*N维的列向量。

D就是人脸图像的维数,即是图像空间的维数。

设n是训练样本的数目;X j表示第j幅人脸图像形成的人脸向量,则所需样本的协方差矩阵为:其中U为训练样本的平均图像向量:令A=[x1-u,x2-u,...x n-u],则有S r=AA T,其维数为D×D。

根据K-L变换原理,需要求得的新坐标系由矩阵AA T的非零特征值所对应的特征向量组成。

直接计算的计算量比较大,所以采用奇异值分解(SVD)定理,通过求解A T A的特征值和特征向量来获得AA T的特征值和特征向量。

依据SVD定理,令l i(i=1,2,…,r)为矩阵A T A的r个非零特征值,v i为A T A对应于l i的特征向量,则AA T的正交归一特征向量U i为:则“特征脸”空间为:w=(U1,U2,...,U n)将训练样本投影到“特征脸”空间,得到一组投影向量Ω=w T u,构成人脸识别的数据库。

在识别时,先将每一幅待识别的人脸图像投影到“特征脸”空间,再利用最邻近分类器比较其与库中人脸的位置,从而识别出该图像是否是库中的人脸,如果是,是哪一幅人脸。

图测试图像与对比结果实验过程具体分析人脸检测人脸检测的任务是判断静态图像中是否存在人脸。

若存在人脸,给出其在图像中的坐标位置、人脸区域大小等信息。

而人脸跟踪则需要进一步输出所检测到的人脸位置、大小等状态随时间的连续变化情况。

特征提取通过人脸特征点的检测与标定可以确定人脸图像中显著特征点的位置(如眼睛、眉毛、鼻子、嘴巴等器官),同时还可以得到这些器官及其面部轮廓的形状信息的描述。

根据人脸特征点检测与标定的结果,通过某些运算得到人脸特征的描述。

基于人脸图像比对的身份识别通过将输入人脸图像与人脸数据库中的所有已知原型人脸图像计算相似度并对其排序来给出输入人脸的身份信息。

这包括两类识别问题:一类是闭集人脸识别问题,即假定输入的人脸一定是人脸库中的某个个体;另一类是开集识别,即首先要对输入人脸是否在已知人脸库中做出判断,如果是,则给出其身份。

基于人脸图像比对的身份验证即人脸确认问题。

系统在输入人脸图像的同时输入一个用户宣称的该人脸的身份信息,系统要对该输入人脸图像的身份与宣称的身份是否相符作出判断。

4.实验结果分析人脸识别的优势在于其自然性和不被被测个体察觉的特点。

人脸识别的困难主要是人脸作为生物特征的特点所带来的。

相似性:不同个体之间的区别不大,所有的人脸的结构都相似,甚至人脸器官的结构外形都很相似。

这样的特点对于利用人脸进行定位是有利的,但是对于利用人脸区分人类个体是不利的。

易变性:人脸的外形很不稳定,人可以通过脸部的变化产生很多表情,而在不同观察角度,人脸的视觉图像也相差很大,另外人脸识别还受光照条件、人脸的很多遮盖物、年龄等多方面因素的影响。

特征脸算法(PCA)使得压缩前后的均方误差最小,且变换后的低维空间有很好的分辨能力,但是在种方法在处理人脸图像时,要将二维图像矩阵转换成一维的列向量,使图像的维数达到上万维,计算工作量非常大,特征提取速度慢。

为了克服传统PCA的不足,研究者们相继提出了二维PCA(2DPCA)方法、PCA+2DPCA等一些方法。

这些方法的提出不仅有效地解决了图像处理的高维问题,而且大大提高了人脸的识别率。

5.心得体会通过本学期对数字图象处理课程的学习,是我对数字图像处理领域有了一定的了解与体会,熟悉了图像处理的流程与方式方法,加深了我对数字领域的理解。

通过matlab实验,是我对matlab应用有了更进一步的掌握与学习,为下一步学习打下了良好的基础。

参考文献[1]阮秋琦.数字图像处理学[M]. 北京: 电子工业出版社,[2]贺兴华. 图像处理[M]. 北京: 人民邮电出版社,[3]王耀南. 计算机图像处理与识别技术[M]. 北京: 高等教育出版社,[4]章毓晋. 图像工程[M]. 北京: 清华大学出版社,[5]胡学龙. 数字图像处理[M]. 北京: 电子工业出版社,[6]罗军辉. 在图像处理中的应用[M]. 北京: 机械工业出版社,[7]刘文耀. 数字图像采集与处理[M]. 北京: 电子工业出版社,[8]缪绍纲. 数字图像处理——活用MATLAB [M].成都: 西南交通大学出版社,[9]罗良正.数字图像处理[M]. 南京: 东南大学出版社,附录代码:(运行文件)%Ch1Img = imread('');if ndims(Img) == 3I=rgb2gray(Img);elseI = Img;endBW = im2bw(I, graythresh(I)); % 二值化figure;imshow(Img);title('原图像');hold on;[xt, yt] = meshgrid(round(linspace(1, size(I, 1), 10)), ...round(linspace(1, size(I, 2), 10)));mesh(yt, xt, zeros(size(xt)), 'FaceColor', ...'None', 'LineWidth', 3, ...'EdgeColor', 'r');imshow(BW);title('二值图像');[n1, n2] = size(BW);r = floor(n1/10); % 分成10块,行c = floor(n2/10); % 分成10块,列x1 = 1; x2 = r; % 对应行初始化s = r*c; % 块面积y1 = 1; y2 = c; % 对应列初始化for j = 1:10if (y2<=c || y2>=9*c) || (x1==1 || x2==r*10)% 如果是在四周区域loc = find(BW(x1:x2, y1:y2)==0);[p, q] = size(loc);pr = p/s*100; % 黑色像素所占的比例数if pr <= 100BW(x1:x2, y1:y2) = 0;endendy1 = y1+c; % 列跳跃y2 = y2+c; % 列跳跃endx1 = x1+r; % 行跳跃x2 = x2+r; % 行跳跃end[L, num] = bwlabel(BW, 8); % 区域标记stats = regionprops(L, 'BoundingBox'); % 得到包围矩形框Bd = cat(1, ;[s1, s2] = size(Bd);mx = 0;for k = 1:s1p = Bd(k, 3)*Bd(k, 4); % 宽*高if p>mx && (Bd(k, 3)/Bd(k, 4))<% 如果满足面积块大,而且宽/高<j = k;endendimshow(I); hold on;rectangle('Position', Bd(j, :), ...'EdgeColor', 'r', 'LineWidth', 3);title('标记图像');%CreateDatabasefunction T = CreateDatabase(TrainDatabasePath)% Align a set of face images (the training set T1, T2, ... , TM )%% Description: This function reshapes all 2D images of the training database% into 1D column vectors. Then, it puts these 1D column vectors in a row to% construct 2D matrix 'T'.%%% Argument: TrainDatabasePath - Path of the training database%% Returns: T - A 2D matrix, containing all 1D image vectors.% Suppose all P images in the training database% have the same size of MxN. So the length of 1D% column vectors is MN and 'T' will be a MNxP 2D matrix.%% See also: STRCMP, STRCAT, RESHAPE% Original version by Amir Hossein Omidvarnia, October 2007% Email%%%%%%%%%%%%%%%%%%%%%%%% File managementTrainFiles = dir(TrainDatabasePath);Train_Number = 0;for i = 1:size(TrainFiles,1)ifnot(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'')) Train_Number = Train_Number + 1; % Number of all images in the training databaseendend%%%%%%%%%%%%%%%%%%%%%%%% Construction of 2D matrix from 1D image vectors T = [];for i = 1 : Train_Number% I have chosen the name of each image in databases as a corresponding% number. However, it is not mandatory!str = int2str(i);str = strcat('\',str,'.jpg');str = strcat(TrainDatabasePath,str);img = imread(str);img = rgb2gray(img);[irow icol] = size(img);temp = reshape(img',irow*icol,1); % Reshaping 2D images into 1D image vectorsT = [T temp]; % 'T' grows after each turnend%EigenfaceCorefunction [m, A, Eigenfaces] = EigenfaceCore(T)% Use Principle Component Analysis (PCA) to determine the most% discriminating features between images of faces.%% Description: This function gets a 2D matrix, containing all training image vectors% and returns 3 outputs which are extracted from training database.%% Argument: T - A 2D matrix, containing all 1D image vectors.% Suppose all P images in the training database% have the same size of MxN. So thelength of 1D% column vectors is M*N and 'T' will be a MNxP 2D matrix.%% Returns: m - (M*Nx1) Mean of the training database % Eigenfaces - (M*Nx(P-1)) Eigen vectors of the covariance matrix of the training database% A - (M*NxP) Matrix of centered image vectors%% See also: EIG% Original version by Amir Hossein Omidvarnia, October 2007% Email%%%%%%%%%%%%%%%%%%%%%%%% Calculating the mean imagem = mean(T,2); % Computing the average face image m = (1/P)*sum(Tj's) (j = 1 : P)Train_Number = size(T,2);%%%%%%%%%%%%%%%%%%%%%%%% Calculating the deviation of each image from mean imageA = [];for i = 1 : Train_Numbertemp = double(T(:,i)) - m; % Computing the difference image for each image in the training set Ai = Ti - mA = [A temp]; % Merging all centered imagesend%%%%%%%%%%%%%%%%%%%%%%%% Snapshot method of Eigenface methos% We know from linear algebra theory that for a PxQ matrix, the maximum% number of non-zero eigenvalues that the matrix can have is min(P-1,Q-1).% Since the number of training images (P) is usually less than the number% of pixels (M*N), the most non-zero eigenvalues that can be found are equal% to P-1. So we can calculate eigenvalues of A'*A (a PxP matrix) instead of% A*A' (a M*NxM*N matrix). It is clear that the dimensions of A*A' is much% larger that A'*A. So the dimensionality will decrease.L = A'*A; % L is the surrogate of covariance matrix C=A*A'.[V D] = eig(L); % Diagonal elements of D are the eigenvalues for both L=A'*A and C=A*A'.%%%%%%%%%%%%%%%%%%%%%%%% Sorting and eliminating eigenvalues% All eigenvalues of matrix L are sorted and those who are less than a% specified threshold, are eliminated. So the number of non-zero% eigenvectors may be less than (P-1).L_eig_vec = [];for i = 1 : size(V,2)if( D(i,i)>1 )L_eig_vec = [L_eig_vec V(:,i)];endend%%%%%%%%%%%%%%%%%%%%%%%% Calculating the eigenvectors of covariance matrix 'C'% Eigenvectors of covariance matrix C (or so-called "Eigenfaces")% can be recovered from L's eiegnvectors.Eigenfaces = A * L_eig_vec; % A: centered image vectors%example% A sample script, which shows the usage of functions, included in% PCA-based face recognition system (Eigenface method)%% See also: CREATEDATABASE, EIGENFACECORE, RECOGNITION% Original version by Amir Hossein Omidvarnia, October 2007% Emailclear allclcclose all% You can customize and fix initial directory pathsTrainDatabasePath = uigetdir('D:\Program Files\MATLAB\R2006a\work', 'Select training database path' );TestDatabasePath = uigetdir('D:\Program Files\MATLAB\R2006a\work', 'Select test database path');prompt = {'Enter test image name (a number between 1 to 10):'};dlg_title = 'Input of PCA-Based Face Recognition System';num_lines= 1;def = {'1'};TestImage = inputdlg(prompt,dlg_title,num_lines,def); TestImage = strcat(TestDatabasePath,'\',char(TestImage),'.jpg'); im = imread(TestImage);T = CreateDatabase(TrainDatabasePath);[m, A, Eigenfaces] = EigenfaceCore(T);OutputName = Recognition(TestImage, m, A, Eigenfaces);SelectedImage = strcat(TrainDatabasePath,'\',OutputName); SelectedImage = imread(SelectedImage);imshow(im)title('Test Image');figure,imshow(SelectedImage);title('Equivalent Image');str = strcat('Matched image is : ',OutputName);disp(str)%Recognitionfunction OutputName = Recognition(TestImage, m, A, Eigenfaces) % Recognizing step....%% Description: This function compares two faces by projecting the images into facespace and % measuring the Euclidean distance between them.%% Argument: TestImage - Path of the input test image%% m - (M*Nx1) Mean of the training% database, which is output of 'EigenfaceCore' function.%% Eigenfaces - (M*Nx(P-1)) Eigen vectors of the% covariance matrix of the training% database, which is output of 'EigenfaceCore' function.%% A - (M*NxP) Matrix of centered image% vectors, which is output of 'EigenfaceCore' function.%% Returns: OutputName - Name of the recognized image in the training database.%% See also: RESHAPE, STRCAT% Original version by Amir Hossein Omidvarnia, October 2007% Email%%%%%%%%%%%%%%%%%%%%%%%% Projecting centered image vectors into facespace % All centered images are projected into facespace by multiplying in% Eigenface basis's. Projected vector of each face will be its corresponding% feature vector.ProjectedImages = [];Train_Number = size(Eigenfaces,2);for i = 1 : Train_Numbertemp = Eigenfaces'*A(:,i); % Projection of centered images into facespaceProjectedImages = [ProjectedImages temp];end%%%%%%%%%%%%%%%%%%%%%%%% Extracting the PCA features from test image InputImage = imread(TestImage);temp = InputImage(:,:,1);[irow icol] = size(temp);InImage = reshape(temp',irow*icol,1);Difference = double(InImage)-m; % Centered test imageProjectedTestImage = Eigenfaces'*Difference; % Test image feature vector%%%%%%%%%%%%%%%%%%%%%%%% Calculating Euclidean distances% Euclidean distances between the projected test image and the projection% of all centered training images are calculated. Test image is% supposed to have minimum distance with its corresponding image in the% training database.Euc_dist = [];for i = 1 : Train_Numberq = ProjectedImages(:,i);temp = ( norm( ProjectedTestImage - q ) )^2;Euc_dist = [Euc_dist temp];end[Euc_dist_min , Recognized_index] = min(Euc_dist); OutputName = strcat(int2str(Recognized_index),'.jpg');。

相关文档
最新文档