Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| #******************************* | |
| # dokme black tanha baraye halate tasvir ghabele estefade ast na baraye halate mogheyat. | |
| # dar halate mogheyat darsurat eshtebah dar rasm bayad kole safhe pak shavad | |
| #******************************* | |
| from os import environ | |
| environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1' | |
| import pygame | |
| from pygame.locals import * | |
| import time | |
| import os | |
| import numpy as np | |
| import random | |
| import cv2 | |
| from keras.models import load_model | |
| import math | |
| class Graphic: | |
| Button_state={"Color": "White"} | |
| x_y_of_number=[] | |
| data=[] | |
| def __init__(self): | |
| pygame.init() | |
| #infoObject = pygame.display.Info() | |
| #self.screen = pygame.display.set_mode((infoObject.current_w, infoObject.current_h),FULLSCREEN) | |
| self.screen = pygame.display.set_mode((960, 540)) | |
| self.clock = pygame.time.Clock() | |
| pygame.display.set_caption('BlackBoard') | |
| self.image = pygame.image.load("screen_bar.jpg") | |
| self.black_mask=pygame.Surface((960,466)) | |
| self.black_mask.fill((0,0,0)) | |
| #self.image = pygame.transform.scale(self.image, (720, 480)) | |
| self.screen.blit(self.image, (0, 466)) | |
| self.radius = 10 | |
| self.ball_surface = pygame.Surface((self.radius*2,self.radius*2)) | |
| self.ball_surface.set_colorkey((0, 0, 0)) | |
| self.ball_surface = self.ball_surface.convert_alpha() | |
| pygame.draw.circle(self.ball_surface, (0,255,0), (self.radius,self.radius), self.radius, 2) | |
| self.Color_ball_surface = pygame.Surface((self.radius*2,self.radius*2)) | |
| self.Color_ball_surface.set_colorkey((0, 0, 0)) | |
| self.Color_ball_surface = self.ball_surface.convert_alpha() | |
| pygame.draw.circle(self.Color_ball_surface, (255,255,255), (self.radius,self.radius), self.radius, self.radius) | |
| # self.myfont = pygame.font.SysFont("Arial", 22) | |
| # self.Line_txt_surface = self.myfont.render("1", False, (225, 255, 255)) | |
| self.model = load_model('MNIST_CNN.h5') | |
| #self.model = load_model('MNIST_LSTM.h5') #RNN | |
| self.brush=None | |
| self.Hold=False | |
| self.Button="white" | |
| self.last_brush=(0,0) | |
| self.img_counter=0 | |
| self.folder_name=time.time() | |
| def mouse_rectangle(self): | |
| buttons_rectangle = {} | |
| buttons_rectangle["Black_pos"]=[(317,502),(331,518)] | |
| buttons_rectangle["White_pos"]=[(334,502),(349,518)] | |
| buttons_rectangle["Eraser_pos"]=[(354,502),(396,518)] | |
| buttons_rectangle["Save_pos"]=[(227,485),(257,515)] | |
| for event in pygame.event.get(): | |
| if(event.type==pygame.MOUSEBUTTONDOWN): | |
| for P in buttons_rectangle: | |
| if(buttons_rectangle[P][0][0]<event.pos[0]<buttons_rectangle[P][1][0] and buttons_rectangle[P][0][1]<event.pos[1]<buttons_rectangle[P][1][1]): | |
| self.Button=P.replace("_pos",'') | |
| if(event.button == 1): | |
| self.brush=event.pos | |
| elif(event.type == pygame.MOUSEBUTTONUP): | |
| if(event.button == 1): | |
| self.brush = None | |
| elif(event.type==pygame.MOUSEMOTION): | |
| if self.brush: | |
| self.brush = event.pos | |
| #print(self.brush) | |
| def Buttons_check(self): | |
| if(self.Button=="White"): | |
| Graphic.Button_state["Color"]="White" | |
| elif(self.Button=="Black"): | |
| Graphic.Button_state["Color"]="Black" | |
| elif(self.Button=="Eraser"): | |
| Graphic.Button_state["Color"]="Eraser" | |
| elif(self.Button=="Save"): | |
| Graphic.Button_state["Color"]="Save" | |
| self.Button="" #reset | |
| def draw(self): | |
| #print(Graphic.Button_state) | |
| B_P=Graphic.Balls_pos() | |
| self.screen.blit(self.ball_surface, B_P[Graphic.Button_state["Color"]]) | |
| if(self.brush): | |
| self.screen.blit(self.Color_ball_surface,self.brush) | |
| if(Graphic.Button_state["Color"]=="Eraser"): | |
| self.screen.blit(self.black_mask,(0,0)) | |
| Graphic.Button_state["Color"]="White" | |
| Graphic.x_y_of_number.clear() | |
| Graphic.data.clear() | |
| elif(Graphic.Button_state["Color"]=="White"): | |
| pygame.draw.circle(self.Color_ball_surface, (255,255,255), (self.radius,self.radius), self.radius, self.radius) | |
| elif(Graphic.Button_state["Color"]=="Black"): | |
| pygame.draw.circle(self.Color_ball_surface, (0,0,0), (self.radius,self.radius), self.radius, self.radius) | |
| def pygame_to_opencv(self): | |
| view_ROI = pygame.surfarray.array3d(self.screen) | |
| view_ROI = view_ROI.transpose([1, 0, 2]) #convert from (width, height, channel) to (height, width, channel) | |
| view_ROI=view_ROI[0:466,0:] | |
| self.img_bgr = cv2.cvtColor(view_ROI, cv2.COLOR_RGB2BGR) | |
| self.img_gray= cv2.cvtColor(view_ROI,cv2.COLOR_RGB2GRAY) | |
| #cv2.imshow("img_gray",self.img_gray) | |
| def hand_writing_detection_using_pictures_CNN(self): | |
| contours,hierarchy = cv2.findContours(self.img_gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#_NONE | |
| if len(contours)>0: | |
| #cv2.drawContours(self.img_bgr, contours, -1, (0,255,0), 5) | |
| # find the biggest countour (c) by the area | |
| #c = max(contours, key = cv2.contourArea) | |
| num_rec= 0 | |
| for cnt in contours: | |
| x,y,w,h = cv2.boundingRect(cnt) | |
| if (w>28 and h>28): | |
| num_rec+=1 | |
| #print(num_rec) | |
| roi= self.img_gray[y:y+h,x:x+w] | |
| #roi=np.pad(roi, 5, mode='constant', constant_values=0) | |
| roi=roi/255 #normalization | |
| #cv2.imshow('ROI',roi) | |
| gray_small = cv2.resize(roi, (28, 28)) | |
| gray_small = gray_small.reshape(1,28,28,1) | |
| pred=self.model.predict(gray_small) | |
| max_pred=np.amax(pred) | |
| pred_number=np.argmax(pred,axis=1) | |
| if(pred_number!=10):# and max_pred>0.90): | |
| LABEL_COLOR = (0,255,0) | |
| LABEL_TEXT = str(pred_number)+"="+str(max_pred) | |
| cv2.rectangle(self.img_bgr,(x,y),(x+w,y+h),(255,0,0),1) | |
| cv2.putText(self.img_bgr, LABEL_TEXT, (x, y-8), cv2.FONT_HERSHEY_SIMPLEX, 1/2, LABEL_COLOR, 2) | |
| def hand_writing_detection_using_pictures_RNN(self): | |
| contours,hierarchy = cv2.findContours(self.img_gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#_NONE | |
| if len(contours)>0: | |
| #cv2.drawContours(self.img_bgr, contours, -1, (0,255,0), 5) | |
| # find the biggest countour (c) by the area | |
| #c = max(contours, key = cv2.contourArea) | |
| num_rec= 0 | |
| for cnt in contours: | |
| x,y,w,h = cv2.boundingRect(cnt) | |
| if (w>28 and h>28): | |
| num_rec+=1 | |
| #print(num_rec) | |
| roi= self.img_gray[y:y+h,x:x+w] | |
| #roi=np.pad(roi, 5, mode='constant', constant_values=0) | |
| roi=roi/255 #normalization | |
| #cv2.imshow('ROI',roi) | |
| gray_small = cv2.resize(roi, (28, 28)) | |
| gray_small=np.expand_dims(gray_small, axis=0) | |
| pred=self.model.predict(gray_small) | |
| max_pred=np.amax(pred) | |
| pred_number=np.argmax(pred,axis=1) | |
| if(pred_number!=10):#and max_pred>0.90): | |
| LABEL_COLOR = (0,255,0) | |
| LABEL_TEXT = str(pred_number)+"="+str(max_pred) | |
| cv2.rectangle(self.img_bgr,(x,y),(x+w,y+h),(255,0,0),1) | |
| cv2.putText(self.img_bgr, LABEL_TEXT, (x, y-8), cv2.FONT_HERSHEY_SIMPLEX, 1/2, LABEL_COLOR, 2) | |
| def get_hand_writing_coordinates(self): | |
| if(self.brush): | |
| if(self.brush[1]<466): | |
| if(Graphic.x_y_of_number): | |
| if(Graphic.x_y_of_number[-1]!=self.brush): | |
| self.Hold=True | |
| Graphic.x_y_of_number.append(self.brush) | |
| else: | |
| Graphic.x_y_of_number.append(self.brush) | |
| else: | |
| if(self.Hold==True): | |
| self.Hold=False | |
| Graphic.data.append(Graphic.x_y_of_number) | |
| Graphic.x_y_of_number=[] | |
| #print(len(Graphic.data),Graphic.x_y_of_number) | |
| def flatten(t): | |
| return [item for sublist in t for item in sublist] | |
| def save(self): | |
| if(Graphic.Button_state["Color"]=="Save"): | |
| #print(Graphic.data) | |
| #print(Graphic.flatten(Graphic.data)) | |
| np.savez("dataset/normal_data"+str(time.time()),np.array(Graphic.data,dtype=object)) | |
| np.savez("dataset/flatten_data"+str(time.time()),np.array(Graphic.flatten(Graphic.data),dtype=object)) | |
| Graphic.Button_state["Color"]="Eraser" | |
| def Balls_pos(): | |
| Ball_pos = { | |
| "White":(332,500), | |
| "Black":(313,500), | |
| "Eraser":(352,500), | |
| "Save":(232,490) | |
| } | |
| return Ball_pos | |
| class Main: | |
| def __init__(self): | |
| Graphic.__init__(self) | |
| def run(self): | |
| x=0 | |
| y=0 | |
| c=1 | |
| #n=0 | |
| while True: | |
| self.screen.blit(self.image, (0, 466)) #clean_screen | |
| #pos=pygame.mouse.get_pos() | |
| keyState = pygame.key.get_pressed() | |
| Graphic.mouse_rectangle(self) | |
| Graphic.Buttons_check(self) | |
| Graphic.draw(self) | |
| Graphic.pygame_to_opencv(self) | |
| Graphic.get_hand_writing_coordinates(self) | |
| Graphic.save(self) | |
| # if (keyState[pygame.K_r]): #press R to detect | |
| # Graphic.hand_writing_detection_using_coordinates(self) | |
| if (keyState[pygame.K_c]): #press C to detect | |
| Graphic.hand_writing_detection_using_pictures_CNN(self) | |
| #Graphic.hand_writing_detection_using_pictures_RNN(self) | |
| if (keyState[pygame.K_ESCAPE] or cv2.waitKey(1) & 0xFF == ord('q')): | |
| pygame.quit() | |
| break | |
| #quit() | |
| # if (keyState[pygame.K_RIGHT]): | |
| # x+=1 | |
| # if (keyState[pygame.K_LEFT]): | |
| # x-=1 | |
| # if (keyState[pygame.K_UP]): | |
| # y-=1 | |
| # if (keyState[pygame.K_DOWN]): | |
| # y+=1 | |
| # self.screen.blit(self.ball_surface,(x,y)) | |
| # print((x,y)) | |
| #self.img_bgr = cv2.resize(self.img_bgr, (480, 270)) | |
| cv2.imshow("out_put",self.img_bgr) | |
| milliseconds=self.clock.tick(30) # fps=30 | |
| pygame.display.flip() | |
| # Execute: | |
| Main().run() | |
| cv2.destroyAllWindows() | |