import logging as log from grid import Grid from go import Go class ImageAnalyzer: def __init__(self,tresB=30,tresW=60): self.board=[[Go.EMPTY]*19 for r in range(19)] self.grid=None self.tresB=tresB self.tresW=tresW # let's not concern ourselves with sizecoef and shift here anymore. we want corners to come already properly recomputed def analyze(self,image): if self.grid==None: return False for r in range(19): for c in range(19): intersection=self.grid.intersections[r][c] self.board[r][c]=self.analyzePoint(image,r,c,intersection,*(self.grid.stoneSizeAt(r,c))) def analyzePoint(self,image,row,col,imageCoords,stoneWidth,stoneHeight): b=w=e=0 ((x1,y1),(x2,y2))=relevantRect(imageCoords,stoneWidth,stoneHeight) for y in range(y1,y2+1): for x in range(x1,x2+1): red,green,blue=image.getpixel((x,y)) I=(red+green+blue)/255/3 m=min(red,green,blue) S=1-m/I if 100*Iself.tresW: w+=1 else: e+=1 log.debug("(%d,%d) ... (b=%d,w=%d,e=%d)", row, col, b, w, e) if b>=w and b>=e: return Go.BLACK if w>=b and w>=e: return Go.WHITE return Go.EMPTY def setGridCorners(self,corners): self.grid=Grid(corners) def relevantRect(imageCoords,stoneWidth,stoneHeight): x=int(imageCoords.x) y=int(imageCoords.y) xmax=max(int(stoneWidth*2//7), 2) # !! optimal parameters subject to further research ymax=max(int(stoneHeight*2//7), 2) return ((x-xmax,y-ymax), (x+xmax,y+ymax))