Files
@ 5f4489f36388
Branch filter:
Location: OneEye/src/image_analyzer.py - annotation
5f4489f36388
1.7 KiB
text/x-python
restored showing the game state, split out message passing
8af597b8f819 8af597b8f819 5fe83c3dfb92 42f4533a5029 42f4533a5029 42f4533a5029 a1b8c202099c f6b3d570893c a1b8c202099c a1b8c202099c a1b8c202099c f6b3d570893c f6b3d570893c f6b3d570893c 8af597b8f819 8af597b8f819 5f4489f36388 5f4489f36388 5f4489f36388 c842bba99503 a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c 8af597b8f819 a1b8c202099c 5f4489f36388 5f4489f36388 5f4489f36388 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:
log.info("ImageAnalyzer.analyze() aborted: no grid available.")
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)))
boardStr="\n".join(str(row) for row in self.board)
log.info("board analyzed:\n%s",boardStr)
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))
|