Как выровнять наклоненное лицо после кадрирования?

Я делаю проект по извлечению черт лица. Я написал код 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


person Tejashree    schedule 02.09.2016    source источник
comment
Пожалуйста, покажите пример изображения лица, чтобы мы могли правильно запустить код на нашей стороне. В частности, загрузите 100_3082.jpg.   -  person rayryeng    schedule 02.09.2016
comment
@rayryeng я приложил изображение 100_3082.jpg   -  person Tejashree    schedule 03.09.2016
comment
Разве ты не хотел написать img вместо I здесь: I=imread('100_3082.jpg');   -  person Sardar Usama    schedule 04.09.2016
comment
да...вы правы...сделал поправку. @Sardar_Usama   -  person Tejashree    schedule 04.09.2016
comment
вам нужно найти черты лица: глаза, нос, рот, чтобы вы могли выровнять лицо в каноническую позу.   -  person Shai    schedule 04.09.2016
comment
спасибо @Shai, я попробую.   -  person Tejashree    schedule 06.09.2016


Ответы (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)))));

Вывод:-

Вывод


P.S.
1. Возможно, это не идеальное решение.
2. Предполагается, что нужно исправить только одно наклоненное лицо.
3. Точность этого решения зависит от точности обнаружения глаз, для которых работают встроенные функции MATLAB, основанные на алгоритме Виолы-Джонса. , используются.
4. В случае, если этот код не работает, вы можете проверить, правильно ли были обнаружены глаза, добавив следующие строки:

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

Для вашего изображения, поскольку это сработало, вы все равно можете проверить, правильно ли были обнаружены глаза или нет. Результат следующий, который является правильным: -

обнаружение глаз

person Sardar Usama    schedule 04.09.2016
comment
Это потрясающе. Я думал, что для этого есть встроенная функция. но спасибо! Это что-то новое для меня. Сейчас буду изучать код. :) - person Tejashree; 06.09.2016
comment
можешь объяснить эту строчку? 'BBLEye(1)=BBLEye(1)+n;' Что означает эта 1? Если я запускаю тот же код для любого другого изображения, он выдает эту ошибку Попытка доступа к BBLEye(1); индекс выходит за пределы, потому что numel(BBLEye)=0 - person Tejashree; 06.09.2016
comment
@Emma Я уже объяснил эту строчку в комментариях! так как я разделил изображение на две части, поэтому x-координата правой половины будет начинаться с 0, но на самом деле она должна начинаться с какого-то другого значения в зависимости от последнего значения левой половины изображения!! 1 указывает на первый член BBLEye, который является координатой x. Что касается ошибки, я уже упоминал, что она зависит от точности определения глаз! Отсутствие обнаружения или неправильное обнаружение приведет к ошибкам/неправильным результатам. Но если вы правильно определите лицо, скорее всего, это сработает. - person Sardar Usama; 06.09.2016