PlayChessWithAWebCam/DetectState

From BITPlan Wiki
Jump to navigation Jump to search

Click here to comment see PlayChessWithAWebCam for the project the DetectState approach is used in

State transitions

Relevant Source parts

class ImageChange:
...
def isStable(self):
        delta=abs(self.movingAverage.gradient())
        stable=delta<ImageChange.gradientDelta
        if stable:
            self.stableCounter+=1
        else:
            self.stableCounter=0    
        return stable  
...
class SimpleDetector:
def updateState(self,cbImageSet):
        calibrationWindow=5
        
        ic=self.imageChange
        ics=ic.changeState
        if ics==ChangeState.CALIBRATING:
            # leave calibrating when enough stable values are available
            if ic.isStable() and ic.stableCounter>=calibrationWindow:
                ic.changeState=ChangeState.PRE_MOVE
        elif ics==ChangeState.PRE_MOVE:
            if not ic.isStable():
                ic.changeState=ChangeState.IN_MOVE
                ic.minInMove=ic.pixelChanges
                ic.maxInMove=ic.pixelChanges
        elif ics==ChangeState.IN_MOVE:
            ic.maxInMove=max(ic.maxInMove,ic.pixelChanges)
            peak=ic.maxInMove-ic.minInMove
            dist=ic.pixelChanges-ic.minInMove
            if peak>0:
                relativePeak=dist/peak
                if ic.isStable():
                    if relativePeak<0.1:
                        self.onMoveDetected(cbImageSet)