Files
@ 928d9a0edc05
Branch filter:
Location: OneEye/src/imageanalyzer.py - annotation
928d9a0edc05
1.7 KiB
text/x-python
fix of coordinates computation
4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 4b4cae6939e8 | 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))
|