File size: 7,175 Bytes
f5bb0c0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
// ------------------------- OpenPose Calibration Toolbox -------------------------
// Check `doc/advanced/calibration_module.md`.
// Implemented on top of OpenCV.
// It computes and saves the intrinsics parameters of the input images.
// Third-party dependencies
#include <opencv2/opencv.hpp>
// Command-line user interface
#define OPENPOSE_FLAGS_DISABLE_POSE
#include <openpose/flags.hpp>
// OpenPose dependencies
#include <openpose/headers.hpp>
// Calibration
DEFINE_int32(mode, 1, "Select 1 for intrinsic camera parameter calibration, 2 for extrinsic calibration.");
DEFINE_string(calibration_image_dir, "images/intrinsics/", "Directory where the images for camera parameter calibration are placed.");
DEFINE_double(grid_square_size_mm, 127.0, "Chessboard square length (in millimeters).");
DEFINE_string(grid_number_inner_corners,"9x6", "Number of inner corners in width and height, i.e., number of total squares in width"
" and height minus 1.");
// Mode 1 - Intrinsics
DEFINE_string(camera_serial_number, "18079958", "Camera serial number.");
// Mode 2 - Extrinsics
DEFINE_bool(omit_distortion, false, "Set to true if image views are already undistorted (e.g., if recorded from OpenPose"
" after intrinsic parameter calibration).");
DEFINE_bool(combine_cam0_extrinsics, false, "Set to true if cam0 extrinsics are not [R=I, t=0]. I will make no effect if cam0 is"
" already the origin. See doc/advanced/calibration_module.md for an example.");
DEFINE_int32(cam0, 1, "Baseline camera for extrinsic calibration, cam1 will be calibrated assuming cam0 the"
" world coordinate origin.");
DEFINE_int32(cam1, 0, "Target camera to estimate its extrinsic parameters, it will be calibrated assuming cam0"
" as the world coordinate origin.");
// Modes 3-4
DEFINE_int32(number_cameras, 4, "Number of cameras (for mode 3-4).");
// Producer
DEFINE_string(camera_parameter_folder, "models/cameraParameters/flir/", "String with the folder where the camera parameters are or will be"
" located.");
int openPoseDemo()
{
try
{
op::opLog("Starting OpenPose calibration toolbox...", op::Priority::High);
const auto opTimer = op::getTimerInit();
// logging_level
op::checkBool(
0 <= FLAGS_logging_level && FLAGS_logging_level <= 255, "Wrong logging_level value.",
__LINE__, __FUNCTION__, __FILE__);
op::ConfigureLog::setPriorityThreshold((op::Priority)FLAGS_logging_level);
// Common parameters
const auto gridInnerCorners = op::flagsToPoint(op::String(FLAGS_grid_number_inner_corners), "12x7");
const auto calibrationImageDir = op::formatAsDirectory(FLAGS_calibration_image_dir);
const auto gridSqureSizeMm = (float)FLAGS_grid_square_size_mm;
// Calibration - Intrinsics
if (FLAGS_mode == 1)
{
op::opLog("Running calibration (intrinsic parameters)...", op::Priority::High);
// Parameters
// const auto flags = 0; // 5 parameters
const auto flags = cv::CALIB_RATIONAL_MODEL; // 8 parameters
// const auto flags = cv::CALIB_RATIONAL_MODEL | cv::CALIB_THIN_PRISM_MODEL; // 12 parameters
// const auto flags = cv::CALIB_RATIONAL_MODEL | cv::CALIB_THIN_PRISM_MODEL | cv::CALIB_TILTED_MODEL; // 14
// const auto saveImagesWithCorners = false;
const auto saveImagesWithCorners = true;
// Run calibration
op::estimateAndSaveIntrinsics(
gridInnerCorners, gridSqureSizeMm, flags,
op::formatAsDirectory(FLAGS_camera_parameter_folder), calibrationImageDir, FLAGS_camera_serial_number,
saveImagesWithCorners);
op::opLog("Intrinsic calibration completed!", op::Priority::High);
}
// Calibration - Extrinsics
else if (FLAGS_mode == 2)
{
op::opLog("Running calibration (extrinsic parameters)...", op::Priority::High);
// Run calibration
op::estimateAndSaveExtrinsics(
FLAGS_camera_parameter_folder, calibrationImageDir, gridInnerCorners, gridSqureSizeMm,
FLAGS_cam0, FLAGS_cam1, FLAGS_omit_distortion, FLAGS_combine_cam0_extrinsics);
// Logging
op::opLog("Extrinsic calibration completed!", op::Priority::High);
}
// Calibration - Extrinsics - Bundle Adjustment (BA)
else if (FLAGS_mode == 3)
{
op::opLog("Running calibration (bundle adjustment over extrinsic parameters)...", op::Priority::High);
// Sanity check
if (!FLAGS_omit_distortion)
op::error("This mode assumes that the images are already undistorted (add flag `--omit_distortion`.",
__LINE__, __FUNCTION__, __FILE__);
// Parameters
const auto saveImagesWithCorners = false;
// Run calibration
op::refineAndSaveExtrinsics(
FLAGS_camera_parameter_folder, calibrationImageDir, gridInnerCorners, gridSqureSizeMm,
FLAGS_number_cameras, FLAGS_omit_distortion, saveImagesWithCorners);
// Logging
op::opLog("Extrinsic calibration (bundle adjustment) completed!", op::Priority::High);
}
// // Calibration - Extrinsics Refinement with Visual SFM
// else if (FLAGS_mode == 4)
// {
// op::opLog("Running calibration (intrinsic parameters)...", op::Priority::High);
// // Obtain & save intrinsics
// const auto saveImagesWithCorners = false;
// // const auto saveImagesWithCorners = true;
// // Run camera calibration code
// op::estimateAndSaveSiftFile(
// gridInnerCorners, calibrationImageDir, FLAGS_number_cameras, saveImagesWithCorners);
// op::opLog("Intrinsic calibration completed!", op::Priority::High);
// }
else
op::error("Unknown `--mode " + std::to_string(FLAGS_mode) + "`.", __LINE__, __FUNCTION__, __FILE__);
// Measuring total time
op::printTime(
opTimer, "OpenPose calibration toolbox successfully finished. Total time: ", " seconds.",
op::Priority::High);
return 0;
}
catch (const std::exception&)
{
return -1;
}
}
int main(int argc, char *argv[])
{
// Parsing command line flags
gflags::ParseCommandLineFlags(&argc, &argv, true);
// Running openPoseDemo
return openPoseDemo();
}
|