提交 ecdc7d00 编写于 作者: G gineshidalgo99

Fixed bug in Camera parameter reader with folders

上级 7ae6a711
......@@ -310,6 +310,7 @@ OpenPose Library - Release Notes
3. Template functions could not be imported in Windows for projects using the OpenPose library DLL.
4. Function `scaleKeypoints2d` was not working if any of the scales was 1 (e.g., fail if scaleX = 1 but scaleY != 1, or if any offset was not 0).
5. Fixed bug in `KeepTopNPeople` that could provoke segmentation fault for `number_people_max` > 1.
6. Camera parameter reader can now take folder paths even if they are not finished in `/` (e.g., `~/Desktop/` worked but `~/Desktop` did not).
......
......@@ -26,8 +26,8 @@ DEFINE_int32(cam0, 1, "Baseline camera for ext
" 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.");
// // Mode 3
// DEFINE_int32(number_cameras, 4, "Number of cameras.");
// // 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.");
......@@ -36,7 +36,7 @@ int openPoseDemo()
{
try
{
op::log("Starting OpenPose demo...", op::Priority::High);
op::log("Starting OpenPose calibration toolbox...", op::Priority::High);
const auto timerBegin = std::chrono::high_resolution_clock::now();
// logging_level
......@@ -44,24 +44,26 @@ int openPoseDemo()
__LINE__, __FUNCTION__, __FILE__);
op::ConfigureLog::setPriorityThreshold((op::Priority)FLAGS_logging_level);
// Common parameters
const auto gridInnerCorners = op::flagsToPoint(FLAGS_grid_number_inner_corners, "12x7");
const auto calibrationImageDir = op::formatAsDirectory(FLAGS_calibration_image_dir);
// Calibration - Intrinsics
if (FLAGS_mode == 1)
{
op::log("Running calibration (intrinsic parameters)...", op::Priority::High);
// Obtain & save intrinsics
const auto gridInnerCorners = op::flagsToPoint(FLAGS_grid_number_inner_corners, "12x7");
// 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 camera calibration code
// Run calibration
op::estimateAndSaveIntrinsics(
gridInnerCorners, FLAGS_grid_square_size_mm, flags,
op::formatAsDirectory(FLAGS_camera_parameter_folder),
op::formatAsDirectory(FLAGS_calibration_image_dir),
FLAGS_camera_serial_number, saveImagesWithCorners);
op::formatAsDirectory(FLAGS_camera_parameter_folder), calibrationImageDir, FLAGS_camera_serial_number,
saveImagesWithCorners);
op::log("Intrinsic calibration completed!", op::Priority::High);
}
......@@ -69,27 +71,42 @@ int openPoseDemo()
else if (FLAGS_mode == 2)
{
op::log("Running calibration (extrinsic parameters)...", op::Priority::High);
// Parameters
// Run calibration
op::estimateAndSaveExtrinsics(
FLAGS_camera_parameter_folder, op::formatAsDirectory(FLAGS_calibration_image_dir),
op::flagsToPoint(FLAGS_grid_number_inner_corners, "12x7"), FLAGS_grid_square_size_mm, FLAGS_cam0,
FLAGS_cam1, FLAGS_omit_distortion, FLAGS_combine_cam0_extrinsics);
FLAGS_camera_parameter_folder, calibrationImageDir, gridInnerCorners, FLAGS_grid_square_size_mm,
FLAGS_cam0, FLAGS_cam1, FLAGS_omit_distortion, FLAGS_combine_cam0_extrinsics);
// Logging
op::log("Extrinsic calibration completed!", op::Priority::High);
}
// // Calibration - Extrinsics Refinement with Visual SFM
// // Calibration - Extrinsics - Bundle Adjustment (BA)
// else if (FLAGS_mode == 3)
// {
// op::log("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, FLAGS_grid_square_size_mm,
// FLAGS_number_cameras, FLAGS_omit_distortion, saveImagesWithCorners);
// // Logging
// op::log("Extrinsic calibration (bundle adjustment) completed!", op::Priority::High);
// }
// // Calibration - Extrinsics Refinement with Visual SFM
// else if (FLAGS_mode == 4)
// {
// op::log("Running calibration (intrinsic parameters)...", op::Priority::High);
// // Obtain & save intrinsics
// const auto gridInnerCorners = op::flagsToPoint(FLAGS_grid_number_inner_corners, "12x7");
// const auto saveImagesWithCorners = false;
// // const auto saveImagesWithCorners = true;
// // Run camera calibration code
// op::estimateAndSaveSiftFile(gridInnerCorners,
// op::formatAsDirectory(FLAGS_calibration_image_dir),
// FLAGS_number_cameras,
// saveImagesWithCorners);
// op::estimateAndSaveSiftFile(
// gridInnerCorners, calibrationImageDir, FLAGS_number_cameras, saveImagesWithCorners);
// op::log("Intrinsic calibration completed!", op::Priority::High);
// }
......@@ -100,7 +117,7 @@ int openPoseDemo()
const auto now = std::chrono::high_resolution_clock::now();
const auto totalTimeSec = (double)std::chrono::duration_cast<std::chrono::nanoseconds>(now-timerBegin).count()
* 1e-9;
const auto message = "OpenPose demo successfully finished. Total time: "
const auto message = "OpenPose calibration toolbox successfully finished. Total time: "
+ std::to_string(totalTimeSec) + " seconds.";
op::log(message, op::Priority::High);
......
......@@ -15,16 +15,21 @@ namespace op
*/
OP_API void estimateAndSaveIntrinsics(
const Point<int>& gridInnerCorners, const float gridSquareSizeMm, const int flags,
const std::string& outputParameterFolder, const std::string& imagesFolder, const std::string& serialNumber,
const std::string& outputParameterFolder, const std::string& imageFolder, const std::string& serialNumber,
const bool saveImagesWithCorners = false);
OP_API void estimateAndSaveExtrinsics(
const std::string& intrinsicsFolder, const std::string& extrinsicsImagesFolder,
const Point<int>& gridInnerCorners, const float gridSquareSizeMm, const int index0, const int index1,
const bool imagesAreUndistorted, const bool combineCam0Extrinsics);
const std::string& parameterFolder, const std::string& imageFolder, const Point<int>& gridInnerCorners,
const float gridSquareSizeMm, const int index0, const int index1, const bool imagesAreUndistorted,
const bool combineCam0Extrinsics);
OP_API void refineAndSaveExtrinsics(
const std::string& parameterFolder, const std::string& imageFolder, const Point<int>& gridInnerCorners,
const float gridSquareSizeMm, const int numberCameras, const bool imagesAreUndistorted,
const bool saveImagesWithCorners = false);
OP_API void estimateAndSaveSiftFile(
const Point<int>& gridInnerCorners, const std::string& imagesFolder, const int numberCameras,
const Point<int>& gridInnerCorners, const std::string& imageFolder, const int numberCameras,
const bool saveImagesWithCorners = false);
}
......
......@@ -28,47 +28,55 @@ namespace op
mNumberEmptyFrames{0},
mTrackingFps{false}
{
// Basic properties
mProperties[(unsigned int)ProducerProperty::AutoRepeat] = (double) false;
mProperties[(unsigned int)ProducerProperty::Flip] = (double) false;
mProperties[(unsigned int)ProducerProperty::Rotation] = 0.;
mProperties[(unsigned int)ProducerProperty::NumberViews] = numberViews;
auto& mNumberViews = mProperties[(unsigned int)ProducerProperty::NumberViews];
// Camera (distortion, intrinsic, and extrinsic) parameters
if (mType != ProducerType::FlirCamera)
try
{
// Undistort image?
mCameraParameterReader.setUndistortImage(undistortImage);
// If no stereo --> Set to 1
if (mNumberViews <= 0)
mNumberViews = 1;
// Get camera paremeters
if (mNumberViews > 1 || undistortImage)
// Basic properties
mProperties[(unsigned int)ProducerProperty::AutoRepeat] = (double) false;
mProperties[(unsigned int)ProducerProperty::Flip] = (double) false;
mProperties[(unsigned int)ProducerProperty::Rotation] = 0.;
mProperties[(unsigned int)ProducerProperty::NumberViews] = numberViews;
auto& mNumberViews = mProperties[(unsigned int)ProducerProperty::NumberViews];
// Camera (distortion, intrinsic, and extrinsic) parameters
if (mType != ProducerType::FlirCamera)
{
const auto extension = getFileExtension(cameraParameterPath);
// Undistort image?
mCameraParameterReader.setUndistortImage(undistortImage);
// If no stereo --> Set to 1
if (mNumberViews <= 0)
mNumberViews = 1;
// Get camera paremeters
if (extension == "xml" || extension == "XML")
mCameraParameterReader.readParameters(
getFileParentFolderPath(cameraParameterPath), getFileNameNoExtension(cameraParameterPath));
else // if (mNumberViews > 1)
if (mNumberViews > 1 || undistortImage)
{
// Read camera parameters from SN
auto serialNumbers = getFilesOnDirectory(cameraParameterPath, ".xml");
// Get serial numbers
for (auto& serialNumber : serialNumbers)
serialNumber = getFileNameNoExtension(serialNumber);
const auto extension = getFileExtension(cameraParameterPath);
// Get camera paremeters
mCameraParameterReader.readParameters(cameraParameterPath, serialNumbers);
if (extension == "xml" || extension == "XML")
mCameraParameterReader.readParameters(
getFileParentFolderPath(cameraParameterPath), getFileNameNoExtension(cameraParameterPath));
else // if (mNumberViews > 1)
{
const auto cameraParameterPathCleaned = formatAsDirectory(cameraParameterPath);
// Read camera parameters from SN
auto serialNumbers = getFilesOnDirectory(cameraParameterPathCleaned, ".xml");
// Get serial numbers
for (auto& serialNumber : serialNumbers)
serialNumber = getFileNameNoExtension(serialNumber);
// Get camera paremeters
mCameraParameterReader.readParameters(cameraParameterPathCleaned, serialNumbers);
}
// Sanity check
if ((int)mCameraParameterReader.getNumberCameras() != mNumberViews)
error("Found different number of camera parameter files than the number indicated by"
" `--3d_views` ("
+ std::to_string(mCameraParameterReader.getNumberCameras()) + " vs. "
+ std::to_string(mNumberViews) + "). Make sure they are the same number of files.",
__LINE__, __FUNCTION__, __FILE__);
}
// Sanity check
if ((int)mCameraParameterReader.getNumberCameras() != mNumberViews)
error("Found different number of camera parameter files than the number indicated by"
" `--3d_views` ("
+ std::to_string(mCameraParameterReader.getNumberCameras()) + " vs. "
+ std::to_string(mNumberViews) + "). Make sure they are the same number of files.",
__LINE__, __FUNCTION__, __FILE__);
}
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
Producer::~Producer(){}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册