import cv2
import numpy as np
from scipy.sparse.construct import random
import seaborn as sb
from sklearn.datasets import fetch_openml
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from PIL import Image
import PIL.ImageOps 
import pandas as pd

X=np.load('image.npz')['arr_0']
y=pd.read_csv("labels.csv")["labels"]
print(pd.Series(y).value_counts())
classes=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
nclasses=len(classes)

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=5000,random_state=42)
X_train_scaled=X_train/255.0
X_test_scaled=X_test/255.0

clas=LogisticRegression(solver='saga',multi_class='multinomial').fit(X_train_scaled,y_train)

y_pred=clas.predict(X_test_scaled)
accur=accuracy_score(y_test,y_pred)
print("The accuracy is: ",accur)

cap=cv2.VideoCapture(0)
while(True):
    try:
        ret,frame=cap.read()
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        height,width=gray.shape
        upper_left=(int(width/2-56),int(height/2-56))
        bottom_right=(int(width/2+56),int(height/2+56))
        cv2.rectangle(gray,upper_left,bottom_right,(0,255,0),2)

        roi=gray[upper_left[1]:bottom_right[1],upper_left[0]:bottom_right[0]]

        im_pil=Image.fromarray(roi)
        image=im_pil.convert('L')
        image_resized=image.resize((28,28),Image.ANTIALIAS)
        image_resized_inverted=PIL.ImageOps.invert(image_resized)

        pixel_filter=20
        min_pixel=np.percentile(image_resized_inverted,pixel_filter)

        image_resized_inverted_scaled=np.clip(image_resized_inverted-min_pixel,0,255)
        max_pixel=np.max(image_resized_inverted)

        image_resized_inverted_scaled=np.asarray(image_resized_inverted_scaled)/max_pixel

        test_sample=np.array(image_resized_inverted_scaled).reshape(1,784)
        test_pred=clas.predict(test_sample)
        print("The predicted class is: ",test_pred)

        cv2.imshow('Digit Recogniser',gray)
        if cv2.waitkey(1) & 0xFF==ord('q'):
            break
    except Exception as e:
        pass

cap.release()
cv2.destroyAllWindows()