Code:
#!/usr/bin/env python
import sys
import os
import traceback
import shutil
from learnFunctions import *
class MyOCR(object):
def __init__(self, startAs):
try:
self.startAs=startAs.lower()
self.logging=True
self.userName=os.environ.get('UserName')
self.logFile="C:\\Users\\"+self.userName+"\\Documents\\log.txt"
self.folderPictures="C:\\Users\\"+self.userName+"\\Pictures\\"
self.folderDocuments="C:\\Users\\"+self.userName+"\\Documents\\"
self.folderScreenshots=self.folderPictures+"Frontier Developments\\Elite Dangerous\\"
self.screenshotDimensions=3
self.screenshotHeight=1080
self.screenshotWidth=1920
self.screenshotDepth=3
self.possibleAnswers=['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',' ','0','1','2','3','4','5','6','7','8','9', ',', '.', '-', ')', '(']
self.folderCandidatesSmall=self.folderPictures+"Candidates\\Small\\"
self.folderCandidatesLarge=self.folderPictures+"Candidates\\Large\\"
self.folderCandidatesNumbers=self.folderPictures+"Candidates\\Numbers\\"
if not os.path.isdir(self.folderCandidatesLarge):
os.makedirs(self.folderCandidatesLarge)
if not os.path.isdir(self.folderCandidatesSmall):
os.makedirs(self.folderCandidatesSmall)
if not os.path.isdir(self.folderCandidatesNumbers):
os.makedirs(self.folderCandidatesNumbers)
self.stripesHor=[]#to detect stripes on a commidity page
#[fromWidthPos,heightPos,toWidthPos]
self.stripesHor.append([146,190,1084])
self.stripesHor.append([146,191,1084])
self.stripesHor.append([146,263,1084])
self.stripesHor.append([1090,190,1240])
self.stripesHor.append([1090,191,1240])
self.stripesHor.append([1090,263,1240])
self.stripesHor.append([146,944,1278])
#thresholds: to find red
self.thresholdsStripes=[210,255,80,105,0,10]#minR, maxR, minG, maxG, minB, maxB
#largeletterstuff
self.largeLettersBox=[145,105,1222,125]#left, top, right, bottom
self.largeLetterSpaceWidthMin=10#normally 12
self.largeLetterSpaceWidthMax=14#larger? EOL
#thresholds: to find white
self.thresholdsLargeLetters=[118,255,104,255,104,255]#minR, maxR, minG, maxG, minB, maxB
#title
self.titleBox=[145,130,1800,151]#left, top, right, bottom
self.titleSpaceWidthMin=4#normally 5
self.titleSpaceWidthMax=10#larger? EOL
self.thresholdsTitle=[125,255,45,110,0,20]#minR, maxR, minG, maxG, minB, maxB
if self.startAs=='search':
self.mainSearch()
elif self.startAs=='learn':
self.mainLearn()
elif self.startAs=='analyse':
self.mainAnalyse()
else:
sys.exit('Unknown startup parameter')
except:
print traceback.format_exc()
sys.exit()
print '\nDone\n'
def mainSearch(self):
try:
self.fileList=getScreenShotList(self)
if len(self.fileList)==0:
print 'Folder has no screenshots:\n'+self.folderScreenshots
sys.exit()
for screenFile in self.fileList:
self.currentFile=screenFile
img=Image.open(self.folderScreenshots+screenFile)
imgArray=np.asarray(img)
del img#dont need image anymore, delete from memory
fileDimensions=imgArray.shape#h, w, depth
skipThisFile=False
if not len(fileDimensions)==self.screenshotDimensions:
skipThisFile=True
elif not (fileDimensions[0]==self.screenshotHeight and fileDimensions[1]==self.screenshotWidth and fileDimensions[2]==self.screenshotDepth):
skipThisFile=True
if skipThisFile:
print 'Ignoring file '+screenFile+' Wrong dimensions: '+str(fileDimensions)+':'
print ' Screenshot dimensions should be: (1080L, 1920L, 3L)'
else:
if findStripes(self, imgArray):
print 'Doing file '+screenFile
letterPositions=findLargeCandidates(self, imgArray)
for i in letterPositions:
fw=i[0][0]
fh=i[0][1]
tw=i[1][0]
th=i[1][1]
saveCandidate(self, filterForColor(self, imgArray[fh:th,fw:tw], self.thresholdsLargeLetters), self.folderCandidatesLarge)
letterPositions2=findTitleCandidates(self, imgArray)
for i in letterPositions2:
fw=i[0][0]
fh=i[0][1]
tw=i[1][0]
th=i[1][1]
saveCandidate(self, filterForColor(self, imgArray[fh:th,fw:tw], self.thresholdsTitle), self.folderCandidatesSmall)
else:
print 'Ignoring file '+screenFile +':\n No stripes found, not a commodity-list'
except:
print traceback.format_exc()
sys.exit()
def mainLearn(self):
try:
self.screenSize=(1750,80)#(width, height)
self.fontName='comicsansms'
self.fontSize=24
self.colorBackground=(50,40,55)
self.colorCurrentMarker=(255,10,10)
self.colorLettersDone=(0, 128, 0)
self.marginTop=10
self.spacing=30#distance between upper and lower letters
self.letterWidth=20
self.letterHeight=20
self.marginMarker=5
self.marginLetter=5
self.middlePos=(int((self.screenSize[0]/2)-(self.letterWidth/2)),self.marginTop)
self.markerBox=(self.middlePos[0]-self.marginMarker,self.middlePos[1]-self.marginMarker,self.letterWidth+self.marginMarker,self.letterHeight*2+4*self.marginMarker)#(left, top, width, height)
self.markerThickness=3
self.caption='OCR Learner'
learnPart(self, self.folderCandidatesLarge)
learnPart(self, self.folderCandidatesSmall)
learnPart(self, self.folderCandidatesNumbers)
except:
print traceback.format_exc()
sys.exit()
def mainAnalyse(self):
try:
self.folderData=self.folderDocuments+"Data\\"
if os.path.isdir(self.folderData):#delete old analyse data, if any
shutil.rmtree(self.folderData)
os.makedirs(self.folderData)
self.folderDataLarge=self.folderData+'Large\\'
self.folderDataSmall=self.folderData+'Small\\'
self.folderDataNumbers=self.folderData+'Numbers\\'
os.makedirs(self.folderDataLarge)
os.makedirs(self.folderDataSmall)
os.makedirs(self.folderDataNumbers)
analysePart(self, self.folderDataLarge, self.folderCandidatesLarge)
analysePart(self, self.folderDataSmall, self.folderCandidatesSmall)
analysePart(self, self.folderDataNumbers, self.folderCandidatesNumbers)
except:
print traceback.format_exc()
sys.exit()
if __name__ == '__main__':
try:
if len(sys.argv)==2 and sys.argv[1].lower()=='search':#search for new data to be analized
MyOCR('search')
elif len(sys.argv)==2 and sys.argv[1].lower()=='learn':#tell computer what data is
MyOCR('learn')
elif len(sys.argv)==2 and sys.argv[1].lower()=='analyse':#analyze data for ocr use
MyOCR('analyse')
else:
print '\n Usage\n'
print ' To search for data to learn & analyse:'
print 'python '+sys.argv[0]+ ' search\n'
print ' To start learning (tell the computer what the data really is):'
print 'python '+sys.argv[0]+ ' learn\n'
print ' To start analysing current data:'
print 'python '+sys.argv[0]+ ' analyse\n'
print ' or'
print 'python '+sys.argv[0]+ ' ocr'
except:
print traceback.format_exc()
sys.exit()