Perspective Cropping & Corner Detection

The corner crop transform algorithm has two steps. First, it will apply Ostu’s threshold and extract contours from an edge map of the image. In the edge map, the algorithm attempts to find a large rectangle, which is the slide. This method is ineffective if there are any gaps or obstructions in the outline around the slide. So, if it fails to find the slide, the program will use the Hough Lines algorithm to find horizontal and vertical lines, then find the intersection points, and finally cluster those points using KMeans.

The process this file executes is based on this jupyter notebook and this StackOverflow answer. The opencv package provides most of the low-level functions. See the Corner Crop Transform API Documentation for details regarding the functions.

Useful guides and tutorials to help understand the script:

Debug/Testing Mode

The file can be run as a script in order to try the image processing pipeline on several files, view the results, and tweak the parameters as necessary to improve accuracy.

Recommended Command:

python corner_crop_transform.py folder ../presenter_slide/ --debug_mode --debug_gif --debug_path ../debug_imgs

The above command processes all files in the ../presenter_slide/ folder. The --debug_mode argument allows the usage of --debug_gif and --debug_path. --debug_gif will save a gif of each step of the pipeline with a 1.4s delay to --debug_path. --debug_imgs can also be enabled to save each step of the pipeline as its own image (in higher quality than the GIF, the GIF only has 256 colors).

Using --debug_mode will output a file in the present working directory named debug_crop_error_log.txt with the paths to all of the images that the pipeline thinks it failed with.

Warning

There may be other images that the script failed to process correctly. The debug_crop_error_log.txt file only contains the paths to images that did not meet the criteria to be perspective cropped. The reasoning behind why they didn’t will likely lead to parameter tuning.

You can also process a single file using the file as a script with the file mode:

python corner_crop_transform.py file /path/to/image/file/0Q5IimX-AAc-img_067.jpg -d -di -dg

Example Images

Example of contours mode failing and falling back to hough_lines

../_images/IJquEYhiq_U-img_130_debug.gif

Command used to create above image:

python corner_crop_transform.py file ../dataset/classifier-data/presenter_slide/IJquEYhiq_U-img_130_debug.gif -d -di -dg -dgo

Timeline of images (click image for larger view):

../_images/IJquEYhiq_U-img_130_timeline.png

Example of contours mode succeeding

../_images/IJquEYhiq_U-img_068_debug.gif

Command used to create above image:

python corner_crop_transform.py file ../dataset/classifier-data/presenter_slide/IJquEYhiq_U-img_068.jpg -d -di -dg -dgo

Timeline of images (click image for larger view):

../_images/IJquEYhiq_U-img_068_timeline.png

Script Help

Output of python corner_crop_transform.py --help:

usage: corner_crop_transform.py [-h] [-d] [-di] [-dg] [-dgo] [-p DEBUG_PATH]
                            [-l {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
                            {file,folder} path

Perspective Crop to Rectangles (Slides)

positional arguments:
{file,folder}         `file` mode will crop a single image and `folder` mode
                        will crop all the images in a given folder
path                  path to file or folder (depending on `mode`) to
                        process

optional arguments:
-h, --help            show this help message and exit
-d, --debug_mode      enable the usage of `--debug_imgs`, `--debug_gif`, and
                        `--debug_path`.
-di, --debug_imgs     Save debug images (JPG of each step of the pipeline).
                        Requires `--debug_mode` to be enabled.
-dg, --debug_gif      Save debug gif (GIF with 1.4s delay between each debug
                        image). Requires `--debug_mode` to be enabled.
-dgo, --debug_gif_optimize
                        Optimize the gif produced by enabling --debug_gif with
                        `gifsicle`.
-p DEBUG_PATH, --debug_path DEBUG_PATH
                        path to folder to store debug images (default:
                        './debug_imgs')
-l {DEBUG,INFO,WARNING,ERROR,CRITICAL}, --log {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Set the logging level (default: 'Info').