如何使用Matlab创建一个人脸数据库
人脸数据库是在测试人脸处理算法时使用的图像数据,如用于人脸识别的主成分分析(PCA)。
在本教程中,我们将学习用MATLAB编码,以便从人脸数据库中识别人脸。
数据库如何工作,取决于你要使用的算法类型和你要实施的项目。例如,PCA使用特征空间来识别数据库中的人脸。
这个程序的框架可以用来为其他许多物体创建数据库,而不仅仅是人脸。在这种情况下,我们将使用WEBCAM来拍摄一些所需的脸部快照来建立数据库。
前提条件
要跟上本教程的进度--读者需要具备以下条件。
如何安装网络摄像头?
- 在你的电脑上打开Matlab软件。
- 在
Home部分,点击Add-Ons下拉箭头,然后选择Get hardware support packages。

Matlab仪表板屏幕
- 在搜索标签上,输入包的名称,即Matlab支持包的USB包,然后搜索。

搜索页面
- 点击
MATLAB Support Package for USB。 - 点击
Install,进行安装。

硬件安装界面
由于该软件包已经安装在我的电脑中,Install 按钮显示为Manage 。
使用Matlab创建人脸数据库
本教程的主要目的是创建一个用户自己的人脸数据库。这使我们更容易理解和进行需要人脸数据库的各种项目。
我们首先初始化网络摄像头。
cam = webcam;
然后我们输入所需数量的人脸nof ,以建立我们的数据库。
它是由下面的代码执行的。
nof = input('enter no. of required frames:');
我们输入所需的帧数count ,我们将count 设置为1 。
例如,如果你需要20或100张图片,你可以在这里修改所需的帧数。
count = 1;
然后我们初始化count ,进入while 循环。当count 小于或等于所需帧数nof ,那么while 循环将被执行,快照被捕获。
然后,捕获的图像被存储到img ,并将其传递给myFaceDetect 函数。
这个函数应该被定义在一个下标中,然后调用到主函数中。myFaceDetect 函数的描述在程序的最后给出。
while count <= nof
img = snapshot(cam);
下面的代码使用myFaceDetect 函数返回裁剪后的图像,该函数返回croppedframe 和边界框点bboxpoint 。
[croppedFrame, bboxpoint] = myFaceDetect(img);
imshow(croppedFrame)
注意,在上面的代码中,我们感兴趣的不是边界框bboxpoint ,而是框架。裁剪后的框架将被存储在同一目录中。
然后我们将使用if 和else 语句来介绍运行程序的条件。
如果裁剪后的框架不是空的,这意味着人脸被检测到了,我们得到的是一个裁剪后的框架,你可以把它存储到你的任何文件夹中。
最好是创建一个单独的文件夹。
然后我们指定该文件夹的路径,如图所示。
if ~isempty(croppedFrame)
fileName = strcat('WRITE_YOUR_FOLDER_PATH',sprintf(‘%d.png’,count));
然后我们使用imwrite ,将裁剪后的帧与相应的文件名一起写入该目录中。
imwrite(croppedFrame,'WRITE_YOUR_FILENAME');
msg = ['imageAcquiredNo:',num2str(count)]
disp(msg)
count = count + 1;

一张脸的样本图像
num2str 函数提供了文件名。这意味着,由于计数是从1 到n 开始的,而这是给定的帧的数量。所以,文件名将以数字的形式出现。
在上面的文件名中,我们的文件格式是.png 。
这意味着,我们希望文件名采用以下形式。imageDatabase1.png,imageDatabase2.png,imageDatabase3.png 直到imageDatabaseN.png 。

一个图像的列表
如果在裁剪后的画面中没有检测到人脸,那么它应该在工作区显示no face detected 。
这里是代码。
else
disp('no face detected')
下面是if 和else 语句的完整代码。
if ~isempty(croppedFrame)
fileName = strcat('Directory',sprintf('%d.png',count));
imwrite(croppedFrame, fileName)
msg = ['image aquired no:', num2str(count)];
disp(msg)
count = count + 1;
else
disp('no face detected')
end
摄像机在0.1s ,并在拍完快照后重置摄像机。
这由下面的代码调节。
clf('reset')
pause(0.1)
end
pause 的时间可以根据用户的喜好来改变。在这之后,相机对象被清除了。
当你运行程序时,摄像机前面的人的脸被捕捉并存储。这样重复进行,直到获得所需图像的数量。捕捉到的人脸数量会显示在工作区。
当摄像头前的人隐藏了他/她的脸或者摄像头前没有人时,那么工作区就会显示一个文本no face is detected 。
当没有检测到人脸时,计数停止,当再次检测到人脸时重新开始,直到获得所需的样本。
myFaceDetect 这个函数应该在另一个脚本中定义,然后在人脸数据库脚本中调用。
这个函数返回一个裁剪过的图像和bboxpoint 。在这一点上,我们把重点放在bboxpoint 。
function [croppedImage, bboxpoints] = myFaceDetect
%introduce the face detector object
faceDetector = vision.CascadeObjectDetector;
faceDetector.MergeThreshold = 10; %adjust to avoid false detection
%add bounding boxbox around the detect face
bboxes = faceDetector(img)
if ~isempty(bboxes)
bboxes(1,1) = bboxes(1,1)-50;
bboxes(1,2) = bboxes(1,2)-50;
bboxes(1,3) = bboxes(1,3)+100;
bboxes(1,4) = bboxes(1,4)+100;
在上面的代码中,我们增加了数值,并在两个方向上增加了包围盒的大小。这使得身体的其他部分,如耳朵,也被包括在内。
%crop the obtained image
croppedImage = imcrop(img,bboxes)
bboxPoints = bbox2points(bboxes(1, :))
%if face is not detected the code below is executed
else
croppedImage = [];
bboxPoints = [];
end
结论
Matlab被用来创建一个图像数据库。这是因为它有一个内置的网络摄像头。这使得它在创建数据库进行分析时很有效率。
该图像数据库还可以用于深度神经系统的训练和验证。这可以帮助物体识别和其他项目。