# -*- coding: utf-8 -*-
"""
Autor: MICHAL KOUPIL
"""
##TÍMTO ALGORITMEM BYLA TESTOVÁNA METODA PCA PRO PŘÍPAD, KDY JIŽ NA VSTUPNÍ SADĚ OBRAZŮ
#BYLY DETEKOVÁNY OBLIČEJE

import sys 
sys.path.append('/Users/michal.koupil/AppData/Local/Programs/Python/Python37/Lib/site-packages')

import os
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from sklearn.decomposition import PCA
import math
import time
start_time = time.time()

#načtení trénovací sady obrazů
cropped_images=[]
images=[]
for i in os.listdir('trenovaci_sada_10/'): 
	images.append(cv.imread('trenovaci_sada_10/{0}'.format(i),0))
    
images = [x for x in images if x is not None]
images_orig = np.array(images,dtype=object)  
    
widths = []
heights = []
for i in range(len(images)):
    widths.append(images[i].shape[0])
    heights.append(images[i].shape[1])
    

#změna měřítka obrazů    
m1 = min(heights)
m2 = min(widths)
resized = []
for i in range(len(images)):
    resized.append(cv.resize(images[i],(m1,m2)))

#převedení testovací sady obrazů do PCA matice
eigenvectors=[]
for i in range(len(images)):
    eigenvectors.append(resized[i].flatten())
eigenvectors = np.array(eigenvectors)
pca = PCA().fit(eigenvectors)

#výběr nejvýznamnějších komponent
sig = pca.components_[:round(len(images)/6)]  

#zobrazení 25 nejvýznamnějších eigenfaces
'''
s1=5
s2=5
fig, axes = plt.subplots(s1,s2,figsize=(10,10))
for i in range(s1*s2):
    axes[i%s1][i//s2].imshow(sig[i].reshape(m1,m2), cmap="gray")
plt.show()'''

#spočítání váhy pro vstupy
weights = sig @ (eigenvectors - pca.mean_).T

#načtení a lokalizace obličejů v rámci testovací sady
images_test=[]
for i in os.listdir('testovaci_sada_10/'): 
	images_test.append(cv.imread('testovaci_sada_10/{0}'.format(i),0))
    

resized_test = []
for i in range(len(images_test)):
    resized_test.append(cv.resize(images_test[i],(m1,m2)))
    
a=[]
a=list(range(0,len(images)))
a=np.array(a)

match_counter=0
image = []
pos = [0] 

#výpočet podobnosti testovacího obrazu s trénovací sadou
for i in range(len(images_test)):
    testing_image = images_test[i]
    testing_pic = resized_test[i].flatten()
    testing_pic_weight = sig @ (testing_pic - pca.mean_).T
    euc_dist = []
    for j in range(weights.shape[1]):
        dist = np.linalg.norm(weights[:,j] - testing_pic_weight)
        euc_dist.append(dist)

    #nejlepší shoda
    min_dist = np.argmin(euc_dist)
    image = np.array(images[min_dist],dtype=object)
    for j in range(len(images_orig)):
        if (np.array_equal(image, images_orig[j])) == True:
            pos.append(j)
    fig, axes = plt.subplots(1,2,figsize=(10,6))
    axes[0].imshow(testing_image, cmap="gray")
    axes[0].set_title("testing picture - person " + str(a[i+1]))
    axes[1].imshow(images[min_dist], cmap="gray")
    axes[1].set_title("BEST MATCH")

len_im_test = str(len(images_test))
print("--- %s seconds ---" % (time.time() - start_time))
