Files
@ 79f823432bb4
Branch filter:
Location: OneEye/src/image_analyzer.py - annotation
79f823432bb4
1.7 KiB
text/x-python
nicer board logs
8af597b8f819 8af597b8f819 79f823432bb4 79f823432bb4 42f4533a5029 42f4533a5029 42f4533a5029 a1b8c202099c f6b3d570893c 79f823432bb4 a1b8c202099c a1b8c202099c f6b3d570893c f6b3d570893c f6b3d570893c 8af597b8f819 8af597b8f819 5f4489f36388 5f4489f36388 5f4489f36388 c842bba99503 a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c 8af597b8f819 a1b8c202099c 79f823432bb4 5f4489f36388 f6b3d570893c a1b8c202099c a1b8c202099c 5fe83c3dfb92 c842bba99503 a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c a1b8c202099c f6b3d570893c f6b3d570893c a1b8c202099c c842bba99503 8af597b8f819 f6b3d570893c 79f823432bb4 79f823432bb4 79f823432bb4 c842bba99503 8af597b8f819 8af597b8f819 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 5fe83c3dfb92 | import logging as log
from grid import Grid
from go import exportBoard
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)))
log.info("board analyzed:\n%s", exportBoard(self.board))
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))
|