使用vision.CascadeObjectDetector在matlab中从视频中非常快速地检测面部

时间:2014-04-25 13:39:59

标签: image matlab computer-vision face-detection matlab-cvst

我编写了用于人脸检测的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

1 个答案:

答案 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>