/procam-calibration

A calibration software for projector-camera system using chessboard and structured light patterns.

Primary LanguagePythonMIT LicenseMIT

procam-calibration

This repository provides a source code to calibrate projector-camera system using chessboard and structured light (graycode pattern).

Requirement

  • Python
    • Python 3 is recommended
  • OpenCV
    • python -m pip install opencv-python opencv-contrib-python
  • Printed chessboard
    • You can find PDF here

How to use

Step 1 : Generate graycode pattern

Open terminal and type following command.

python gen_graycode_imgs.py <projector_pixel_height> <projector_pixel_width> [-graycode_step <graycode_step(default=1)>]

# example
python gen_graycode_imgs.py 768 1024 -graycode_step 1

Generated patterns will be stored in ./graycode_pattern/.

graycode_step is an option to specify pixel size of bits in the graycode. If you get moire pattern in captured images, increase this number.

Step 2 : Project and capture graycode pattern

Setup your system and place the chessboard in front of the projector and camera. Then, project generated graycode pattern from the projector to it and capture it from the camera.

Although minimum required shot is one, it is recommended to capture more than 5 times with different attitude of the chessboard to improve calibration accuracy.

Captured images must be saved as ./capture_*/graycode_*.(png/jpg).

Step 3 : Calibrate projector & camera parameters

After saving captured images, run following command.

python calibrate.py <projector_pixel_height> <projector_pixel_width> <num_chess_corners_vert> <num_chess_corners_hori> <chess_block_size> <graycode_step> [-black_thr <black_thr(default=40)>] [-white_thr <white_thr(default=5)>]

# example (you can test this command in the sample_data directory)
python ../calibrate.py 768 1024 9 7 75 1 -black_thr 40 -white_thr 5

chess_block_size means length (mm/cm/m) of a block on the chessboard. The translation vector will be calculated with the length unit specified here.

black_threashold is a threashold to determine whether a camera pixel captures projected area or not. white_threashold is a threashold to specify robustness of graycode decoding. To avoid decoding error, increase these numbers.

Calibration result will be displayed on your terminal and saved in ./calibration_result.xml (cv::FileStorage format).

Additional Resource

This software calculates local homographies at around chessboard corners to estimate corresponding projector pixels with subpixel accuracy. This algorithm is based on the following paper.

MORENO, Daniel; TAUBIN, Gabriel. Simple, accurate, and robust projector-camera calibration. In: 3D Imaging, Modeling, Processing, Visualization and Transmission (3DIMPVT), 2012 Second International Conference on. IEEE, 2012. p. 464-471.