0

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

+0

Пожалуйста показать пример изображения лица, чтобы мы могли правильно запустить код на нашей стороне. В частности, загрузите '100_3082.jpg'. – rayryeng

+0

@rayryeng Я прикрепил изображение 100_3082.jpg – Tejashree

+0

Разве вы не хотели писать 'img' вместо' I' здесь: 'I = imread ('100_3082.jpg');' –

ответ

3

Алгоритм: -
Мое решение реализует свою задачу, используя следующий алгоритм:

1. Поиск позиции обоих глаз.
2. Поиск угла между ними.
3. Поворот изображения на основе этого угла.

входного изображения: -
Входное изображение этого кода является тот, который вы получаете в конце вашего кода т.е. Q.

input

Код: -

% 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))))); 

Выход: -

Output


P.S:
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 

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

eyes detection

+0

Это прекрасно. Я думал, что для этого есть встроенная функция. но спасибо! Это для меня что-то новое. Сейчас я изучу этот код. :) – Tejashree

+0

Вы можете объяснить эту строку? 'BBLEye (1) = BBLEye (1) + п;' Что это значит? Если я запускаю один и тот же код для любого другого изображения, он дает мне эту ошибку _Attempted для доступа к BBLEye (1); index out of bounds, потому что numel (BBLEye) = 0_ – Tejashree

+0

@Emma Я уже объяснил эту строку в комментариях! так как я разделил изображение на две части, поэтому координата x правой половины начнется с 0, но на самом деле она должна начинаться с некоторого другого значения в зависимости от последнего значения левой половины изображения !! '1' указывает первый член« BBLEye », который является x-координатой. Что касается ошибки, я уже упоминал, что она зависит от точности обнаружения глаз! Никакое обнаружение или неправильное обнаружение не приведет к ошибкам/неправильным результатам. Но если вы правильно определяете лицо, то, скорее всего, он будет работать –