【问题标题】:How to straighten a tilted face after cropping?裁剪后如何拉直倾斜的脸?
【发布时间】:2017-01-10 19:25:59
【问题描述】:

我正在做一个关于面部特征提取的项目。我为直方图均衡、人脸检测和人脸裁剪编写了 MATLAB 代码。现在我想在倾斜的情况下拉直脸部。你能帮我看看 MATLAB 代码吗?这是我目前写的代码。

clear all
clc

I=imread('100_3082.jpg');
figure(1)
imshow(I);
J=rgb2gray(I);
figure(2)
imshow(J);                                                             
P = histeq(J);
figure(3)
imshow(P);

FDetect = vision.CascadeObjectDetector;

BB = step(FDetect,P);
hold on
for i = 1:size(BB,1)
rectangle('Position',BB(i,:),'LineWidth',5,'LineStyle','-','EdgeColor','r');

end
for i = 1:size(BB,1)
Q= imcrop(P,BB(i,:));
figure(4)
imshow(Q);
end
title('Face Detection');   

hold off;

这是我正在处理的图像('100_3082.jpg'):-

【问题讨论】:

  • 请显示一个示例面部图像,以便我们可以正确运行我们的代码。具体请上传100_3082.jpg
  • @rayryeng 我已附上图片 100_3082.jpg
  • 你不是要写img而不是I这里:I=imread('100_3082.jpg');
  • 是的......你是对的......完成了更正。 @Sardar_Usama
  • 您需要定位面部特征:眼睛、鼻子、嘴巴,这样您才能将面部与“标准”姿势对齐。

标签: matlab image-processing computer-vision face-detection cascade-classifier


【解决方案1】:

算法:-
我的解决方案使用以下算法实现您的任务:

1. 找到双眼的位置。
2. 找到它们之间的角度。
3. 根据该角度旋转图像。

输入图像:-
此代码的输入图像是您在代码末尾得到的图像,即Q

代码:-

% Dividing the image in two halves for better detection
% To see why , see this: https://www.mathworks.com/matlabcentral/answers/155126-how-does-the-vision-cascadeobjectdetector-detect-left-and-right-eyes-separately-it-is-constantly-de
n = fix(size(Q,2)/2);
lefthalf = Q(:,1:n,:);
righthalf = Q(:,n+1:end,:);

RightEyeDetect = vision.CascadeObjectDetector('RightEyeCART');
LeftEyeDetect = vision.CascadeObjectDetector('LeftEyeCART');
% vision.CascadeObjectDetector(EyePairBig) is not much efficient in this case
% because the image is tilted. So, detecting both eyes separately.

%Bounding Boxes
BBREye= step(RightEyeDetect,lefthalf); %Right eye is on our left
BBLEye= step(LeftEyeDetect,righthalf); %Left eye is on our right
BBLEye(1)=BBLEye(1)+n; %correcting the x position of left eye (caused due to dividing the image in two halves)

figure
imshow(imrotate(Q,(180/pi)*atan((BBREye(2)-BBLEye(2))/(BBREye(1)-BBLEye(1)))));

输出:-


附注:
1. 这可能不是一个完美的解决方案。
2. 假设只有一个倾斜面需要校正。
3. 此解决方案的准确性取决于内置 MATLAB 函数(基于 Viola-Jones 算法)的眼睛检测精度, 被使用。
4.如果此代码失败,您可以通过添加以下行来检查眼睛是否被正确检测到:

BBEyes= [BBLEye ; BBREye];
figure,
imshow(Q); 
for i = 1:size(BBEyes,1)
 rectangle('Position',BBEyes(i,:),'LineWidth',4,'LineStyle','-','EdgeColor','r');
end

对于您的图像,由于这有效,您仍然可以检查是否正确检测到眼睛。结果如下是正确的:-

【讨论】:

  • 这是完美的。我认为有一个内置函数可以做到这一点。但是谢谢!这对我来说是新事物。我现在将研究代码。 :)
  • 你能解释一下这行吗? 'BBLEye(1)=BBLEye(1)+n;'那1代表什么?如果我对任何其他图像运行相同的代码,它会给我这个错误 Attempted to access BBLEye(1);索引超出范围,因为 numel(BBLEye)=0
  • @Emma 我已经在 cmets 中解释了该行!由于我将图像分为两部分,因此右半部分的 x 坐标将从 0 开始,但它实际上应该从其他值开始,具体取决于图像左半部分的最后一个值! 1 表示 BBLEye 的第一项,即 x 坐标。关于误差,我已经提到它取决于眼睛检测的准确性!没有检测或错误检测将导致错误/不正确的结果。但如果你正确检测到人脸,它很可能会起作用
猜你喜欢
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 2021-03-29
  • 2014-01-25
  • 2014-05-30
  • 1970-01-01
  • 2016-01-01
  • 2016-12-23
相关资源
最近更新 更多