mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-21 23:01:45 +08:00
295 lines
12 KiB
C++
295 lines
12 KiB
C++
/*
|
|
* Software License Agreement (BSD License)
|
|
*
|
|
* Copyright (c) 2009, Willow Garage, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials provided
|
|
* with the distribution.
|
|
* * Neither the name of Willow Garage, Inc. nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*/
|
|
|
|
#ifndef __OPENCV_SFM_SIMPLE_PIPELINE_HPP__
|
|
#define __OPENCV_SFM_SIMPLE_PIPELINE_HPP__
|
|
|
|
#include <opencv2/core.hpp>
|
|
|
|
namespace cv
|
|
{
|
|
namespace sfm
|
|
{
|
|
|
|
//! @addtogroup simple_pipeline
|
|
//! @{
|
|
|
|
/** @brief Different camera models that libmv supports.
|
|
*/
|
|
enum {
|
|
SFM_DISTORTION_MODEL_POLYNOMIAL = 0, // LIBMV_DISTORTION_MODEL_POLYNOMIAL
|
|
SFM_DISTORTION_MODEL_DIVISION = 1, // LIBMV_DISTORTION_MODEL_DIVISION
|
|
};
|
|
|
|
/** @brief Data structure describing the camera model and its parameters.
|
|
@param _distortion_model Type of camera model.
|
|
@param _focal_length_x focal length of the camera (in pixels).
|
|
@param _focal_length_y focal length of the camera (in pixels).
|
|
@param _principal_point_x principal point of the camera in the x direction (in pixels).
|
|
@param _principal_point_y principal point of the camera in the y direction (in pixels).
|
|
@param _polynomial_k1 radial distortion parameter.
|
|
@param _polynomial_k2 radial distortion parameter.
|
|
@param _polynomial_k3 radial distortion parameter.
|
|
@param _polynomial_p1 radial distortion parameter.
|
|
@param _polynomial_p2 radial distortion parameter.
|
|
|
|
Is assumed that modern cameras have their principal point in the image center.\n
|
|
In case that the camera model was SFM_DISTORTION_MODEL_DIVISION, it's only needed to provide
|
|
_polynomial_k1 and _polynomial_k2 which will be assigned as division distortion parameters.
|
|
*/
|
|
class CV_EXPORTS_W_SIMPLE libmv_CameraIntrinsicsOptions
|
|
{
|
|
public:
|
|
CV_WRAP
|
|
libmv_CameraIntrinsicsOptions(const int _distortion_model=0,
|
|
const double _focal_length_x=0,
|
|
const double _focal_length_y=0,
|
|
const double _principal_point_x=0,
|
|
const double _principal_point_y=0,
|
|
const double _polynomial_k1=0,
|
|
const double _polynomial_k2=0,
|
|
const double _polynomial_k3=0,
|
|
const double _polynomial_p1=0,
|
|
const double _polynomial_p2=0)
|
|
: distortion_model(_distortion_model),
|
|
image_width(2*_principal_point_x),
|
|
image_height(2*_principal_point_y),
|
|
focal_length_x(_focal_length_x),
|
|
focal_length_y(_focal_length_y),
|
|
principal_point_x(_principal_point_x),
|
|
principal_point_y(_principal_point_y),
|
|
polynomial_k1(_polynomial_k1),
|
|
polynomial_k2(_polynomial_k2),
|
|
polynomial_k3(_polynomial_k3),
|
|
division_k1(_polynomial_p1),
|
|
division_k2(_polynomial_p2)
|
|
{
|
|
if ( _distortion_model == SFM_DISTORTION_MODEL_DIVISION )
|
|
{
|
|
division_k1 = _polynomial_k1;
|
|
division_k2 = _polynomial_k2;
|
|
}
|
|
}
|
|
|
|
// Common settings of all distortion models.
|
|
CV_PROP_RW int distortion_model;
|
|
CV_PROP_RW int image_width, image_height;
|
|
CV_PROP_RW double focal_length_x;
|
|
CV_PROP_RW double focal_length_y;
|
|
CV_PROP_RW double principal_point_x, principal_point_y;
|
|
|
|
// Radial distortion model.
|
|
CV_PROP_RW double polynomial_k1, polynomial_k2, polynomial_k3;
|
|
CV_PROP_RW double polynomial_p1, polynomial_p2;
|
|
|
|
// Division distortion model.
|
|
CV_PROP_RW double division_k1, division_k2;
|
|
};
|
|
|
|
|
|
/** @brief All internal camera parameters that libmv is able to refine.
|
|
*/
|
|
enum { SFM_REFINE_FOCAL_LENGTH = (1 << 0), // libmv::BUNDLE_FOCAL_LENGTH
|
|
SFM_REFINE_PRINCIPAL_POINT = (1 << 1), // libmv::BUNDLE_PRINCIPAL_POINT
|
|
SFM_REFINE_RADIAL_DISTORTION_K1 = (1 << 2), // libmv::BUNDLE_RADIAL_K1
|
|
SFM_REFINE_RADIAL_DISTORTION_K2 = (1 << 4), // libmv::BUNDLE_RADIAL_K2
|
|
};
|
|
|
|
|
|
/** @brief Data structure describing the reconstruction options.
|
|
@param _keyframe1 first keyframe used in order to initialize the reconstruction.
|
|
@param _keyframe2 second keyframe used in order to initialize the reconstruction.
|
|
@param _refine_intrinsics camera parameter or combination of parameters to refine.
|
|
@param _select_keyframes allows to select automatically the initial keyframes. If 1 then autoselection is enabled. If 0 then is disabled.
|
|
@param _verbosity_level verbosity logs level for Glog. If -1 then logs are disabled, otherwise the log level will be the input integer.
|
|
*/
|
|
class CV_EXPORTS_W_SIMPLE libmv_ReconstructionOptions
|
|
{
|
|
public:
|
|
CV_WRAP
|
|
libmv_ReconstructionOptions(const int _keyframe1=1,
|
|
const int _keyframe2=2,
|
|
const int _refine_intrinsics=1,
|
|
const int _select_keyframes=1,
|
|
const int _verbosity_level=-1)
|
|
: keyframe1(_keyframe1), keyframe2(_keyframe2),
|
|
refine_intrinsics(_refine_intrinsics),
|
|
select_keyframes(_select_keyframes),
|
|
verbosity_level(_verbosity_level) {}
|
|
|
|
CV_PROP_RW int keyframe1, keyframe2;
|
|
CV_PROP_RW int refine_intrinsics;
|
|
CV_PROP_RW int select_keyframes;
|
|
CV_PROP_RW int verbosity_level;
|
|
};
|
|
|
|
|
|
/** @brief base class BaseSFM declares a common API that would be used in a typical scene reconstruction scenario
|
|
*/
|
|
class CV_EXPORTS_W BaseSFM
|
|
{
|
|
public:
|
|
virtual ~BaseSFM() {};
|
|
|
|
CV_WRAP
|
|
virtual void run(InputArrayOfArrays points2d) = 0;
|
|
|
|
CV_WRAP
|
|
virtual void run(InputArrayOfArrays points2d, InputOutputArray K, OutputArray Rs,
|
|
OutputArray Ts, OutputArray points3d) = 0;
|
|
|
|
virtual void run(const std::vector<String> &images) = 0;
|
|
virtual void run(const std::vector<String> &images, InputOutputArray K, OutputArray Rs,
|
|
OutputArray Ts, OutputArray points3d) = 0;
|
|
|
|
CV_WRAP virtual double getError() const = 0;
|
|
CV_WRAP virtual void getPoints(OutputArray points3d) = 0;
|
|
CV_WRAP virtual cv::Mat getIntrinsics() const = 0;
|
|
CV_WRAP virtual void getCameras(OutputArray Rs, OutputArray Ts) = 0;
|
|
|
|
CV_WRAP
|
|
virtual void
|
|
setReconstructionOptions(const libmv_ReconstructionOptions &libmv_reconstruction_options) = 0;
|
|
|
|
CV_WRAP
|
|
virtual void
|
|
setCameraIntrinsicOptions(const libmv_CameraIntrinsicsOptions &libmv_camera_intrinsics_options) = 0;
|
|
};
|
|
|
|
/** @brief SFMLibmvEuclideanReconstruction class provides an interface with the Libmv Structure From Motion pipeline.
|
|
*/
|
|
class CV_EXPORTS_W SFMLibmvEuclideanReconstruction : public BaseSFM
|
|
{
|
|
public:
|
|
/** @brief Calls the pipeline in order to perform Eclidean reconstruction.
|
|
@param points2d Input vector of vectors of 2d points (the inner vector is per image).
|
|
|
|
@note
|
|
- Tracks must be as precise as possible. It does not handle outliers and is very sensible to them.
|
|
*/
|
|
CV_WRAP
|
|
virtual void run(InputArrayOfArrays points2d) CV_OVERRIDE = 0;
|
|
|
|
/** @brief Calls the pipeline in order to perform Eclidean reconstruction.
|
|
@param points2d Input vector of vectors of 2d points (the inner vector is per image).
|
|
@param K Input/Output camera matrix \f$K = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$. Input parameters used as initial guess.
|
|
@param Rs Output vector of 3x3 rotations of the camera.
|
|
@param Ts Output vector of 3x1 translations of the camera.
|
|
@param points3d Output array with estimated 3d points.
|
|
|
|
@note
|
|
- Tracks must be as precise as possible. It does not handle outliers and is very sensible to them.
|
|
*/
|
|
CV_WRAP
|
|
virtual void run(InputArrayOfArrays points2d, InputOutputArray K, OutputArray Rs,
|
|
OutputArray Ts, OutputArray points3d) CV_OVERRIDE = 0;
|
|
|
|
/** @brief Calls the pipeline in order to perform Eclidean reconstruction.
|
|
@param images a vector of string with the images paths.
|
|
|
|
@note
|
|
- The images must be ordered as they were an image sequence. Additionally, each frame should be as close as posible to the previous and posterior.
|
|
- For now DAISY features are used in order to compute the 2d points tracks and it only works for 3-4 images.
|
|
*/
|
|
virtual void run(const std::vector<String> &images) CV_OVERRIDE = 0;
|
|
|
|
/** @brief Calls the pipeline in order to perform Eclidean reconstruction.
|
|
@param images a vector of string with the images paths.
|
|
@param K Input/Output camera matrix \f$K = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$. Input parameters used as initial guess.
|
|
@param Rs Output vector of 3x3 rotations of the camera.
|
|
@param Ts Output vector of 3x1 translations of the camera.
|
|
@param points3d Output array with estimated 3d points.
|
|
|
|
@note
|
|
- The images must be ordered as they were an image sequence. Additionally, each frame should be as close as posible to the previous and posterior.
|
|
- For now DAISY features are used in order to compute the 2d points tracks and it only works for 3-4 images.
|
|
*/
|
|
virtual void run(const std::vector<String> &images, InputOutputArray K, OutputArray Rs,
|
|
OutputArray Ts, OutputArray points3d) CV_OVERRIDE = 0;
|
|
|
|
/** @brief Returns the computed reprojection error.
|
|
*/
|
|
CV_WRAP
|
|
virtual double getError() const CV_OVERRIDE = 0;
|
|
|
|
/** @brief Returns the estimated 3d points.
|
|
@param points3d Output array with estimated 3d points.
|
|
*/
|
|
CV_WRAP
|
|
virtual void getPoints(OutputArray points3d) CV_OVERRIDE = 0;
|
|
|
|
/** @brief Returns the refined camera calibration matrix.
|
|
*/
|
|
CV_WRAP
|
|
virtual cv::Mat getIntrinsics() const CV_OVERRIDE = 0;
|
|
|
|
/** @brief Returns the estimated camera extrinsic parameters.
|
|
@param Rs Output vector of 3x3 rotations of the camera.
|
|
@param Ts Output vector of 3x1 translations of the camera.
|
|
*/
|
|
CV_WRAP
|
|
virtual void getCameras(OutputArray Rs, OutputArray Ts) CV_OVERRIDE = 0;
|
|
|
|
/** @brief Setter method for reconstruction options.
|
|
@param libmv_reconstruction_options struct with reconstruction options such as initial keyframes,
|
|
automatic keyframe selection, parameters to refine and the verbosity level.
|
|
*/
|
|
CV_WRAP
|
|
virtual void
|
|
setReconstructionOptions(const libmv_ReconstructionOptions &libmv_reconstruction_options) CV_OVERRIDE = 0;
|
|
|
|
/** @brief Setter method for camera intrinsic options.
|
|
@param libmv_camera_intrinsics_options struct with camera intrinsic options such as camera model and
|
|
the internal camera parameters.
|
|
*/
|
|
CV_WRAP
|
|
virtual void
|
|
setCameraIntrinsicOptions(const libmv_CameraIntrinsicsOptions &libmv_camera_intrinsics_options) CV_OVERRIDE = 0;
|
|
|
|
/** @brief Creates an instance of the SFMLibmvEuclideanReconstruction class. Initializes Libmv. */
|
|
static Ptr<SFMLibmvEuclideanReconstruction>
|
|
create(const libmv_CameraIntrinsicsOptions &camera_instrinsic_options=libmv_CameraIntrinsicsOptions(),
|
|
const libmv_ReconstructionOptions &reconstruction_options=libmv_ReconstructionOptions());
|
|
};
|
|
|
|
//! @} sfm
|
|
|
|
} /* namespace cv */
|
|
} /* namespace sfm */
|
|
|
|
#endif
|
|
|
|
/* End of file. */
|