Difference between revisions of "Raspberry PI Chessboard Camera"

From BITPlan Wiki
Jump to navigation Jump to search
Line 204: Line 204:
 
<uml>
 
<uml>
 
hide circle
 
hide circle
class ArenaQuit
+
package Exceptions <<Rectangle>> {
Exception <|-- ArenaQuit
+
  class ArenaQuit
 +
  Exception <|-- ArenaQuit
  
class BadImage
+
  class BadImage
BadImage --|> Exception
+
  BadImage --|> Exception
  
class BadSegmentation
+
  class BadSegmentation
BadSegmentation --|> Exception
+
  BadSegmentation --|> Exception
  
class CannotBuildStateException
+
  class CannotBuildStateException
CannotBuildStateException --|> Exception
+
  CannotBuildStateException --|> Exception
  
class RejectedMove
+
  class RejectedMove
RejectedMove --|> Exception
+
  RejectedMove --|> Exception
  
class UserExit
+
  class UserExit
UserExit --|> Exception
+
  UserExit --|> Exception
 +
}
  
class Args
+
package PlayChessWithAWebCam {
 +
  note top of Args: This class parses command line arguments and generates a usage.
 +
  class Args {
 +
    __init__(args)
 +
  }
  
class BoardFinder {
+
  class BoardFinder {
  getDominatorOffset()
+
    getDominatorOffset()
  updateImage(inFrame)
+
    updateImage(inFrame)
  DetectBoardOrientation()
+
    DetectBoardOrientation()
  GetChessBoardCoordinates(rotation)
+
    GetChessBoardCoordinates(rotation)
  LineCrossingDetection()
+
    LineCrossingDetection()
  GetFullImageBoard(rectCoordinates=None, rotations=None)
+
    GetFullImageBoard(rectCoordinates=None, rotations=None)
  _getBlackMaxSide(colorImage)
+
    _getBlackMaxSide(colorImage)
  rotateImage(image)
+
    rotateImage(image)
}
+
  }
class Cell {
+
  class Cell {
}
+
  }
class ChessCam {
+
  class ChessCam {
   getNextMove()
+
    getNextMove()
   getDominatorOffset()
+
    getDominatorOffset()
 +
  }
 +
 
 +
 
 +
  note top of GameEngine: This class is used to change the game state using StateClass.\nIt also communicates moves with the chess ai facade \\nand an observer to detect if a move have been played by an ai.
 +
  class GameEngine {
 +
    play()
 +
    mainLoop()
 +
   }
 +
  class InputManager
 +
  class MovementDetector
 +
  class State {
 +
    __init__(dominatorOffset)
 +
    moveCam(move)
 +
    _move(fromCell, toCell)
 +
    _eat(fromCell, toCell)
 +
    _castle(fromCell, toCell)
 +
    _tryToPromote(c)
 +
    _switchTurn()
 +
    _sameColor(c1, c2)
 +
    _emptyCell(c)
 +
    _validateMove(fromCell, toCell)
 +
    _initBoard()
 +
    _partMoves(move)
 +
   }
 +
  class StateDetector
 +
  note top of Uci: This class interacts with stdin and stdout with Arena in the UCI convention in order to communicate chess moves.
 +
  class Uci {
 +
    sendMove(move)
 +
    getResponse()
 +
    _setPosition(tokens)
 +
  }
 +
 
 +
  class Video
 
}
 
}
note top of GameEngine: This class is used to change the game state using StateClass.\nIt also communicates moves with the chess ai facade and an observer to detect if a move have been played by an ai.
 
class GameEngine {
 
  play()
 
  mainLoop()
 
}
 
class InputManager
 
class MovementDetector
 
class State {
 
  __init__(dominatorOffset)
 
  moveCam(move)
 
  _move(fromCell, toCell)
 
  _eat(fromCell, toCell)
 
  _castle(fromCell, toCell)
 
  _tryToPromote(c)
 
  _switchTurn()
 
  _sameColor(c1, c2)
 
  _emptyCell(c)
 
  _validateMove(fromCell, toCell)
 
  _initBoard()
 
  _partMoves(move)
 
}
 
class StateDetector
 
note top of Uci: This class interacts with stdin and stdout with Arena in the UCI convention in order to communicate chess moves.
 
class Uci {
 
  sendMove(move)
 
  getResponse()
 
  _setPosition(tokens)
 
}
 
 
class Video
 
 
GameEngine -- ChessCam
 
GameEngine -- ChessCam
 
GameEngine -- State
 
GameEngine -- State

Revision as of 06:02, 20 October 2019

Chessboard Move Recorder

see e.g. https://chess.stackexchange.com/questions/4695/tools-for-automated-notation-webcam-movie-to-pgn/26643#26643

Parts List

# picture part example sources documents ~ price
1 Brett-Bundesliga_200x200.jpg Chessboard

Schachversand Ullrich

Wikipedia 25 €
2 Bundesliga57f787924d743_200x200.jpg Chess pieces

Schachversand Ullrich

Wikipedia 25 €
3 Raspberry Pi 3 Model B.png Raspberry PI

Amazon

Wikipedia 45 €
4 LogitechC615.jpeg Web Camera

Amazon

Raspberry PI compatibility list (german) 60 €
5 71KECb7RmVL. SX679 .jpg USB Powerbank

Amazon

15 €
6 613RrJEZYPL. SL1000 .jpg 16 GByte Micro SD Card

Amazon

5 €

Pictures

First Prototype

SAM 9947.JPG SAM 9949.JPG SAM 9951.JPG Chess34563.jpg

Second Prototype

SAM 9955.JPG SAM 9962.JPG

Installation

see

Projects

CV_Chess

Trying out the CV_Chess project from https://classes.engineering.wustl.edu/ese205/core/index.php?title=CV_Chess Fork of it at:

Installation

git clone  https://github.com/WolfgangFahl/ESE205-CVChess/
./installOpenCV
./install

Test

./test
============================= test session starts ==============================
platform linux -- Python 3.7.3, pytest-5.2.1, py-1.8.0, pluggy-0.13.0
rootdir: /home/wf/source/python/ESE205-CVChess
collected 2 items                                                              

test_camera.py .                                                         [ 50%]
test_webcam.py .                                                         [100%]

============================== 2 passed in 3.87s ===============================

Preview

# see https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('Camera',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

start the above code - stop by pressing 'q'

python3 preview.py

Chesspic2019-10-15 1627.png

Run

./run

CV ChessStep1.png CV ChessStep2.png CV ChessStep3.png CV ChessStep4.png CV ChessStep5.png CV ChessStep6.png CV ChessStep7.png CV Chess Identified.png

Project details

The project was an effort of some 200 hours See also https://classes.engineering.wustl.edu/ese205/core/index.php?title=CV_Chess_Logs

Code Structure

Click classes to view source code

Issues

see also https://github.com/rjgoodloe/ESE205-CVChess/issues

CV ChessDetection.png

The board detection algorithm does not make sure that squares are really squares.

play-chess-with-a-webcam

see github fork at

Written in python2 migrated to python3.

Code Structure

UCI compatible GUIs

XBoard

sudo apt-get install xboard polyglot stockfish
xboard -fUCI -fcp stockfish -sUCI -scp stockfish

XBoard2019-10-19.png

Open Source Projects

Commercial

Links

Videos