Алгоритм: -
Мое решение реализует свою задачу, используя следующий алгоритм:
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, основанные на Алгоритм 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
Для вашего изображения, так как это работает, вы можете проверить, является ли глаза были правильно обнаружены или нет. В результате получается следующее, что правильно: -
Пожалуйста показать пример изображения лица, чтобы мы могли правильно запустить код на нашей стороне. В частности, загрузите '100_3082.jpg'. – rayryeng
@rayryeng Я прикрепил изображение 100_3082.jpg – Tejashree
Разве вы не хотели писать 'img' вместо' I' здесь: 'I = imread ('100_3082.jpg');' –