TODO: standardize the chainable outputs from CVImage. Will we return a new CVImage or a numpy array? I'm leaning towards the second one, so CVImage's return values can be used as numpy/cv2 inputs, and the ImagePipeline class will handle multiple modification calls.
TODO: remove all image manipulation code from GameModel class. Moving all the OpenCV image manipulation actions to the CVImage class would make the GameModel procedures more legible.
TODO: abstract multi-step processes in GameModel class as an ImagePipeline. The purpose is to improve testability by making each manipulation action in CVImage to result in a series of images and data structures.