我编写了用于人脸检测的matlab代码。在我的代码中,它检测前100帧的面部,并从每个帧中裁剪面部并将其保存在数据库文件夹中。我遇到的问题
1.逐帧检测是非常慢的。因为我必须处理4000帧,所以有任何想法跑得更快。
2.在我的数据库文件夹中,它必须显示1到100张脸部图像,但它没有显示第11张和第12张脸部图像,直接显示第10张图像后的第13张脸部图像。第3张脸部图像模糊。很多图像丢失它有些是模糊的。最后的图像编号显示为216.但是数据库文件夹中共有106个面部图像。其中12个图像是模糊的。其余是正确的图像。
clc;
clear all;
obj=vision.VideoFileReader('basu.avi');
for k=0:99
videoFrame = step(obj);
%using viola-jones algorithm
FaceDetect = vision.CascadeObjectDetector;
%FaceDetect
BB = step(FaceDetect,videoFrame);
%BB
figure(2),imshow(videoFrame);
for i = 1:size(BB,1)
rectangle('Position',BB(i,:),'LineWidth',3,'LineStyle','-','EdgeColor','r');
end
%crop faces and convert it to gray
for i = 1:size(BB,1)
J= imcrop(videoFrame,BB(i,:));
I=rgb2gray(imresize(J,[292,376]));
%save cropped faces in database folder
filename = ['G:\matlab_installed\bin\database\' num2str(i+k*(size(BB,1))) '.jpg'];
imwrite(I,filename);
end
end
答案 0 :(得分:2)
您可以尝试一些事项:
绝对将FaceDetect = vision.CascadeObjectDetector;
移到循环之外。您只需要创建一次面部检测器对象。为每一帧重新创建它绝对是你的性能瓶颈。
vision.VideoFileReader
默认返回类'single'
的框架。如果将输出数据类型更改为'uint8'
,则应加快面部检测器的速度。使用obj=vision.VideoFileReader('basu.avi', 'VideoOutputDataType', 'uint8');
vision.VideoFileReader
也可以为您转换为灰度。使用obj=vision.VideoFileReader('basu.avi', 'VideoOutputDataType', 'uint8', 'ImageColorSpace', 'Intensity');
这可能比调用rgb2gray
更快。
尝试使用'MinSize'
的{{1}}和'MaxSize'
选项限制检测到的脸部大小和/或在检测脸部之前尝试对帧进行下采样。</ p> < / LI>