• Wenfeng CAI's avatar
    Merge pull request #12772 from xoox:calib-release-object · 31be03a8
    Wenfeng CAI authored
    More accurate pinhole camera calibration with imperfect planar target (#12772)
    43 commits:
    
    * Add derivatives with respect to object points
    
    Add an output parameter to calculate derivatives of image points with
    respect to 3D coordinates of object points. The output jacobian matrix
    is a 2Nx3N matrix where N is the number of points.
    
    This commit introduces incompatibility to old function signature.
    
    * Set zero for dpdo matrix before using
    
    dpdo is a sparse matrix with only non-zero value close to major
    diagonal. Set it to zero because only elements near major diagonal are
    computed.
    
    * Add jacobian columns to projectPoints()
    
    The output jacobian matrix of derivatives with respect to coordinates of
    3D object points are added. This might break callers who assume the
    columns of jacobian matrix.
    
    * Adapt test code to updated project functions
    
    The test cases for projectPoints() and cvProjectPoints2() are updated to
    fit new function signatures.
    
    * Add accuracy test code for dpdo
    
    * Add badarg test for dpdo
    
    * Add new enum item for new calibration method
    
    CALIB_RELEASE_OBJECT is used to whether to release 3D coordinates of
    object points. The method was proposed in: K. H. Strobl and G. Hirzinger.
    "More Accurate Pinhole Camera Calibration with Imperfect Planar Target".
    In Proceedings of the IEEE International Conference on Computer Vision
    (ICCV 2011), 1st IEEE Workshop on Challenges and Opportunities in Robot
    Perception, Barcelona, Spain, pp. 1068-1075, November 2011.
    
    * Add releasing object method into internal function
    
    It's a simple extension of the standard calibration scheme. We choose to
    fix the first and last object point and a user-selected fixed point.
    
    * Add interfaces for extended calibration method
    
    * Refine document for calibrateCamera()
    
    When releasing object points, only the z coordinates of the
    objectPoints[0].back is fixed.
    
    * Add link to strobl2011iccv paper
    
    * Improve documentation for calibrateCamera()
    
    * Add implementations of wrapping calibrateCamera()
    
    * Add checking for params of new calibration method
    
    If input parameters are not qualified, then fall back to standard
    calibration method.
    
    * Add camera calibration method of releasing object
    
    The current implementation is equal to or better than
    https://github.com/xoox/calibrel
    
    * Update doc for CALIB_RELEASE_OBJECT
    
    CALIB_USE_QR or CALIB_USE_LU could be used for faster calibration with
    potentially less precise and less stable in some rare cases.
    
    * Add RELEASE_OBJECT calibration to tutorial code
    
    To select the calibration method of releasing object points, a command
    line parameter `-d=<number>` should be provided.
    
    * Update tutorial doc for camera_calibration
    
    If the method of releasing object points is merged into OpenCV. It will
    be expected to be firstly released in 4.1, I think.
    
    * Reduce epsilon for cornerSubPix()
    
    Epsilon of 0.1 is a bigger one. Preciser corner positions are required
    with calibration method of releasing object.
    
    * Refine camera calibration tutorial
    
    The hypothesis coordinates are used to indicate which distance must be
    measured between two specified object points.
    
    * Update sample calibration code method selection
    
    Similar to camera_calibration tutorial application, a command line
    argument `-dt=<number>` is used to select the calibration method.
    
    * Add guard to flags of cvCalibrateCamera2()
    
    cvCalibrateCamera2() doesn't accept CALIB_RELEASE_OBJECT unless overload
    interface is added in the future.
    
    * Simplify fallback when iFixedPoint is out of range
    
    * Refactor projectPoints() to keep compatibilities
    
    * Fix arg string "Bad rvecs header"
    
    * Read calibration flags from test data files
    
    Instead of being hard coded into source file, the calibration flags will
    be read from test data files.
    opencv_extra/testdata/cv/cameracalibration/calib?.dat must be sync with
    the test code.
    
    * Add new C interface of cvCalibrateCamera4()
    
    With this new added C interface, the extended calibration method with
    CALIB_RELEASE_OBJECT can be called by C API.
    
    * Add regression test of extended calibration method
    
    It has been tested with new added test data in xoox:calib-release-object
    branch of opencv_extra.
    
    * Fix assertion in test_cameracalibration.cpp
    
    The total number of refined 3D object coordinates is checked.
    
    * Add checker for iFixedPoint in cvCalibrateCamera4
    
    If iFixedPoint is out of rational range, fall back to standard method.
    
    * Fix documentation for overloaded calibrateCamera()
    
    * Remove calibration flag of CALIB_RELEASE_OBJECT
    
    The method selection is based on the range of the index of fixed point.
    For minus values, standard calibration method will be chosen.  Values in
    a rational range will make the object-releasing calibration method
    selected.
    
    * Use new interfaces instead of function overload
    
    Existing interfaces are preserved and new interfaces are added. Since
    most part of the code base are shared, calibrateCamera() is now a
    wrapper function of calibrateCameraRO().
    
    * Fix exported name of calibrateCameraRO()
    
    * Update documentation for calibrateCameraRO()
    
    The circumstances where this method is mostly helpful are described.
    
    * Add note on the rigidity of the calibration target
    
    * Update documentation for calibrateCameraRO()
    
    It is clarified that iFixedPoint is used as a switch to select
    calibration method. If input data are not qualified, exceptions will be
    thrown instead of fallback scheme.
    
    * Clarify iFixedPoint as switch and remove fallback
    
    iFixedPoint is now used as a switch for calibration method selection. No
    fallback scheme is utilized anymore. If the input data are not
    qualified, exceptions will be thrown.
    
    * Add badarg test for object-releasing method
    
    * Fix document format of sample list
    
    List items of same level should be indented the same way. Otherwise they
    will be formatted as nested lists by Doxygen.
    
    * Add brief intro for objectPoints and imagePoints
    
    * Sync tutorial to sample calibration code
    
    * Update tutorial compatibility version to 4.0
    31be03a8
calib3d.bib 1.71 KB