如何使用 Matlab 中的 Batch Image Processor 应用程序保存带有人脸检测边界框的图像
How do I save images with face detection bounding box using the Batch Image Processor app in Matlab
我是 Matlab 的新手,我正在尝试对一批图像执行人脸检测。我正在使用这个简单的 face detection code,它与图像处理工具箱和计算机视觉工具箱一起使用。我正在使用 Batch Image Processor App 并将我的代码编写为应用于一批图像的函数。作为结果,我需要的是每个边界框的四个值(这有效),我想保存每个绘制边界框的图像,以检查是否正确检测到面部(这不起作用)。这是函数:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 5);
BBface = step(FDetect,im);
figure,
imbb = imshow(im); hold on
for i = 1:size(BBface,1)
rectangle('Position',BBface(i,:),'LineWidth',2,'LineStyle','-
','EdgeColor','r');
end
hold off;
imwrite(imbb,'test.jpg'); %this is the line that doesn't work
results.face=BBface; %this gives me the values of each bounding box
end
当我应用此函数时,它会为我提供边界框的值,并且在 imshow 中它会显示面部周围带有边界框的图像。但是,imwrite 函数不起作用并出现以下错误:
Error using imwrite (line 420) Expected DATA to be one of these types:
numeric, logical
Instead its type was matlab.graphics.primitive.Image.
Error in facedetection (line 13) imwrite(imbb,'test.jpg');
有谁知道如何解决这个问题?是否可以使用 Batch Image Processor 应用程序保存所有带有边界框的图像?如果可以,如何保存?是否也可以在不使用 imshow 的情况下保存图像?我不必直接看到结果,只要我能保存它们即可。
如果这个问题太模糊,我很抱歉,但我希望有人能进一步帮助我。
编辑:我发现只要将图像放入结果中,就可以使用批处理图像处理器来保存图像。函数中的字符串(参见 documentation),但我不知道该怎么做。我更改了我的代码如下:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 5);
BBface = step(FDetect,im);
figure,
imbb = imshow(im); hold on
for i = 1:size(BBface,1)
rectangle('Position',BBface(i,:),'LineWidth',2,'LineStyle','-
','EdgeColor','r');
end
hold off;
BBimage = imfuse (im, BBface); %this doesn't work
results.BBValues=BBface;
results.BBimage=BBimage;
end
此代码 returns 一个完整的绿色调图像 (?!)。所以 imfuse 部分可能出了问题。如何将 im 和绘制的矩形放在 BBimage 中?
这意味着您尝试写入文件的 imbb 不是写入文件的正确类型。
你能在你的 for 循环之后尝试这样的事情,看看会发生什么吗?
frame = getframe(figure);
image = frame2im(frame);
imwrite(image, 'test.jpg');
最终,您想将 imwrite 移动到 for 循环中,以便可以批处理它。
您可以在 for 循环之前声明一个文件名,例如:
basename = 'MyFileName-';
然后在 for 循环中,你会做类似
的事情
filename = [basename, num2str(i)];
imwrite(image, filename);
我使用 insertShape 函数解决了这个问题。完整的函数变成如下:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 3);
BBvalues = step(FDetect,im);
hold on
for i = 1:size(BBvalues,1)
BBimage = insertShape (im,'rectangle',BBvalues(i,:),'Color','yellow');
end
hold off;
results.Values3=BBvalues;
results.Image3=BBimage;
end
当此功能应用于 Batch Image Processor 应用程序中的一批图像时,'export results of all processed images to files' 按钮允许您保存包括边界框矩形在内的图像。它使用原始文件名和附加的“_Image3”保存每个图像。
我现在正在使用这段代码来测试最有效的阈值,这就是为什么我将它们命名为 Values3 和 Image3 参考阈值 3。它工作正常!
我是 Matlab 的新手,我正在尝试对一批图像执行人脸检测。我正在使用这个简单的 face detection code,它与图像处理工具箱和计算机视觉工具箱一起使用。我正在使用 Batch Image Processor App 并将我的代码编写为应用于一批图像的函数。作为结果,我需要的是每个边界框的四个值(这有效),我想保存每个绘制边界框的图像,以检查是否正确检测到面部(这不起作用)。这是函数:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 5);
BBface = step(FDetect,im);
figure,
imbb = imshow(im); hold on
for i = 1:size(BBface,1)
rectangle('Position',BBface(i,:),'LineWidth',2,'LineStyle','-
','EdgeColor','r');
end
hold off;
imwrite(imbb,'test.jpg'); %this is the line that doesn't work
results.face=BBface; %this gives me the values of each bounding box
end
当我应用此函数时,它会为我提供边界框的值,并且在 imshow 中它会显示面部周围带有边界框的图像。但是,imwrite 函数不起作用并出现以下错误:
Error using imwrite (line 420) Expected DATA to be one of these types:
numeric, logical
Instead its type was matlab.graphics.primitive.Image.
Error in facedetection (line 13) imwrite(imbb,'test.jpg');
有谁知道如何解决这个问题?是否可以使用 Batch Image Processor 应用程序保存所有带有边界框的图像?如果可以,如何保存?是否也可以在不使用 imshow 的情况下保存图像?我不必直接看到结果,只要我能保存它们即可。
如果这个问题太模糊,我很抱歉,但我希望有人能进一步帮助我。
编辑:我发现只要将图像放入结果中,就可以使用批处理图像处理器来保存图像。函数中的字符串(参见 documentation),但我不知道该怎么做。我更改了我的代码如下:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 5);
BBface = step(FDetect,im);
figure,
imbb = imshow(im); hold on
for i = 1:size(BBface,1)
rectangle('Position',BBface(i,:),'LineWidth',2,'LineStyle','-
','EdgeColor','r');
end
hold off;
BBimage = imfuse (im, BBface); %this doesn't work
results.BBValues=BBface;
results.BBimage=BBimage;
end
此代码 returns 一个完整的绿色调图像 (?!)。所以 imfuse 部分可能出了问题。如何将 im 和绘制的矩形放在 BBimage 中?
这意味着您尝试写入文件的 imbb 不是写入文件的正确类型。
你能在你的 for 循环之后尝试这样的事情,看看会发生什么吗?
frame = getframe(figure);
image = frame2im(frame);
imwrite(image, 'test.jpg');
最终,您想将 imwrite 移动到 for 循环中,以便可以批处理它。
您可以在 for 循环之前声明一个文件名,例如:
basename = 'MyFileName-';
然后在 for 循环中,你会做类似
的事情filename = [basename, num2str(i)];
imwrite(image, filename);
我使用 insertShape 函数解决了这个问题。完整的函数变成如下:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 3);
BBvalues = step(FDetect,im);
hold on
for i = 1:size(BBvalues,1)
BBimage = insertShape (im,'rectangle',BBvalues(i,:),'Color','yellow');
end
hold off;
results.Values3=BBvalues;
results.Image3=BBimage;
end
当此功能应用于 Batch Image Processor 应用程序中的一批图像时,'export results of all processed images to files' 按钮允许您保存包括边界框矩形在内的图像。它使用原始文件名和附加的“_Image3”保存每个图像。 我现在正在使用这段代码来测试最有效的阈值,这就是为什么我将它们命名为 Values3 和 Image3 参考阈值 3。它工作正常!