Files
@ 8af597b8f819
Branch filter:
Location: OneEye/src/image_analyzer.py - annotation
8af597b8f819
1.5 KiB
text/x-python
further refactoring, got processes passing messages, restored computing grid and analyzing image
8af597b8f819 8af597b8f819 5fe83c3dfb92 42f4533a5029 42f4533a5029 42f4533a5029 a1b8c202099c f6b3d570893c a1b8c202099c a1b8c202099c a1b8c202099c f6b3d570893c f6b3d570893c f6b3d570893c 8af597b8f819 8af597b8f819 a1b8c202099c c842bba99503 a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c 8af597b8f819 a1b8c202099c f6b3d570893c a1b8c202099c a1b8c202099c 5fe83c3dfb92 c842bba99503 a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c f6b3d570893c f6b3d570893c a1b8c202099c c842bba99503 8af597b8f819 f6b3d570893c a1b8c202099c a1b8c202099c a1b8c202099c c842bba99503 8af597b8f819 8af597b8f819 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 | 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*I<self.tresB: b+=1
elif 100*I>self.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))
|