2010-05-12 01:44:00 +08:00
|
|
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
|
|
|
//
|
|
|
|
// By downloading, copying, installing or using the software you agree to this license.
|
|
|
|
// If you do not agree to this license, do not download, install,
|
|
|
|
// copy or use the software.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// License Agreement
|
|
|
|
// For Open Source Computer Vision Library
|
|
|
|
//
|
|
|
|
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
|
|
|
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
|
|
|
// Third party copyrights are property of their respective owners.
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without modification,
|
|
|
|
// are permitted provided that the following conditions are met:
|
|
|
|
//
|
|
|
|
// * Redistribution's of source code must retain the above copyright notice,
|
|
|
|
// this list of conditions and the following disclaimer.
|
|
|
|
//
|
|
|
|
// * Redistribution's 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.
|
|
|
|
//
|
|
|
|
// * The name of the copyright holders may not 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 Intel Corporation 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.
|
|
|
|
//
|
|
|
|
//M*/
|
|
|
|
|
|
|
|
#include "precomp.hpp"
|
2018-10-03 05:51:29 +08:00
|
|
|
#include "distortion_model.hpp"
|
2010-05-12 01:44:00 +08:00
|
|
|
#include <stdio.h>
|
2010-09-24 18:52:21 +08:00
|
|
|
#include <iterator>
|
2021-06-07 20:55:25 +08:00
|
|
|
#include <iostream>
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
/*
|
2019-12-26 19:45:03 +08:00
|
|
|
This is straight-forward port v3 of Matlab calibration engine by Jean-Yves Bouguet
|
2010-05-12 01:44:00 +08:00
|
|
|
that is (in a large extent) based on the paper:
|
|
|
|
Z. Zhang. "A flexible new technique for camera calibration".
|
|
|
|
IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000.
|
|
|
|
The 1st initial port was done by Valery Mosyagin.
|
|
|
|
*/
|
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
namespace cv {
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
static void initIntrinsicParams2D( const Mat& objectPoints,
|
|
|
|
const Mat& imagePoints, const Mat& npoints,
|
|
|
|
Size imageSize, OutputArray cameraMatrix,
|
2010-05-12 01:44:00 +08:00
|
|
|
double aspectRatio )
|
|
|
|
{
|
2020-12-02 04:42:15 +08:00
|
|
|
CV_Assert(npoints.type() == CV_32SC1 && (npoints.rows == 1 || npoints.cols == 1) && npoints.isContinuous());
|
|
|
|
int nimages = npoints.rows + npoints.cols - 1;
|
|
|
|
|
|
|
|
CV_Assert( objectPoints.type() == CV_32FC3 ||
|
|
|
|
objectPoints.type() == CV_64FC3 );
|
|
|
|
CV_Assert( imagePoints.type() == CV_32FC2 ||
|
|
|
|
imagePoints.type() == CV_64FC2 );
|
|
|
|
|
|
|
|
if( objectPoints.rows != 1 || imagePoints.rows != 1 )
|
2010-05-12 01:44:00 +08:00
|
|
|
CV_Error( CV_StsBadSize, "object points and image points must be a single-row matrices" );
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat_<double> matA(2*nimages, 2);
|
|
|
|
Mat_<double> matb(2*nimages, 1, CV_64F );
|
|
|
|
double fx, fy, cx, cy;
|
|
|
|
cx = (!imageSize.width ) ? 0.5 : (imageSize.width - 1)*0.5;
|
|
|
|
cy = (!imageSize.height) ? 0.5 : (imageSize.height - 1)*0.5;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
// extract vanishing points in order to obtain initial value for the focal length
|
2022-09-13 21:45:20 +08:00
|
|
|
int pos = 0;
|
|
|
|
for(int i = 0; i < nimages; i++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2020-12-02 04:42:15 +08:00
|
|
|
int ni = npoints.at<int>(i);
|
|
|
|
Mat matM = objectPoints.colRange(pos, pos + ni);
|
|
|
|
Mat _m = imagePoints.colRange(pos, pos + ni);
|
|
|
|
pos += ni;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
Matx33d H;
|
2020-12-02 04:42:15 +08:00
|
|
|
Mat matH0 = findHomography(matM, _m);
|
|
|
|
CV_Assert(matH0.size() == Size(3, 3));
|
2022-09-13 21:45:20 +08:00
|
|
|
matH0.convertTo(H, CV_64F);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
H(0, 0) -= H(2, 0)*cx; H(0, 1) -= H(2, 1)*cx; H(0, 2) -= H(2, 2)*cx;
|
|
|
|
H(1, 0) -= H(2, 0)*cy; H(1, 1) -= H(2, 1)*cy; H(1, 2) -= H(2, 2)*cy;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
Vec3d h, v, d1, d2;
|
|
|
|
Vec4d n;
|
|
|
|
for(int j = 0; j < 3; j++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
double t0 = H(j, 0), t1 = H(j, 1);
|
2010-05-12 01:44:00 +08:00
|
|
|
h[j] = t0; v[j] = t1;
|
|
|
|
d1[j] = (t0 + t1)*0.5;
|
|
|
|
d2[j] = (t0 - t1)*0.5;
|
|
|
|
n[0] += t0*t0; n[1] += t1*t1;
|
|
|
|
n[2] += d1[j]*d1[j]; n[3] += d2[j]*d2[j];
|
|
|
|
}
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
for(int j = 0; j < 4; j++ )
|
2013-02-25 00:14:01 +08:00
|
|
|
n[j] = 1./std::sqrt(n[j]);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
for(int j = 0; j < 3; j++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
|
|
|
h[j] *= n[0]; v[j] *= n[1];
|
|
|
|
d1[j] *= n[2]; d2[j] *= n[3];
|
|
|
|
}
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
matA(i*2+0, 0) = h[0]*v[0]; matA(i*2+0, 1) = h[1]*v[1];
|
|
|
|
matA(i*2+1, 0) = d1[0]*d2[0]; matA(i*2+1, 1) = d1[1]*d2[1];
|
|
|
|
matb(i*2+0) = -h[2]*v[2];
|
|
|
|
matb(i*2+1) = -d1[2]*d2[2];
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
Vec2d f;
|
|
|
|
solve(matA, matb, f, DECOMP_NORMAL + DECOMP_SVD);
|
|
|
|
fx = std::sqrt(fabs(1./f[0]));
|
|
|
|
fy = std::sqrt(fabs(1./f[1]));
|
2010-05-12 01:44:00 +08:00
|
|
|
if( aspectRatio != 0 )
|
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
double tf = (fx + fy)/(aspectRatio + 1.);
|
|
|
|
fx = aspectRatio*tf;
|
|
|
|
fy = tf;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
2022-09-13 21:45:20 +08:00
|
|
|
Matx33d(fx, 0, cx,
|
|
|
|
0, fy, cy,
|
|
|
|
0, 0, 1).copyTo(cameraMatrix);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
static void subMatrix(const Mat& src, Mat& dst,
|
|
|
|
const std::vector<uchar>& cols,
|
|
|
|
const std::vector<uchar>& rows)
|
|
|
|
{
|
|
|
|
CV_Assert(src.type() == CV_64F && dst.type() == CV_64F);
|
|
|
|
int m = (int)rows.size(), n = (int)cols.size();
|
|
|
|
int i1 = 0, j1 = 0;
|
|
|
|
const uchar* colsdata = cols.empty() ? 0 : &cols[0];
|
|
|
|
for(int i = 0; i < m; i++)
|
2016-06-07 17:31:11 +08:00
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
if(rows[i])
|
2016-06-07 17:31:11 +08:00
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
const double* srcptr = src.ptr<double>(i);
|
|
|
|
double* dstptr = dst.ptr<double>(i1++);
|
|
|
|
|
|
|
|
for(int j = j1 = 0; j < n; j++)
|
|
|
|
{
|
|
|
|
if(colsdata[j])
|
|
|
|
dstptr[j1++] = srcptr[j];
|
|
|
|
}
|
2016-06-07 17:31:11 +08:00
|
|
|
}
|
|
|
|
}
|
2021-06-07 20:55:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static double calibrateCameraInternal( const Mat& objectPoints,
|
2022-09-13 21:45:20 +08:00
|
|
|
const Mat& imagePoints, const Mat& npoints,
|
|
|
|
Size imageSize, int iFixedPoint, Mat& cameraMatrix, Mat& distCoeffs,
|
|
|
|
Mat rvecs, Mat tvecs, Mat newObjPoints, Mat stdDevs,
|
|
|
|
Mat perViewErr, int flags, const TermCriteria& termCrit )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int NINTRINSIC = CALIB_NINTRINSIC;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
double aspectRatio = 0.;
|
2021-06-07 20:55:25 +08:00
|
|
|
int nimages = npoints.checkVector(1, CV_32S);
|
|
|
|
CV_Assert(nimages >= 1);
|
|
|
|
int ndistCoeffs = (int)distCoeffs.total();
|
|
|
|
bool releaseObject = iFixedPoint > 0 && iFixedPoint < npoints.at<int>(0) - 1;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
// 0. check the parameters & allocate buffers
|
|
|
|
if( imageSize.width <= 0 || imageSize.height <= 0 )
|
|
|
|
CV_Error( CV_StsOutOfRange, "image width and height must be positive" );
|
|
|
|
|
2017-06-07 21:49:41 +08:00
|
|
|
if(flags & CALIB_TILTED_MODEL)
|
2015-10-14 18:07:28 +08:00
|
|
|
{
|
|
|
|
//when the tilted sensor model is used the distortion coefficients matrix must have 14 parameters
|
2021-06-07 20:55:25 +08:00
|
|
|
if (ndistCoeffs != 14)
|
2015-10-14 18:07:28 +08:00
|
|
|
CV_Error( CV_StsBadArg, "The tilted sensor model must have 14 parameters in the distortion matrix" );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//when the thin prism model is used the distortion coefficients matrix must have 12 parameters
|
2017-06-07 21:49:41 +08:00
|
|
|
if(flags & CALIB_THIN_PRISM_MODEL)
|
2021-06-07 20:55:25 +08:00
|
|
|
if (ndistCoeffs != 12)
|
2015-10-14 18:07:28 +08:00
|
|
|
CV_Error( CV_StsBadArg, "Thin prism model must have 12 parameters in the distortion matrix" );
|
|
|
|
}
|
2013-04-11 23:27:54 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
if( !rvecs.empty() )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int cn = rvecs.channels();
|
|
|
|
CV_Assert(rvecs.depth() == CV_32F || rvecs.depth() == CV_64F);
|
|
|
|
CV_Assert(rvecs.rows == nimages);
|
|
|
|
CV_Assert((rvecs.rows == nimages && (rvecs.cols*cn == 3 || rvecs.cols*cn == 3)) ||
|
|
|
|
(rvecs.rows == 1 && rvecs.cols == nimages && cn == 3));
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
if( !tvecs.empty() )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int cn = tvecs.channels();
|
|
|
|
CV_Assert(tvecs.depth() == CV_32F || tvecs.depth() == CV_64F);
|
|
|
|
CV_Assert(tvecs.rows == nimages);
|
|
|
|
CV_Assert((tvecs.rows == nimages && tvecs.cols*cn == 3) ||
|
|
|
|
(tvecs.rows == 1 && tvecs.cols == nimages && cn == 3));
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
CV_Assert(cameraMatrix.type() == CV_32F || cameraMatrix.type() == CV_64F);
|
|
|
|
CV_Assert(cameraMatrix.rows == 3 && cameraMatrix.cols == 3);
|
2016-06-07 17:31:11 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
CV_Assert(distCoeffs.type() == CV_32F || distCoeffs.type() == CV_64F);
|
|
|
|
CV_Assert(distCoeffs.rows == 1 || distCoeffs.cols == 1);
|
|
|
|
CV_Assert(ndistCoeffs == 4 || ndistCoeffs == 5 || ndistCoeffs == 8 ||
|
|
|
|
ndistCoeffs == 12 || ndistCoeffs == 14);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
int total = 0, maxPoints = 0;
|
|
|
|
for(int i = 0; i < nimages; i++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int ni = npoints.at<int>(i);
|
2010-05-12 01:44:00 +08:00
|
|
|
if( ni < 4 )
|
|
|
|
{
|
2015-11-03 19:30:29 +08:00
|
|
|
CV_Error_( CV_StsOutOfRange, ("The number of points in the view #%d is < 4", i));
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
maxPoints = MAX( maxPoints, ni );
|
|
|
|
total += ni;
|
|
|
|
}
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
if( !newObjPoints.empty() )
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int cn = newObjPoints.channels();
|
|
|
|
CV_Assert(newObjPoints.depth() == CV_32F || newObjPoints.depth() == CV_64F);
|
|
|
|
CV_Assert(rvecs.rows == nimages);
|
|
|
|
CV_Assert((newObjPoints.rows == maxPoints && newObjPoints.cols*cn == 3) ||
|
|
|
|
(newObjPoints.rows == 1 && newObjPoints.cols == maxPoints && cn == 3));
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
}
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
if( !stdDevs.empty() )
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int cn = stdDevs.channels();
|
|
|
|
CV_Assert(stdDevs.depth() == CV_32F || stdDevs.depth() == CV_64F);
|
2021-06-07 20:55:25 +08:00
|
|
|
int nstddev = nimages*6 + NINTRINSIC + (releaseObject ? maxPoints*3 : 0);
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
CV_Assert((stdDevs.rows == nstddev && stdDevs.cols*cn == 1) ||
|
|
|
|
(stdDevs.rows == 1 && stdDevs.cols == nstddev && cn == 1));
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
}
|
|
|
|
|
2015-11-03 19:30:29 +08:00
|
|
|
Mat matM( 1, total, CV_64FC3 );
|
|
|
|
Mat _m( 1, total, CV_64FC2 );
|
2016-06-07 17:31:11 +08:00
|
|
|
Mat allErrors(1, total, CV_64FC2);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
if(objectPoints.channels() == 3)
|
|
|
|
objectPoints.convertTo(matM, CV_64F);
|
|
|
|
else
|
|
|
|
convertPointsToHomogeneous(objectPoints, matM, CV_64F);
|
2015-11-03 19:30:29 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
if(imagePoints.channels() == 2)
|
|
|
|
imagePoints.convertTo(_m, CV_64F);
|
|
|
|
else
|
|
|
|
convertPointsFromHomogeneous(imagePoints, _m, CV_64F);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
int nparams = NINTRINSIC + nimages*6;
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
if( releaseObject )
|
|
|
|
nparams += maxPoints * 3;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
std::vector<double> k(14, 0.0);
|
|
|
|
Mat _k( distCoeffs.rows, distCoeffs.cols, CV_64F, k.data());
|
2021-06-07 20:55:25 +08:00
|
|
|
if( distCoeffs.total() < 8 )
|
2010-09-07 23:38:48 +08:00
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
if( distCoeffs.total() < 5 )
|
2015-09-17 00:15:55 +08:00
|
|
|
flags |= CALIB_FIX_K3;
|
|
|
|
flags |= CALIB_FIX_K4 | CALIB_FIX_K5 | CALIB_FIX_K6;
|
2010-09-07 23:38:48 +08:00
|
|
|
}
|
2012-03-26 21:07:21 +08:00
|
|
|
const double minValidAspectRatio = 0.01;
|
|
|
|
const double maxValidAspectRatio = 100.0;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
Matx33d A;
|
|
|
|
cameraMatrix.convertTo(A, CV_64F);
|
2021-06-07 20:55:25 +08:00
|
|
|
|
2010-05-12 01:44:00 +08:00
|
|
|
// 1. initialize intrinsic parameters & LM solver
|
2015-09-17 00:15:55 +08:00
|
|
|
if( flags & CALIB_USE_INTRINSIC_GUESS )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2015-11-03 19:30:29 +08:00
|
|
|
if( A(0, 0) <= 0 || A(1, 1) <= 0 )
|
2010-05-12 01:44:00 +08:00
|
|
|
CV_Error( CV_StsOutOfRange, "Focal length (fx and fy) must be positive" );
|
2015-11-03 19:30:29 +08:00
|
|
|
if( A(0, 2) < 0 || A(0, 2) >= imageSize.width ||
|
|
|
|
A(1, 2) < 0 || A(1, 2) >= imageSize.height )
|
2010-05-12 01:44:00 +08:00
|
|
|
CV_Error( CV_StsOutOfRange, "Principal point must be within the image" );
|
2015-11-03 19:30:29 +08:00
|
|
|
if( fabs(A(0, 1)) > 1e-5 )
|
2010-05-12 01:44:00 +08:00
|
|
|
CV_Error( CV_StsOutOfRange, "Non-zero skew is not supported by the function" );
|
2015-11-03 19:30:29 +08:00
|
|
|
if( fabs(A(1, 0)) > 1e-5 || fabs(A(2, 0)) > 1e-5 ||
|
|
|
|
fabs(A(2, 1)) > 1e-5 || fabs(A(2,2)-1) > 1e-5 )
|
2010-05-12 01:44:00 +08:00
|
|
|
CV_Error( CV_StsOutOfRange,
|
|
|
|
"The intrinsic matrix must have [fx 0 cx; 0 fy cy; 0 0 1] shape" );
|
2015-11-03 19:30:29 +08:00
|
|
|
A(0, 1) = A(1, 0) = A(2, 0) = A(2, 1) = 0.;
|
|
|
|
A(2, 2) = 1.;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2015-09-17 00:15:55 +08:00
|
|
|
if( flags & CALIB_FIX_ASPECT_RATIO )
|
2012-03-26 21:07:21 +08:00
|
|
|
{
|
2015-11-03 19:30:29 +08:00
|
|
|
aspectRatio = A(0, 0)/A(1, 1);
|
2012-03-26 21:07:21 +08:00
|
|
|
|
|
|
|
if( aspectRatio < minValidAspectRatio || aspectRatio > maxValidAspectRatio )
|
|
|
|
CV_Error( CV_StsOutOfRange,
|
|
|
|
"The specified aspect ratio (= cameraMatrix[0][0] / cameraMatrix[1][1]) is incorrect" );
|
|
|
|
}
|
2021-06-07 20:55:25 +08:00
|
|
|
distCoeffs.convertTo(_k, CV_64F);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-11-03 19:30:29 +08:00
|
|
|
Scalar mean, sdv;
|
|
|
|
meanStdDev(matM, mean, sdv);
|
|
|
|
if( fabs(mean[2]) > 1e-5 || fabs(sdv[2]) > 1e-5 )
|
2010-05-12 01:44:00 +08:00
|
|
|
CV_Error( CV_StsBadArg,
|
|
|
|
"For non-planar calibration rigs the initial intrinsic matrix must be specified" );
|
2022-09-13 21:45:20 +08:00
|
|
|
for(int i = 0; i < total; i++ )
|
2015-11-03 19:30:29 +08:00
|
|
|
matM.at<Point3d>(i).z = 0.;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2015-09-17 00:15:55 +08:00
|
|
|
if( flags & CALIB_FIX_ASPECT_RATIO )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
aspectRatio = A(0, 0);
|
|
|
|
aspectRatio /= A(1, 1);
|
2012-03-26 21:07:21 +08:00
|
|
|
if( aspectRatio < minValidAspectRatio || aspectRatio > maxValidAspectRatio )
|
2010-05-12 01:44:00 +08:00
|
|
|
CV_Error( CV_StsOutOfRange,
|
2012-03-26 21:07:21 +08:00
|
|
|
"The specified aspect ratio (= cameraMatrix[0][0] / cameraMatrix[1][1]) is incorrect" );
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
2021-06-07 20:55:25 +08:00
|
|
|
initIntrinsicParams2D( matM, _m, npoints, imageSize, A, aspectRatio );
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
//std::cout << "A0: " << A << std::endl;
|
|
|
|
//std::cout << "dist0:" << _k << std::endl;
|
2015-12-11 06:26:37 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
std::vector<double> param(nparams, 0.0);
|
2023-09-21 23:24:38 +08:00
|
|
|
Mat paramM = Mat(param, false).reshape(1, nparams);
|
2022-09-13 21:45:20 +08:00
|
|
|
std::vector<uchar> mask(nparams, (uchar)1);
|
2019-03-05 00:34:10 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
int solveMethod = DECOMP_EIG;
|
2019-03-05 00:34:10 +08:00
|
|
|
|
2015-12-11 06:26:37 +08:00
|
|
|
if(flags & CALIB_USE_LU) {
|
2021-06-07 20:55:25 +08:00
|
|
|
solveMethod = DECOMP_LU;
|
2015-12-11 06:26:37 +08:00
|
|
|
}
|
2016-08-23 21:35:03 +08:00
|
|
|
else if(flags & CALIB_USE_QR) {
|
2021-06-07 20:55:25 +08:00
|
|
|
solveMethod = DECOMP_QR;
|
2016-08-23 21:35:03 +08:00
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2015-11-03 19:30:29 +08:00
|
|
|
param[0] = A(0, 0); param[1] = A(1, 1); param[2] = A(0, 2); param[3] = A(1, 2);
|
2022-09-13 21:45:20 +08:00
|
|
|
std::copy(k.begin(), k.end(), param.begin() + 4);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2016-10-18 23:48:36 +08:00
|
|
|
if(flags & CALIB_FIX_ASPECT_RATIO)
|
|
|
|
mask[0] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_FOCAL_LENGTH )
|
2010-05-12 01:44:00 +08:00
|
|
|
mask[0] = mask[1] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_PRINCIPAL_POINT )
|
2010-05-12 01:44:00 +08:00
|
|
|
mask[2] = mask[3] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_ZERO_TANGENT_DIST )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
|
|
|
param[6] = param[7] = 0;
|
|
|
|
mask[6] = mask[7] = 0;
|
|
|
|
}
|
2015-09-17 00:15:55 +08:00
|
|
|
if( !(flags & CALIB_RATIONAL_MODEL) )
|
|
|
|
flags |= CALIB_FIX_K4 + CALIB_FIX_K5 + CALIB_FIX_K6;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( !(flags & CALIB_THIN_PRISM_MODEL))
|
2013-09-16 16:09:11 +08:00
|
|
|
flags |= CALIB_FIX_S1_S2_S3_S4;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( !(flags & CALIB_TILTED_MODEL))
|
2015-10-14 18:07:28 +08:00
|
|
|
flags |= CALIB_FIX_TAUX_TAUY;
|
2015-11-03 19:30:29 +08:00
|
|
|
|
|
|
|
mask[ 4] = !(flags & CALIB_FIX_K1);
|
|
|
|
mask[ 5] = !(flags & CALIB_FIX_K2);
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_TANGENT_DIST )
|
2021-06-07 20:55:25 +08:00
|
|
|
mask[6] = mask[7] = 0;
|
2015-11-03 19:30:29 +08:00
|
|
|
mask[ 8] = !(flags & CALIB_FIX_K3);
|
|
|
|
mask[ 9] = !(flags & CALIB_FIX_K4);
|
|
|
|
mask[10] = !(flags & CALIB_FIX_K5);
|
|
|
|
mask[11] = !(flags & CALIB_FIX_K6);
|
2013-02-21 22:25:22 +08:00
|
|
|
|
|
|
|
if(flags & CALIB_FIX_S1_S2_S3_S4)
|
|
|
|
{
|
|
|
|
mask[12] = 0;
|
|
|
|
mask[13] = 0;
|
|
|
|
mask[14] = 0;
|
|
|
|
mask[15] = 0;
|
|
|
|
}
|
2015-10-14 18:07:28 +08:00
|
|
|
if(flags & CALIB_FIX_TAUX_TAUY)
|
2021-06-07 20:55:25 +08:00
|
|
|
mask[16] = mask[17] = 0;
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
|
|
|
|
if(releaseObject)
|
|
|
|
{
|
|
|
|
// copy object points
|
2022-09-13 21:45:20 +08:00
|
|
|
int s = NINTRINSIC + nimages * 6;
|
|
|
|
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
std::copy( matM.ptr<double>(), matM.ptr<double>( 0, maxPoints - 1 ) + 3,
|
2022-09-13 21:45:20 +08:00
|
|
|
param.begin() + NINTRINSIC + nimages * 6 );
|
|
|
|
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
// fix points
|
2022-09-13 21:45:20 +08:00
|
|
|
mask[s + 0] = 0;
|
|
|
|
mask[s + 1] = 0;
|
|
|
|
mask[s + 2] = 0;
|
|
|
|
mask[s + iFixedPoint * 3 + 0] = 0;
|
|
|
|
mask[s + iFixedPoint * 3 + 1] = 0;
|
|
|
|
mask[s + iFixedPoint * 3 + 2] = 0;
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
mask[nparams - 1] = 0;
|
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2023-01-28 21:08:29 +08:00
|
|
|
int nparams_nz = countNonZero(mask);
|
|
|
|
|
|
|
|
if (nparams_nz >= 2 * total)
|
|
|
|
CV_Error_(Error::StsBadArg,
|
|
|
|
("There should be less vars to optimize (having %d) than the number of residuals (%d = 2 per point)", nparams_nz, 2 * total));
|
|
|
|
|
2010-05-12 01:44:00 +08:00
|
|
|
// 2. initialize extrinsic parameters
|
2022-09-13 21:45:20 +08:00
|
|
|
for(int i = 0, pos = 0; i < nimages; i++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int ni = npoints.at<int>(i);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
int s = NINTRINSIC + i*6;
|
|
|
|
Mat _ri = paramM.rowRange(s, s + 3);
|
|
|
|
Mat _ti = paramM.rowRange(s + 3, s + 6);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
Mat _Mi = matM.colRange(pos, pos + ni);
|
|
|
|
Mat _mi = _m.colRange(pos, pos + ni);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
solvePnP(_Mi, _mi, A, _k, _ri, _ti, false);
|
|
|
|
|
|
|
|
pos += ni;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
//std::cout << "single camera calib. param before LM: " << param0.t() << "\n";
|
|
|
|
//std::cout << "single camera calib. mask: " << mask0.t() << "\n";
|
|
|
|
|
2010-05-12 01:44:00 +08:00
|
|
|
// 3. run the optimization
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat errBuf( maxPoints*2, 1, CV_64FC1 );
|
|
|
|
Mat JiBuf ( maxPoints*2, NINTRINSIC, CV_64FC1, Scalar(0));
|
|
|
|
Mat JeBuf ( maxPoints*2, 6, CV_64FC1 );
|
|
|
|
Mat JoBuf;
|
|
|
|
if (releaseObject)
|
|
|
|
JoBuf = Mat( maxPoints*2, maxPoints*3, CV_64FC1);
|
|
|
|
|
2022-09-17 00:00:00 +08:00
|
|
|
auto cameraCalcJErr = [&, npoints, nimages, flags, releaseObject, nparams, maxPoints, NINTRINSIC]
|
2022-09-13 21:45:20 +08:00
|
|
|
(InputOutputArray _param, OutputArray _JtErr, OutputArray _JtJ, double& errnorm) -> bool
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
bool optimizeObjPoints = releaseObject;
|
|
|
|
|
|
|
|
Mat_<double> param_m = _param.getMat();
|
|
|
|
param_m = param_m.reshape(1, max(param_m.rows, param_m.cols));
|
|
|
|
|
|
|
|
if( flags & CALIB_FIX_ASPECT_RATIO )
|
|
|
|
{
|
|
|
|
param_m(0) = param_m(1)*aspectRatio;
|
|
|
|
}
|
|
|
|
|
|
|
|
double fx = param_m(0), fy = param_m(1), cx = param_m(2), cy = param_m(3);
|
|
|
|
Matx33d intrin(fx, 0, cx,
|
|
|
|
0, fy, cy,
|
|
|
|
0, 0, 1);
|
|
|
|
Mat dist = param_m.rowRange(4, 4+14);
|
|
|
|
|
|
|
|
bool calcJ = !_JtErr.empty() && !_JtJ.empty();
|
|
|
|
Mat JtErr, JtJ;
|
|
|
|
if (calcJ)
|
|
|
|
{
|
|
|
|
JtErr = _JtErr.getMat();
|
|
|
|
JtJ = _JtJ.getMat();
|
|
|
|
JtJ.setZero();
|
|
|
|
JtErr.setZero();
|
|
|
|
}
|
|
|
|
|
|
|
|
double reprojErr = 0;
|
|
|
|
|
|
|
|
int so = NINTRINSIC + nimages * 6;
|
|
|
|
int pos = 0;
|
|
|
|
for( int i = 0; i < nimages; i++ )
|
|
|
|
{
|
|
|
|
int si = NINTRINSIC + i * 6;
|
|
|
|
|
|
|
|
int ni = npoints.at<int>(i);
|
|
|
|
Mat _ri = param_m.rowRange(si, si + 3);
|
|
|
|
Mat _ti = param_m.rowRange(si + 3, si + 6);
|
|
|
|
|
|
|
|
Mat _Mi = matM.colRange(pos, pos + ni);
|
|
|
|
if( optimizeObjPoints )
|
|
|
|
{
|
|
|
|
_Mi = param_m.rowRange(so, so + ni * 3);
|
|
|
|
_Mi = _Mi.reshape(3, 1);
|
|
|
|
}
|
|
|
|
Mat _mi = _m.colRange(pos, pos + ni);
|
|
|
|
Mat _me = allErrors.colRange(pos, pos + ni);
|
|
|
|
|
|
|
|
Mat Jo;
|
|
|
|
if (optimizeObjPoints)
|
|
|
|
Jo = JoBuf(Range(0, ni*2), Range(0, ni*3));
|
|
|
|
|
|
|
|
Mat Je = JeBuf.rowRange(0, ni*2);
|
|
|
|
Mat Ji = JiBuf.rowRange(0, ni*2);
|
|
|
|
Mat err = errBuf.rowRange(0, ni*2);
|
|
|
|
Mat _mp = err.reshape(2, 1);
|
|
|
|
|
|
|
|
if( calcJ )
|
|
|
|
{
|
|
|
|
Mat _dpdr = Je.colRange(0, 3);
|
|
|
|
Mat _dpdt = Je.colRange(3, 6);
|
|
|
|
Mat _dpdf = (flags & CALIB_FIX_FOCAL_LENGTH) ? Mat() : Ji.colRange(0, 2);
|
|
|
|
Mat _dpdc = (flags & CALIB_FIX_PRINCIPAL_POINT) ? Mat() : Ji.colRange(2, 4);
|
|
|
|
Mat _dpdk = Ji.colRange(4, NINTRINSIC);
|
|
|
|
Mat _dpdo = Jo.empty() ? Mat() : Jo.colRange(0, ni * 3);
|
|
|
|
|
|
|
|
projectPoints(_Mi, _ri, _ti, intrin, dist, _mp, _dpdr, _dpdt,
|
|
|
|
(_dpdf.empty() ? noArray() : _dpdf),
|
|
|
|
(_dpdc.empty() ? noArray() : _dpdc),
|
|
|
|
_dpdk, (_dpdo.empty() ? noArray() : _dpdo),
|
|
|
|
(flags & CALIB_FIX_ASPECT_RATIO) ? aspectRatio : 0.);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
projectPoints( _Mi, _ri, _ti, intrin, dist, _mp);
|
|
|
|
|
|
|
|
subtract( _mp, _mi, _mp );
|
|
|
|
_mp.copyTo(_me);
|
|
|
|
|
|
|
|
if( calcJ )
|
|
|
|
{
|
|
|
|
// see HZ: (A6.14) for details on the structure of the Jacobian
|
|
|
|
JtJ(Rect(0, 0, NINTRINSIC, NINTRINSIC)) += Ji.t() * Ji;
|
|
|
|
JtJ(Rect(si, si, 6, 6)) = Je.t() * Je;
|
|
|
|
JtJ(Rect(si, 0, 6, NINTRINSIC)) = Ji.t() * Je;
|
|
|
|
if( optimizeObjPoints )
|
|
|
|
{
|
|
|
|
JtJ(Rect(so, 0, maxPoints * 3, NINTRINSIC)) += Ji.t() * Jo;
|
|
|
|
JtJ(Rect(so, si, maxPoints * 3, 6)) += Je.t() * Jo;
|
|
|
|
JtJ(Rect(so, so, maxPoints * 3, maxPoints * 3)) += Jo.t() * Jo;
|
|
|
|
}
|
|
|
|
|
|
|
|
JtErr.rowRange(0, NINTRINSIC) += Ji.t() * err;
|
|
|
|
JtErr.rowRange(si, si + 6) = Je.t() * err;
|
|
|
|
if( optimizeObjPoints )
|
|
|
|
{
|
|
|
|
JtErr.rowRange(so, nparams) += Jo.t() * err;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
double viewErr = norm(err, NORM_L2SQR);
|
|
|
|
if( !perViewErr.empty() )
|
|
|
|
perViewErr.at<double>(i) = std::sqrt(viewErr / ni);
|
|
|
|
|
|
|
|
reprojErr += viewErr;
|
|
|
|
pos += ni;
|
|
|
|
}
|
|
|
|
|
|
|
|
errnorm = reprojErr;
|
2021-06-07 20:55:25 +08:00
|
|
|
return true;
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
};
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
LevMarq solver(param, cameraCalcJErr,
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
LevMarq::Settings()
|
|
|
|
.setMaxIterations((unsigned int)termCrit.maxCount)
|
|
|
|
.setStepNormTolerance(termCrit.epsilon)
|
|
|
|
.setSmallEnergyTolerance(termCrit.epsilon * termCrit.epsilon),
|
2022-09-13 21:45:20 +08:00
|
|
|
mask, MatrixType::AUTO, VariableType::LINEAR, /* LtoR */ false, solveMethod);
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
// geodesic is not supported for normal callbacks
|
|
|
|
solver.optimize();
|
2019-03-05 00:34:10 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
// If solver failed or last LM iteration was not successful,
|
|
|
|
// then the last calculated perViewErr can be wrong & should be recalculated
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat JtErr, JtJ, JtJinv, JtJN;
|
2021-06-07 20:55:25 +08:00
|
|
|
double reprojErr = 0;
|
2022-09-13 21:45:20 +08:00
|
|
|
if (!stdDevs.empty())
|
|
|
|
{
|
|
|
|
JtErr = Mat(nparams, 1, CV_64F);
|
|
|
|
JtJ = Mat(nparams, nparams, CV_64F);
|
|
|
|
JtErr.setZero();
|
|
|
|
JtJ.setZero();
|
|
|
|
}
|
|
|
|
|
|
|
|
cameraCalcJErr(param, JtErr, JtJ, reprojErr);
|
|
|
|
|
|
|
|
if (!stdDevs.empty())
|
2021-06-07 20:55:25 +08:00
|
|
|
{
|
|
|
|
JtJN.create(nparams_nz, nparams_nz, CV_64F);
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
subMatrix(JtJ, JtJN, mask, mask);
|
2021-06-07 20:55:25 +08:00
|
|
|
completeSymm(JtJN, false);
|
2022-09-13 21:45:20 +08:00
|
|
|
//TODO: try DECOMP_CHOLESKY maybe?
|
2021-06-07 20:55:25 +08:00
|
|
|
cv::invert(JtJN, JtJinv, DECOMP_EIG);
|
2023-01-28 21:08:29 +08:00
|
|
|
// an explanation of that denominator correction can be found here:
|
|
|
|
// R. Hartley, A. Zisserman, Multiple View Geometry in Computer Vision, 2004, section 5.1.3, page 134
|
|
|
|
// see the discussion for more details: https://github.com/opencv/opencv/pull/22992
|
|
|
|
double sigma2 = norm(allErrors, NORM_L2SQR) / (2 * total - nparams_nz);
|
2021-06-07 20:55:25 +08:00
|
|
|
int j = 0;
|
|
|
|
for ( int s = 0; s < nparams; s++ )
|
2023-01-28 21:08:29 +08:00
|
|
|
{
|
|
|
|
stdDevs.at<double>(s) = mask[s] ? std::sqrt(JtJinv.at<double>(j, j) * sigma2) : 0.0;
|
2022-09-13 21:45:20 +08:00
|
|
|
if( mask[s] )
|
2021-06-07 20:55:25 +08:00
|
|
|
j++;
|
2023-01-28 21:08:29 +08:00
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// 4. store the results
|
2021-06-07 20:55:25 +08:00
|
|
|
A = Matx33d(param[0], 0, param[2], 0, param[1], param[3], 0, 0, 1);
|
|
|
|
A.convertTo(cameraMatrix, cameraMatrix.type());
|
2022-09-13 21:45:20 +08:00
|
|
|
_k = Mat(distCoeffs.size(), CV_64F, param.data() + 4);
|
2021-06-07 20:55:25 +08:00
|
|
|
_k.convertTo(distCoeffs, distCoeffs.type());
|
2022-09-13 21:45:20 +08:00
|
|
|
|
|
|
|
if( !newObjPoints.empty() && releaseObject )
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int s = NINTRINSIC + nimages * 6;
|
|
|
|
Mat _Mi = paramM.rowRange(s, s + maxPoints * 3);
|
|
|
|
_Mi.reshape(3, 1).convertTo(newObjPoints, newObjPoints.type());
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
for(int i = 0; i < nimages; i++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
if( !rvecs.empty() )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
//TODO: fix it
|
|
|
|
Mat src = Mat(3, 1, CV_64F, param.data() + NINTRINSIC + i*6);
|
|
|
|
if( rvecs.rows == nimages && rvecs.cols*rvecs.channels() == 9 )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat dst(3, 3, rvecs.depth(), rvecs.ptr(i));
|
2021-06-07 20:55:25 +08:00
|
|
|
Rodrigues(src, A);
|
|
|
|
A.convertTo(dst, dst.type());
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat dst(3, 1, rvecs.depth(), rvecs.rows == 1 ?
|
|
|
|
rvecs.data + i*rvecs.elemSize1() : rvecs.ptr(i));
|
2021-06-07 20:55:25 +08:00
|
|
|
src.convertTo(dst, dst.type());
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
2022-09-13 21:45:20 +08:00
|
|
|
if( !tvecs.empty() )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
//TODO: fix it
|
|
|
|
Mat src(3, 1, CV_64F, param.data() + NINTRINSIC + i*6 + 3);
|
|
|
|
Mat dst(3, 1, tvecs.depth(), tvecs.rows == 1 ?
|
|
|
|
tvecs.data + i*tvecs.elemSize1() : tvecs.ptr(i));
|
2021-06-07 20:55:25 +08:00
|
|
|
src.convertTo(dst, dst.type());
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
return std::sqrt(reprojErr/total);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////// Stereo Calibration ///////////////////////////////////
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
static double stereoCalibrateImpl(
|
|
|
|
const Mat& _objectPoints, const Mat& _imagePoints1,
|
|
|
|
const Mat& _imagePoints2, const Mat& _npoints,
|
|
|
|
Mat& _cameraMatrix1, Mat& _distCoeffs1,
|
|
|
|
Mat& _cameraMatrix2, Mat& _distCoeffs2,
|
2022-09-03 00:11:42 +08:00
|
|
|
Size imageSize, Mat matR, Mat matT,
|
|
|
|
Mat matE, Mat matF,
|
2023-02-02 21:44:28 +08:00
|
|
|
Mat rvecs, Mat tvecs,
|
2022-09-03 00:11:42 +08:00
|
|
|
Mat perViewErr, int flags,
|
2021-06-07 20:55:25 +08:00
|
|
|
TermCriteria termCrit )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int NINTRINSIC = CALIB_NINTRINSIC;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
// initial camera intrinsicss
|
|
|
|
Vec<double, 14> distInitial[2];
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
Matx33d A[2];
|
|
|
|
int pointsTotal = 0, maxPoints = 0, nparams;
|
2010-05-12 01:44:00 +08:00
|
|
|
bool recomputeIntrinsics = false;
|
2022-09-17 00:00:00 +08:00
|
|
|
double aspectRatio[2] = {0, 0};
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
CV_Assert( _imagePoints1.type() == _imagePoints2.type() &&
|
|
|
|
_imagePoints1.depth() == _objectPoints.depth() );
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
CV_Assert( (_npoints.cols == 1 || _npoints.rows == 1) &&
|
2023-02-02 21:44:28 +08:00
|
|
|
_npoints.type() == CV_32S );
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
int nimages = (int)_npoints.total();
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int i = 0; i < nimages; i++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
int ni = _npoints.at<int>(i);
|
|
|
|
maxPoints = std::max(maxPoints, ni);
|
2021-06-07 20:55:25 +08:00
|
|
|
pointsTotal += ni;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2022-09-17 00:00:00 +08:00
|
|
|
Mat objectPoints;
|
|
|
|
Mat imagePoints[2];
|
2021-06-07 20:55:25 +08:00
|
|
|
_objectPoints.convertTo(objectPoints, CV_64F);
|
|
|
|
objectPoints = objectPoints.reshape(3, 1);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
if( !rvecs.empty() )
|
|
|
|
{
|
|
|
|
int cn = rvecs.channels();
|
|
|
|
int depth = rvecs.depth();
|
|
|
|
if( (depth != CV_32F && depth != CV_64F) ||
|
|
|
|
((rvecs.rows != nimages || (rvecs.cols*cn != 3 && rvecs.cols*cn != 9)) &&
|
|
|
|
(rvecs.rows != 1 || rvecs.cols != nimages || cn != 3)) )
|
|
|
|
CV_Error( CV_StsBadArg, "the output array of rotation vectors must be 3-channel "
|
|
|
|
"1xn or nx1 array or 1-channel nx3 or nx9 array, where n is the number of views" );
|
|
|
|
}
|
|
|
|
if( !tvecs.empty() )
|
|
|
|
{
|
|
|
|
int cn = tvecs.channels();
|
|
|
|
int depth = tvecs.depth();
|
|
|
|
if( (depth != CV_32F && depth != CV_64F) ||
|
|
|
|
((tvecs.rows != nimages || tvecs.cols*cn != 3) &&
|
|
|
|
(tvecs.rows != 1 || tvecs.cols != nimages || cn != 3)) )
|
|
|
|
CV_Error( CV_StsBadArg, "the output array of translation vectors must be 3-channel "
|
|
|
|
"1xn or nx1 array or 1-channel nx3 array, where n is the number of views" );
|
|
|
|
}
|
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int k = 0; k < 2; k++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
const Mat& points = k == 0 ? _imagePoints1 : _imagePoints2;
|
|
|
|
const Mat& cameraMatrix = k == 0 ? _cameraMatrix1 : _cameraMatrix2;
|
|
|
|
const Mat& distCoeffs = k == 0 ? _distCoeffs1 : _distCoeffs2;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
int depth = points.depth();
|
|
|
|
int cn = points.channels();
|
|
|
|
CV_Assert( (depth == CV_32F || depth == CV_64F) &&
|
|
|
|
((points.rows == pointsTotal && points.cols*cn == 2) ||
|
|
|
|
(points.rows == 1 && points.cols == pointsTotal && cn == 2)));
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
A[k] = Matx33d::eye();
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
points.convertTo(imagePoints[k], CV_64F);
|
|
|
|
imagePoints[k] = imagePoints[k].reshape(2, 1);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
if( flags & ( CALIB_FIX_INTRINSIC | CALIB_USE_INTRINSIC_GUESS |
|
|
|
|
CALIB_FIX_ASPECT_RATIO | CALIB_FIX_FOCAL_LENGTH ) )
|
2021-06-07 20:55:25 +08:00
|
|
|
cameraMatrix.convertTo(A[k], CV_64F);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
if( flags & ( CALIB_FIX_INTRINSIC | CALIB_USE_INTRINSIC_GUESS |
|
|
|
|
CALIB_FIX_K1 | CALIB_FIX_K2 | CALIB_FIX_K3 | CALIB_FIX_K4 | CALIB_FIX_K5 | CALIB_FIX_K6 |
|
|
|
|
CALIB_FIX_TANGENT_DIST) )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2023-02-02 21:44:28 +08:00
|
|
|
Mat tdist( distCoeffs.size(), CV_MAKETYPE(CV_64F, distCoeffs.channels()), distInitial[k].val);
|
2021-06-07 20:55:25 +08:00
|
|
|
distCoeffs.convertTo(tdist, CV_64F);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
if( !(flags & (CALIB_FIX_INTRINSIC | CALIB_USE_INTRINSIC_GUESS)))
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2023-02-02 21:44:28 +08:00
|
|
|
Mat mIntr(A[k], /* copyData = */ false);
|
|
|
|
Mat mDist(distInitial[k], /* copyData = */ false);
|
2021-06-07 20:55:25 +08:00
|
|
|
calibrateCameraInternal(objectPoints, imagePoints[k],
|
2023-02-02 21:44:28 +08:00
|
|
|
_npoints, imageSize, 0, mIntr, mDist,
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat(), Mat(), Mat(), Mat(), Mat(), flags, termCrit);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_SAME_FOCAL_LENGTH )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
A[0](0, 0) = A[1](0, 0) = (A[0](0, 0) + A[1](0, 0))*0.5;
|
|
|
|
A[0](0, 2) = A[1](0, 2) = (A[0](0, 2) + A[1](0, 2))*0.5;
|
|
|
|
A[0](1, 1) = A[1](1, 1) = (A[0](1, 1) + A[1](1, 1))*0.5;
|
|
|
|
A[0](1, 2) = A[1](1, 2) = (A[0](1, 2) + A[1](1, 2))*0.5;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_ASPECT_RATIO )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int k = 0; k < 2; k++ )
|
2023-02-02 21:44:28 +08:00
|
|
|
aspectRatio[k] = A[k](0, 0) / A[k](1, 1);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2017-06-07 21:49:41 +08:00
|
|
|
recomputeIntrinsics = (flags & CALIB_FIX_INTRINSIC) == 0;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
// we optimize for the inter-camera R(3),t(3), then, optionally,
|
|
|
|
// for intrinisic parameters of each camera ((fx,fy,cx,cy,k1,k2,p1,p2) ~ 8 parameters).
|
2022-09-03 00:11:42 +08:00
|
|
|
// Param mapping is:
|
|
|
|
// - from 0 next 6: stereo pair Rt, from 6+i*6 next 6: Rt for each ith camera of nimages,
|
|
|
|
// - from 6*(nimages+1) next NINTRINSICS: intrinsics for 1st camera: fx, fy, cx, cy, 14 x dist
|
|
|
|
// - next NINTRINSICS: the same for for 2nd camera
|
2010-05-12 01:44:00 +08:00
|
|
|
nparams = 6*(nimages+1) + (recomputeIntrinsics ? NINTRINSIC*2 : 0);
|
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
std::vector<uchar> mask(nparams, (uchar)1);
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
std::vector<double> param(nparams, 0.);
|
2015-12-11 06:26:37 +08:00
|
|
|
|
2010-05-12 01:44:00 +08:00
|
|
|
if( recomputeIntrinsics )
|
|
|
|
{
|
2022-09-02 09:00:18 +08:00
|
|
|
size_t idx = nparams - NINTRINSIC*2;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( !(flags & CALIB_RATIONAL_MODEL) )
|
|
|
|
flags |= CALIB_FIX_K4 | CALIB_FIX_K5 | CALIB_FIX_K6;
|
|
|
|
if( !(flags & CALIB_THIN_PRISM_MODEL) )
|
|
|
|
flags |= CALIB_FIX_S1_S2_S3_S4;
|
|
|
|
if( !(flags & CALIB_TILTED_MODEL) )
|
|
|
|
flags |= CALIB_FIX_TAUX_TAUY;
|
|
|
|
if( flags & CALIB_FIX_ASPECT_RATIO )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 0] = mask[idx + NINTRINSIC] = 0;
|
2022-09-05 06:01:22 +08:00
|
|
|
if ( flags & CALIB_SAME_FOCAL_LENGTH)
|
|
|
|
mask[idx + NINTRINSIC] = mask[idx + NINTRINSIC + 1] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_FOCAL_LENGTH )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 0] = mask[idx + 1] = mask[idx + NINTRINSIC] = mask[idx + NINTRINSIC+1] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_PRINCIPAL_POINT )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 2] = mask[idx + 3] = mask[idx + NINTRINSIC+2] = mask[idx + NINTRINSIC+3] = 0;
|
2017-08-25 18:05:16 +08:00
|
|
|
if( flags & (CALIB_ZERO_TANGENT_DIST|CALIB_FIX_TANGENT_DIST) )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 6] = mask[idx + 7] = mask[idx + NINTRINSIC+6] = mask[idx + NINTRINSIC+7] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_K1 )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 4] = mask[idx + NINTRINSIC+4] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_K2 )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 5] = mask[idx + NINTRINSIC+5] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_K3 )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 8] = mask[idx + NINTRINSIC+8] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_K4 )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 9] = mask[idx + NINTRINSIC+9] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_K5 )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 10] = mask[idx + NINTRINSIC+10] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_K6 )
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 11] = mask[idx + NINTRINSIC+11] = 0;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_S1_S2_S3_S4 )
|
2013-09-12 17:47:11 +08:00
|
|
|
{
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 12] = mask[idx + NINTRINSIC+12] = 0;
|
|
|
|
mask[idx + 13] = mask[idx + NINTRINSIC+13] = 0;
|
|
|
|
mask[idx + 14] = mask[idx + NINTRINSIC+14] = 0;
|
|
|
|
mask[idx + 15] = mask[idx + NINTRINSIC+15] = 0;
|
2013-09-12 17:47:11 +08:00
|
|
|
}
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_TAUX_TAUY )
|
2015-10-14 18:07:28 +08:00
|
|
|
{
|
2022-09-02 09:00:18 +08:00
|
|
|
mask[idx + 16] = mask[idx + NINTRINSIC+16] = 0;
|
|
|
|
mask[idx + 17] = mask[idx + NINTRINSIC+17] = 0;
|
2015-10-14 18:07:28 +08:00
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2018-01-27 03:05:13 +08:00
|
|
|
// storage for initial [om(R){i}|t{i}] (in order to compute the median for each component)
|
2022-09-03 00:11:42 +08:00
|
|
|
std::vector<double> rtsort(nimages*6);
|
2010-05-12 01:44:00 +08:00
|
|
|
/*
|
|
|
|
Compute initial estimate of pose
|
|
|
|
For each image, compute:
|
|
|
|
R(om) is the rotation matrix of om
|
|
|
|
om(R) is the rotation vector of R
|
|
|
|
R_ref = R(om_right) * R(om_left)'
|
|
|
|
T_ref_list = [T_ref_list; T_right - R_ref * T_left]
|
|
|
|
om_ref_list = {om_ref_list; om(R_ref)]
|
|
|
|
om = median(om_ref_list)
|
|
|
|
T = median(T_ref_list)
|
|
|
|
*/
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
int pos = 0;
|
|
|
|
for(int i = 0; i < nimages; i++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
int ni = _npoints.at<int>(i);
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat objpt_i = objectPoints.colRange(pos, pos + ni);
|
2021-06-07 20:55:25 +08:00
|
|
|
Matx33d R[2];
|
|
|
|
Vec3d rv, T[2];
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int k = 0; k < 2; k++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat imgpt_ik = imagePoints[k].colRange(pos, pos + ni);
|
2023-02-02 21:44:28 +08:00
|
|
|
solvePnP(objpt_i, imgpt_ik, A[k], distInitial[k], rv, T[k], false, SOLVEPNP_ITERATIVE );
|
2021-06-07 20:55:25 +08:00
|
|
|
Rodrigues(rv, R[k]);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
if( k == 0 )
|
|
|
|
{
|
|
|
|
// save initial om_left and T_left
|
2022-09-03 00:11:42 +08:00
|
|
|
param[(i+1)*6 + 0] = rv[0];
|
2021-06-07 20:55:25 +08:00
|
|
|
param[(i+1)*6 + 1] = rv[1];
|
|
|
|
param[(i+1)*6 + 2] = rv[2];
|
|
|
|
param[(i+1)*6 + 3] = T[0][0];
|
|
|
|
param[(i+1)*6 + 4] = T[0][1];
|
|
|
|
param[(i+1)*6 + 5] = T[0][2];
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
2021-06-07 20:55:25 +08:00
|
|
|
R[0] = R[1]*R[0].t();
|
|
|
|
T[1] -= R[0]*T[0];
|
|
|
|
|
|
|
|
Rodrigues(R[0], rv);
|
|
|
|
|
2022-09-03 00:11:42 +08:00
|
|
|
rtsort[i + nimages*0] = rv[0];
|
|
|
|
rtsort[i + nimages*1] = rv[1];
|
|
|
|
rtsort[i + nimages*2] = rv[2];
|
|
|
|
rtsort[i + nimages*3] = T[1][0];
|
|
|
|
rtsort[i + nimages*4] = T[1][1];
|
|
|
|
rtsort[i + nimages*5] = T[1][2];
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
|
|
|
|
pos += ni;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2018-01-27 03:05:13 +08:00
|
|
|
if(flags & CALIB_USE_EXTRINSIC_GUESS)
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2018-01-27 03:05:13 +08:00
|
|
|
Vec3d R, T;
|
2022-09-03 00:11:42 +08:00
|
|
|
matT.convertTo(T, CV_64F);
|
2018-01-27 03:05:13 +08:00
|
|
|
|
2022-09-03 00:11:42 +08:00
|
|
|
if( matR.rows == 3 && matR.cols == 3 )
|
|
|
|
Rodrigues(matR, R);
|
2018-01-27 03:05:13 +08:00
|
|
|
else
|
2022-09-03 00:11:42 +08:00
|
|
|
matR.convertTo(R, CV_64F);
|
2021-06-07 20:55:25 +08:00
|
|
|
|
|
|
|
param[0] = R[0];
|
|
|
|
param[1] = R[1];
|
|
|
|
param[2] = R[2];
|
|
|
|
param[3] = T[0];
|
|
|
|
param[4] = T[1];
|
|
|
|
param[5] = T[2];
|
2018-01-27 03:05:13 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// find the medians and save the first 6 parameters
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int i = 0; i < 6; i++ )
|
2018-01-27 03:05:13 +08:00
|
|
|
{
|
2022-09-03 00:11:42 +08:00
|
|
|
size_t idx = i*nimages;
|
|
|
|
std::nth_element(rtsort.begin() + idx,
|
|
|
|
rtsort.begin() + idx + nimages/2,
|
|
|
|
rtsort.begin() + idx + nimages);
|
|
|
|
double h = rtsort[idx + nimages/2];
|
|
|
|
param[i] = (nimages % 2 == 0) ? (h + rtsort[idx + nimages/2 - 1]) * 0.5 : h;
|
2018-01-27 03:05:13 +08:00
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if( recomputeIntrinsics )
|
2022-09-03 00:11:42 +08:00
|
|
|
{
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int k = 0; k < 2; k++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-02 09:00:18 +08:00
|
|
|
size_t idx = (nimages+1)*6 + k*NINTRINSIC;
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_ZERO_TANGENT_DIST )
|
2023-02-02 21:44:28 +08:00
|
|
|
distInitial[k][2] = distInitial[k][3] = 0;
|
2022-09-02 09:00:18 +08:00
|
|
|
param[idx + 0] = A[k](0, 0); param[idx + 1] = A[k](1, 1); param[idx + 2] = A[k](0, 2); param[idx + 3] = A[k](1, 2);
|
2022-09-03 00:11:42 +08:00
|
|
|
for (int i = 0; i < 14; i++)
|
|
|
|
{
|
2023-02-02 21:44:28 +08:00
|
|
|
param[idx + 4 + i] = distInitial[k][i];
|
2022-09-03 00:11:42 +08:00
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
2022-09-03 00:11:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Preallocated place for callback calculations
|
|
|
|
Mat errBuf( maxPoints*2, 1, CV_64F );
|
|
|
|
Mat JeBuf( maxPoints*2, 6, CV_64F );
|
|
|
|
Mat J_LRBuf( maxPoints*2, 6, CV_64F );
|
|
|
|
Mat JiBuf( maxPoints*2, NINTRINSIC, CV_64F, Scalar(0) );
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-17 00:00:00 +08:00
|
|
|
auto lmcallback = [&, recomputeIntrinsics, nimages, flags, NINTRINSIC, _npoints]
|
2022-09-13 21:45:20 +08:00
|
|
|
(InputOutputArray _param, OutputArray JtErr_, OutputArray JtJ_, double& errnorm)
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-02 09:00:18 +08:00
|
|
|
Mat_<double> param_m = _param.getMat();
|
|
|
|
Vec3d om_LR(param_m(0), param_m(1), param_m(2));
|
|
|
|
Vec3d T_LR(param_m(3), param_m(4), param_m(5));
|
2021-06-07 20:55:25 +08:00
|
|
|
Vec3d om[2], T[2];
|
|
|
|
Matx33d dr3dr1, dr3dr2, dt3dr2, dt3dt1, dt3dt2;
|
2022-09-13 21:45:20 +08:00
|
|
|
Matx33d intrin[2];
|
|
|
|
std::vector< std::vector<double> > distCoeffs(2, std::vector<double>(14, 0.0));
|
2010-05-12 01:44:00 +08:00
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
double reprojErr = 0;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
if( recomputeIntrinsics )
|
|
|
|
{
|
2022-09-17 00:00:00 +08:00
|
|
|
int idx = (nimages+1)*6;
|
2017-08-09 23:08:37 +08:00
|
|
|
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_SAME_FOCAL_LENGTH )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-02 09:00:18 +08:00
|
|
|
param_m(idx + NINTRINSIC ) = param_m(idx + 0);
|
|
|
|
param_m(idx + NINTRINSIC+1) = param_m(idx + 1);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
2017-06-07 21:49:41 +08:00
|
|
|
if( flags & CALIB_FIX_ASPECT_RATIO )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-02 09:00:18 +08:00
|
|
|
param_m(idx + 0) = aspectRatio[0]*param_m(idx + 1 );
|
|
|
|
param_m(idx + NINTRINSIC) = aspectRatio[1]*param_m(idx + 1 + NINTRINSIC);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int k = 0; k < 2; k++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-03 00:11:42 +08:00
|
|
|
double fx = param_m(idx + k*NINTRINSIC+0), fy = param_m(idx + k*NINTRINSIC+1);
|
|
|
|
double cx = param_m(idx + k*NINTRINSIC+2), cy = param_m(idx + k*NINTRINSIC+3);
|
2022-09-13 21:45:20 +08:00
|
|
|
intrin[k] = Matx33d(fx, 0, cx,
|
|
|
|
0, fy, cy,
|
|
|
|
0, 0, 1);
|
2021-06-07 20:55:25 +08:00
|
|
|
for(int j = 0; j < 14; j++)
|
2022-09-13 21:45:20 +08:00
|
|
|
distCoeffs[k][j] = param_m(idx + k*NINTRINSIC+4+j);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (int k = 0; k < 2; k++)
|
|
|
|
{
|
|
|
|
intrin[k] = A[k];
|
|
|
|
for(int j = 0; j < 14; j++)
|
2023-02-02 21:44:28 +08:00
|
|
|
distCoeffs[k][j] = distInitial[k][j];
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
int ptPos = 0;
|
|
|
|
for(int i = 0; i < nimages; i++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
int ni = _npoints.at<int>(i);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-17 00:00:00 +08:00
|
|
|
int idx = (i+1)*6;
|
2022-09-02 09:00:18 +08:00
|
|
|
om[0] = Vec3d(param_m(idx + 0), param_m(idx + 1), param_m(idx + 2));
|
|
|
|
T[0] = Vec3d(param_m(idx + 3), param_m(idx + 4), param_m(idx + 5));
|
2010-05-12 01:44:00 +08:00
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
if( JtJ_.needed() || JtErr_.needed() )
|
2021-06-07 20:55:25 +08:00
|
|
|
composeRT( om[0], T[0], om_LR, T_LR, om[1], T[1], dr3dr1, noArray(),
|
|
|
|
dr3dr2, noArray(), noArray(), dt3dt1, dt3dr2, dt3dt2 );
|
2010-05-12 01:44:00 +08:00
|
|
|
else
|
2021-06-07 20:55:25 +08:00
|
|
|
composeRT( om[0], T[0], om_LR, T_LR, om[1], T[1] );
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2022-09-03 00:11:42 +08:00
|
|
|
Mat objpt_i = objectPoints(Range::all(), Range(ptPos, ptPos + ni));
|
|
|
|
Mat err = errBuf (Range(0, ni*2), Range::all());
|
|
|
|
Mat Je = JeBuf (Range(0, ni*2), Range::all());
|
|
|
|
Mat J_LR = J_LRBuf(Range(0, ni*2), Range::all());
|
|
|
|
Mat Ji = JiBuf (Range(0, ni*2), Range::all());
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
Mat tmpImagePoints = err.reshape(2, 1);
|
|
|
|
Mat dpdf = Ji.colRange(0, 2);
|
|
|
|
Mat dpdc = Ji.colRange(2, 4);
|
|
|
|
Mat dpdk = Ji.colRange(4, NINTRINSIC);
|
|
|
|
Mat dpdrot = Je.colRange(0, 3);
|
|
|
|
Mat dpdt = Je.colRange(3, 6);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int k = 0; k < 2; k++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-03 00:11:42 +08:00
|
|
|
Mat imgpt_ik = imagePoints[k](Range::all(), Range(ptPos, ptPos + ni));
|
2010-05-12 01:44:00 +08:00
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
if( JtJ_.needed() || JtErr_.needed() )
|
2022-09-13 21:45:20 +08:00
|
|
|
projectPoints(objpt_i, om[k], T[k], intrin[k], distCoeffs[k],
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
tmpImagePoints, dpdrot, dpdt, dpdf, dpdc, dpdk, noArray(),
|
|
|
|
(flags & CALIB_FIX_ASPECT_RATIO) ? aspectRatio[k] : 0.);
|
2010-05-12 01:44:00 +08:00
|
|
|
else
|
2022-09-13 21:45:20 +08:00
|
|
|
projectPoints(objpt_i, om[k], T[k], intrin[k], distCoeffs[k], tmpImagePoints);
|
2021-06-07 20:55:25 +08:00
|
|
|
subtract( tmpImagePoints, imgpt_ik, tmpImagePoints );
|
2010-05-12 01:44:00 +08:00
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
if( JtJ_.needed() )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
Mat JtErr = JtErr_.getMat();
|
|
|
|
Mat JtJ = JtJ_.getMat();
|
2010-05-12 01:44:00 +08:00
|
|
|
int iofs = (nimages+1)*6 + k*NINTRINSIC, eofs = (i+1)*6;
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
assert( JtJ_.needed() && JtErr_.needed() );
|
2017-08-09 23:08:37 +08:00
|
|
|
|
2010-05-12 01:44:00 +08:00
|
|
|
if( k == 1 )
|
|
|
|
{
|
|
|
|
// d(err_{x|y}R) ~ de3
|
|
|
|
// convert de3/{dr3,dt3} => de3{dr1,dt1} & de3{dr2,dt2}
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int p = 0; p < ni*2; p++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-03 00:11:42 +08:00
|
|
|
Matx13d de3dr3, de3dt3, de3dr2, de3dt2, de3dr1, de3dt1;
|
|
|
|
for(int j = 0; j < 3; j++)
|
|
|
|
de3dr3(j) = Je.at<double>(p, j);
|
|
|
|
|
|
|
|
for(int j = 0; j < 3; j++)
|
|
|
|
de3dt3(j) = Je.at<double>(p, 3+j);
|
|
|
|
|
|
|
|
for(int j = 0; j < 3; j++)
|
|
|
|
de3dr2(j) = J_LR.at<double>(p, j);
|
|
|
|
|
|
|
|
for(int j = 0; j < 3; j++)
|
|
|
|
de3dt2(j) = J_LR.at<double>(p, 3+j);
|
|
|
|
|
|
|
|
de3dr1 = de3dr3 * dr3dr1;
|
|
|
|
de3dt1 = de3dt3 * dt3dt1;
|
|
|
|
de3dr2 = de3dr3 * dr3dr2 + de3dt3 * dt3dr2;
|
|
|
|
de3dt2 = de3dt3 * dt3dt2;
|
|
|
|
|
|
|
|
for(int j = 0; j < 3; j++)
|
|
|
|
Je.at<double>(p, j) = de3dr1(j);
|
|
|
|
|
|
|
|
for(int j = 0; j < 3; j++)
|
|
|
|
Je.at<double>(p, 3+j) = de3dt1(j);
|
|
|
|
|
|
|
|
for(int j = 0; j < 3; j++)
|
|
|
|
J_LR.at<double>(p, j) = de3dr2(j);
|
|
|
|
|
|
|
|
for(int j = 0; j < 3; j++)
|
|
|
|
J_LR.at<double>(p, 3+j) = de3dt2(j);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
JtJ(Rect(0, 0, 6, 6)) += J_LR.t()*J_LR;
|
|
|
|
JtJ(Rect(eofs, 0, 6, 6)) = J_LR.t()*Je;
|
|
|
|
JtErr.rowRange(0, 6) += J_LR.t()*err;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
JtJ(Rect(eofs, eofs, 6, 6)) += Je.t()*Je;
|
|
|
|
JtErr.rowRange(eofs, eofs + 6) += Je.t()*err;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
if( recomputeIntrinsics )
|
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
JtJ(Rect(iofs, iofs, NINTRINSIC, NINTRINSIC)) += Ji.t()*Ji;
|
|
|
|
JtJ(Rect(iofs, eofs, NINTRINSIC, 6)) += Je.t()*Ji;
|
2010-05-12 01:44:00 +08:00
|
|
|
if( k == 1 )
|
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
JtJ(Rect(iofs, 0, NINTRINSIC, 6)) += J_LR.t()*Ji;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
2021-06-07 20:55:25 +08:00
|
|
|
JtErr.rowRange(iofs, iofs + NINTRINSIC) += Ji.t()*err;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-27 03:05:13 +08:00
|
|
|
double viewErr = norm(err, NORM_L2SQR);
|
2022-09-03 00:11:42 +08:00
|
|
|
if(!perViewErr.empty())
|
|
|
|
perViewErr.at<double>(i, k) = std::sqrt(viewErr/ni);
|
2018-01-27 03:05:13 +08:00
|
|
|
reprojErr += viewErr;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
|
|
|
|
ptPos += ni;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
errnorm = reprojErr;
|
2021-06-07 20:55:25 +08:00
|
|
|
return true;
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
double reprojErr = 0;
|
|
|
|
if (countNonZero(mask))
|
|
|
|
{
|
|
|
|
LevMarq solver(param, lmcallback,
|
|
|
|
LevMarq::Settings()
|
|
|
|
.setMaxIterations((unsigned int)termCrit.maxCount)
|
|
|
|
.setStepNormTolerance(termCrit.epsilon)
|
|
|
|
.setSmallEnergyTolerance(termCrit.epsilon * termCrit.epsilon),
|
|
|
|
mask);
|
|
|
|
// geodesic not supported for normal callbacks
|
|
|
|
LevMarq::Report r = solver.optimize();
|
|
|
|
|
2022-09-09 23:20:27 +08:00
|
|
|
// If solver failed, then the last calculated perViewErr can be wrong & should be recalculated
|
|
|
|
if (!r.found && !perViewErr.empty())
|
|
|
|
{
|
|
|
|
lmcallback(param, noArray(), noArray(), reprojErr);
|
|
|
|
}
|
|
|
|
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
reprojErr = r.energy;
|
|
|
|
}
|
2021-06-07 20:55:25 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
// Extract optimized params from the param vector
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
Vec3d om_LR(param[0], param[1], param[2]);
|
|
|
|
Vec3d T_LR(param[3], param[4], param[5]);
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
Matx33d R_LR;
|
2021-06-07 20:55:25 +08:00
|
|
|
Rodrigues( om_LR, R_LR );
|
2022-09-03 00:11:42 +08:00
|
|
|
if( matR.rows == 1 || matR.cols == 1 )
|
|
|
|
om_LR.convertTo(matR, matR.depth());
|
2010-05-12 01:44:00 +08:00
|
|
|
else
|
2022-09-03 00:11:42 +08:00
|
|
|
R_LR.convertTo(matR, matR.depth());
|
|
|
|
T_LR.convertTo(matT, matT.depth());
|
2010-05-12 01:44:00 +08:00
|
|
|
|
|
|
|
if( recomputeIntrinsics )
|
|
|
|
{
|
Merge pull request #21018 from savuor:levmarqfromscratch
New LevMarq implementation
* Hash TSDF fix: apply volume pose when fetching pose
* DualQuat minor fix
* Pose Graph: getEdgePose(), getEdgeInfo()
* debugging code for pose graph
* add edge to submap
* pose averaging: DualQuats instead of matrix averaging
* overlapping ratio: rise it up; minor comment
* remove `Submap::addEdgeToSubmap`
* test_pose_graph: minor
* SparseBlockMatrix: support 1xN as well as Nx1 for residual vector
* small changes to old LMSolver
* new LevMarq impl
* Pose Graph rewritten to use new impl
* solvePnP(), findHomography() and findExtrinsicCameraParams2() use new impl
* estimateAffine...2D() use new impl
* calibration and stereo calibration use new impl
* BundleAdjusterBase::estimate() uses new impl
* new LevMarq interface
* PoseGraph: changing opt interface
* findExtrinsicCameraParams2(): opt interface updated
* HomographyRefine: opt interface updated
* solvePnPRefine opt interface fixed
* Affine2DRefine opt interface fixed
* BundleAdjuster::estimate() opt interface fixed
* calibration: opt interface fixed + code refactored a little
* minor warning fixes
* geodesic acceleration, Impl -> Backend rename
* calcFunc() always uses probe vars
* solveDecomposed, fixing negation
* fixing geodesic acceleration + minors
* PoseGraph exposes its optimizer now + its tests updated to check better convegence
* Rosenbrock test added for LevMarq
* LevMarq params upgraded
* Rosenbrock can do better
* fixing stereo calibration
* old implementation removed (as well as debug code)
* more debugging code removed
* fix warnings
* fixing warnings
* fixing Eigen dependency
* trying to fix Eigen deps
* debugging code for submat is now temporary
* trying to fix Eigen dependency
* relax sanity check for solvePnP
* relaxing sanity check even more
* trying to fix Eigen dependency
* warning fix
* Quat<T>: fixing warnings
* more warning fixes
* fixed warning
* fixing *KinFu OCL tests
* algo params -> struct Settings
* Backend moved to details
* BaseLevMarq -> LevMarqBase
* detail/pose_graph.hpp -> detail/optimizer.hpp
* fixing include stuff for details/optimizer.hpp
* doc fix
* LevMarqBase rework: Settings, pImpl, Backend
* Impl::settings and ::backend fix
* HashTSDFGPU fix
* fixing compilation
* warning fix for OdometryFrameImplTMat
* docs fix + compile warnings
* remake: new class LevMarq with pImpl and enums, LevMarqBase => detail, no Backend class, Settings() => .cpp, Settings==() removed, Settings.set...() inlines
* fixing warnings & whitespace
2021-12-28 05:51:32 +08:00
|
|
|
for(int k = 0; k < 2; k++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-02 09:00:18 +08:00
|
|
|
size_t idx = (nimages+1)*6 + k*NINTRINSIC;
|
|
|
|
A[k] = Matx33d(param[idx + 0], 0, param[idx + 2], 0, param[idx + 1], param[idx + 3], 0, 0, 1);
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
Mat& cameraMatrix = k == 0 ? _cameraMatrix1 : _cameraMatrix2;
|
|
|
|
Mat& distCoeffs = k == 0 ? _distCoeffs1 : _distCoeffs2;
|
|
|
|
A[k].convertTo(cameraMatrix, cameraMatrix.depth());
|
2023-02-02 21:44:28 +08:00
|
|
|
|
|
|
|
std::vector<double> vdist(14);
|
|
|
|
for(int j = 0; j < 14; j++)
|
|
|
|
vdist[j] = param[idx + 4 + j];
|
|
|
|
|
|
|
|
Mat tdist( distCoeffs.size(), CV_MAKETYPE(CV_64F, distCoeffs.channels()), vdist.data());
|
2021-06-07 20:55:25 +08:00
|
|
|
tdist.convertTo(distCoeffs, distCoeffs.depth());
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-03 00:11:42 +08:00
|
|
|
if( !matE.empty() || !matF.empty() )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
Matx33d Tx(0, -T_LR[2], T_LR[1],
|
|
|
|
T_LR[2], 0, -T_LR[0],
|
2022-09-03 00:11:42 +08:00
|
|
|
-T_LR[1], T_LR[0], 0);
|
2021-06-07 20:55:25 +08:00
|
|
|
Matx33d E = Tx*R_LR;
|
2022-09-03 00:11:42 +08:00
|
|
|
if( !matE.empty() )
|
|
|
|
E.convertTo(matE, matE.depth());
|
|
|
|
if( !matF.empty())
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2021-06-07 20:55:25 +08:00
|
|
|
Matx33d iA0 = A[0].inv(), iA1 = A[1].inv();
|
2022-09-03 00:11:42 +08:00
|
|
|
Matx33d F = iA1.t() * E * iA0;
|
|
|
|
F.convertTo(matF, matF.depth(), fabs(F(2,2)) > 0 ? 1./F(2,2) : 1.);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
2011-06-17 14:31:54 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
Mat r1d = rvecs.empty() ? Mat() : rvecs.reshape(1, nimages);
|
|
|
|
Mat t1d = tvecs.empty() ? Mat() : tvecs.reshape(1, nimages);
|
|
|
|
for(int i = 0; i < nimages; i++ )
|
|
|
|
{
|
|
|
|
int idx = (i + 1) * 6;
|
|
|
|
|
|
|
|
if( !rvecs.empty() )
|
|
|
|
{
|
|
|
|
Vec3d srcR(param[idx + 0], param[idx + 1], param[idx + 2]);
|
|
|
|
if( rvecs.rows * rvecs.cols * rvecs.channels() == nimages * 9 )
|
|
|
|
{
|
|
|
|
Matx33d rod;
|
|
|
|
Rodrigues(srcR, rod);
|
|
|
|
rod.convertTo(r1d.row(i).reshape(1, 3), rvecs.depth());
|
|
|
|
}
|
|
|
|
else if (rvecs.rows * rvecs.cols * rvecs.channels() == nimages * 3 )
|
|
|
|
{
|
|
|
|
Mat(Mat(srcR).t()).convertTo(r1d.row(i), rvecs.depth());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( !tvecs.empty() )
|
|
|
|
{
|
|
|
|
Vec3d srcT(param[idx + 3], param[idx + 4], param[idx + 5]);
|
|
|
|
Mat(Mat(srcT).t()).convertTo(t1d.row(i), tvecs.depth());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-11-30 18:27:34 +08:00
|
|
|
return std::sqrt(reprojErr/(pointsTotal*2));
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
2020-12-02 04:42:15 +08:00
|
|
|
|
2011-06-06 22:51:27 +08:00
|
|
|
static void collectCalibrationData( InputArrayOfArrays objectPoints,
|
|
|
|
InputArrayOfArrays imagePoints1,
|
|
|
|
InputArrayOfArrays imagePoints2,
|
2018-10-29 10:19:02 +08:00
|
|
|
int iFixedPoint,
|
2022-09-13 21:45:20 +08:00
|
|
|
OutputArray objPt, OutputArray imgPt1, OutputArray imgPt2,
|
|
|
|
OutputArray npoints )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2011-04-17 21:14:45 +08:00
|
|
|
int nimages = (int)objectPoints.total();
|
2019-12-09 23:24:36 +08:00
|
|
|
int total = 0;
|
|
|
|
CV_Assert(nimages > 0);
|
|
|
|
CV_CheckEQ(nimages, (int)imagePoints1.total(), "");
|
2022-09-13 21:45:20 +08:00
|
|
|
if (!imagePoints2.empty())
|
|
|
|
{
|
2019-12-09 23:24:36 +08:00
|
|
|
CV_CheckEQ(nimages, (int)imagePoints2.total(), "");
|
2022-09-13 21:45:20 +08:00
|
|
|
CV_Assert(imgPt2.needed());
|
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2019-12-09 23:24:36 +08:00
|
|
|
for (int i = 0; i < nimages; i++)
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2019-02-12 05:07:30 +08:00
|
|
|
Mat objectPoint = objectPoints.getMat(i);
|
|
|
|
if (objectPoint.empty())
|
|
|
|
CV_Error(CV_StsBadSize, "objectPoints should not contain empty vector of vectors of points");
|
2019-12-09 23:24:36 +08:00
|
|
|
int numberOfObjectPoints = objectPoint.checkVector(3, CV_32F);
|
|
|
|
if (numberOfObjectPoints <= 0)
|
2015-01-11 07:02:58 +08:00
|
|
|
CV_Error(CV_StsUnsupportedFormat, "objectPoints should contain vector of vectors of points of type Point3f");
|
2019-02-12 05:07:30 +08:00
|
|
|
|
|
|
|
Mat imagePoint1 = imagePoints1.getMat(i);
|
|
|
|
if (imagePoint1.empty())
|
|
|
|
CV_Error(CV_StsBadSize, "imagePoints1 should not contain empty vector of vectors of points");
|
2019-12-09 23:24:36 +08:00
|
|
|
int numberOfImagePoints = imagePoint1.checkVector(2, CV_32F);
|
|
|
|
if (numberOfImagePoints <= 0)
|
2015-01-11 07:02:58 +08:00
|
|
|
CV_Error(CV_StsUnsupportedFormat, "imagePoints1 should contain vector of vectors of points of type Point2f");
|
2019-12-09 23:24:36 +08:00
|
|
|
CV_CheckEQ(numberOfObjectPoints, numberOfImagePoints, "Number of object and image points must be equal");
|
2015-01-11 07:02:58 +08:00
|
|
|
|
2019-12-09 23:24:36 +08:00
|
|
|
total += numberOfObjectPoints;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
npoints.create(1, (int)nimages, CV_32S);
|
2022-09-13 21:45:20 +08:00
|
|
|
objPt.create(1, (int)total, CV_32FC3);
|
|
|
|
imgPt1.create(1, (int)total, CV_32FC2);
|
2010-05-12 01:44:00 +08:00
|
|
|
Point2f* imgPtData2 = 0;
|
2011-06-17 14:31:54 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat imgPt1Mat = imgPt1.getMat();
|
|
|
|
if (!imagePoints2.empty())
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
imgPt2.create(1, (int)total, CV_32FC2);
|
|
|
|
imgPtData2 = imgPt2.getMat().ptr<Point2f>();
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
Mat nPointsMat = npoints.getMat();
|
|
|
|
Mat objPtMat = objPt.getMat();
|
2010-05-12 01:44:00 +08:00
|
|
|
Point3f* objPtData = objPtMat.ptr<Point3f>();
|
2022-09-13 21:45:20 +08:00
|
|
|
Point2f* imgPtData1 = imgPt1.getMat().ptr<Point2f>();
|
2011-06-17 14:31:54 +08:00
|
|
|
|
2019-12-09 23:24:36 +08:00
|
|
|
for (int i = 0, j = 0; i < nimages; i++)
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2011-04-17 21:14:45 +08:00
|
|
|
Mat objpt = objectPoints.getMat(i);
|
|
|
|
Mat imgpt1 = imagePoints1.getMat(i);
|
2019-12-09 23:24:36 +08:00
|
|
|
int numberOfObjectPoints = objpt.checkVector(3, CV_32F);
|
2022-09-13 21:45:20 +08:00
|
|
|
nPointsMat.at<int>(i) = numberOfObjectPoints;
|
2019-12-09 23:24:36 +08:00
|
|
|
for (int n = 0; n < numberOfObjectPoints; ++n)
|
2018-09-06 19:34:16 +08:00
|
|
|
{
|
|
|
|
objPtData[j + n] = objpt.ptr<Point3f>()[n];
|
|
|
|
imgPtData1[j + n] = imgpt1.ptr<Point2f>()[n];
|
|
|
|
}
|
2012-03-19 01:28:44 +08:00
|
|
|
|
2019-12-09 23:24:36 +08:00
|
|
|
if (imgPtData2)
|
2011-04-17 21:14:45 +08:00
|
|
|
{
|
|
|
|
Mat imgpt2 = imagePoints2.getMat(i);
|
2019-12-09 23:24:36 +08:00
|
|
|
int numberOfImage2Points = imgpt2.checkVector(2, CV_32F);
|
|
|
|
CV_CheckEQ(numberOfObjectPoints, numberOfImage2Points, "Number of object and image(2) points must be equal");
|
|
|
|
for (int n = 0; n < numberOfImage2Points; ++n)
|
2018-09-06 19:34:16 +08:00
|
|
|
{
|
|
|
|
imgPtData2[j + n] = imgpt2.ptr<Point2f>()[n];
|
|
|
|
}
|
2011-04-17 21:14:45 +08:00
|
|
|
}
|
2019-12-09 23:24:36 +08:00
|
|
|
|
|
|
|
j += numberOfObjectPoints;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
|
2022-09-13 21:45:20 +08:00
|
|
|
int ni = nPointsMat.at<int>(0);
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
bool releaseObject = iFixedPoint > 0 && iFixedPoint < ni - 1;
|
|
|
|
// check object points. If not qualified, report errors.
|
|
|
|
if( releaseObject )
|
|
|
|
{
|
2019-12-19 19:01:24 +08:00
|
|
|
for (int i = 1; i < nimages; i++)
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
if( nPointsMat.at<int>(i) != ni )
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
{
|
|
|
|
CV_Error( CV_StsBadArg, "All objectPoints[i].size() should be equal when "
|
|
|
|
"object-releasing method is requested." );
|
|
|
|
}
|
|
|
|
Mat ocmp = objPtMat.colRange(ni * i, ni * i + ni) != objPtMat.colRange(0, ni);
|
|
|
|
ocmp = ocmp.reshape(1);
|
|
|
|
if( countNonZero(ocmp) )
|
|
|
|
{
|
|
|
|
CV_Error( CV_StsBadArg, "All objectPoints[i] should be identical when object-releasing"
|
|
|
|
" method is requested." );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void collectCalibrationData( InputArrayOfArrays objectPoints,
|
|
|
|
InputArrayOfArrays imagePoints1,
|
|
|
|
InputArrayOfArrays imagePoints2,
|
2022-09-13 21:45:20 +08:00
|
|
|
OutputArray objPt, OutputArray imgPtMat1, OutputArray imgPtMat2,
|
|
|
|
OutputArray npoints )
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
collectCalibrationData( objectPoints, imagePoints1, imagePoints2, -1, objPt, imgPtMat1,
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
imgPtMat2, npoints );
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
2010-10-28 02:26:39 +08:00
|
|
|
|
2018-11-09 21:12:22 +08:00
|
|
|
static Mat prepareCameraMatrix(Mat& cameraMatrix0, int rtype, int flags)
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
|
|
|
Mat cameraMatrix = Mat::eye(3, 3, rtype);
|
|
|
|
if( cameraMatrix0.size() == cameraMatrix.size() )
|
|
|
|
cameraMatrix0.convertTo(cameraMatrix, rtype);
|
2018-11-09 21:12:22 +08:00
|
|
|
else if( flags & CALIB_USE_INTRINSIC_GUESS )
|
|
|
|
CV_Error(Error::StsBadArg, "CALIB_USE_INTRINSIC_GUESS flag is set, but the camera matrix is not 3x3");
|
2010-05-12 01:44:00 +08:00
|
|
|
return cameraMatrix;
|
|
|
|
}
|
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
Mat initCameraMatrix2D( InputArrayOfArrays objectPoints,
|
|
|
|
InputArrayOfArrays imagePoints,
|
|
|
|
Size imageSize, double aspectRatio )
|
|
|
|
{
|
|
|
|
CV_INSTRUMENT_REGION();
|
|
|
|
|
|
|
|
Mat objPt, imgPt, npoints, cameraMatrix;
|
|
|
|
collectCalibrationData( objectPoints, imagePoints, noArray(),
|
2022-09-13 21:45:20 +08:00
|
|
|
objPt, imgPt, noArray(), npoints );
|
2020-12-02 04:42:15 +08:00
|
|
|
initIntrinsicParams2D( objPt, imgPt, npoints, imageSize, cameraMatrix, aspectRatio );
|
|
|
|
return cameraMatrix;
|
|
|
|
}
|
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
static Mat prepareDistCoeffs(Mat& distCoeffs0, int rtype, int outputSize)
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2023-02-02 21:44:28 +08:00
|
|
|
Size sz = distCoeffs0.size();
|
|
|
|
int n = sz.area();
|
|
|
|
if (n > 0)
|
|
|
|
CV_Assert(sz.width == 1 || sz.height == 1);
|
2016-07-12 18:34:34 +08:00
|
|
|
CV_Assert((int)distCoeffs0.total() <= outputSize);
|
2023-02-02 21:44:28 +08:00
|
|
|
Mat distCoeffs = Mat::zeros(sz.width == 1 ? Size(1, outputSize) : Size(outputSize, 1), rtype);
|
|
|
|
if( n == 4 || n == 5 || n == 8 || n == 12 || n == 14 )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2023-02-02 21:44:28 +08:00
|
|
|
distCoeffs0.convertTo(distCoeffs(Rect(Point(), sz)), rtype);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
return distCoeffs;
|
|
|
|
}
|
2011-06-17 14:31:54 +08:00
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
double calibrateCamera( InputArrayOfArrays _objectPoints,
|
|
|
|
InputArrayOfArrays _imagePoints,
|
|
|
|
Size imageSize, InputOutputArray _cameraMatrix, InputOutputArray _distCoeffs,
|
|
|
|
OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs, int flags, TermCriteria criteria )
|
2016-06-07 17:31:11 +08:00
|
|
|
{
|
2018-09-14 05:35:26 +08:00
|
|
|
CV_INSTRUMENT_REGION();
|
2016-08-18 14:53:00 +08:00
|
|
|
|
2016-06-07 17:31:11 +08:00
|
|
|
return calibrateCamera(_objectPoints, _imagePoints, imageSize, _cameraMatrix, _distCoeffs,
|
|
|
|
_rvecs, _tvecs, noArray(), noArray(), noArray(), flags, criteria);
|
|
|
|
}
|
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
double calibrateCamera(InputArrayOfArrays _objectPoints,
|
|
|
|
InputArrayOfArrays _imagePoints,
|
|
|
|
Size imageSize, InputOutputArray _cameraMatrix, InputOutputArray _distCoeffs,
|
|
|
|
OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs,
|
|
|
|
OutputArray stdDeviationsIntrinsics,
|
|
|
|
OutputArray stdDeviationsExtrinsics,
|
|
|
|
OutputArray _perViewErrors, int flags, TermCriteria criteria )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2018-09-14 05:35:26 +08:00
|
|
|
CV_INSTRUMENT_REGION();
|
2016-08-18 14:53:00 +08:00
|
|
|
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
return calibrateCameraRO(_objectPoints, _imagePoints, imageSize, -1, _cameraMatrix, _distCoeffs,
|
|
|
|
_rvecs, _tvecs, noArray(), stdDeviationsIntrinsics, stdDeviationsExtrinsics,
|
|
|
|
noArray(), _perViewErrors, flags, criteria);
|
|
|
|
}
|
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
double calibrateCameraRO(InputArrayOfArrays _objectPoints,
|
|
|
|
InputArrayOfArrays _imagePoints,
|
|
|
|
Size imageSize, int iFixedPoint, InputOutputArray _cameraMatrix,
|
|
|
|
InputOutputArray _distCoeffs,
|
|
|
|
OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs,
|
|
|
|
OutputArray newObjPoints,
|
|
|
|
int flags, TermCriteria criteria)
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
{
|
|
|
|
CV_INSTRUMENT_REGION();
|
|
|
|
|
|
|
|
return calibrateCameraRO(_objectPoints, _imagePoints, imageSize, iFixedPoint, _cameraMatrix,
|
|
|
|
_distCoeffs, _rvecs, _tvecs, newObjPoints, noArray(), noArray(),
|
|
|
|
noArray(), noArray(), flags, criteria);
|
|
|
|
}
|
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
double calibrateCameraRO(InputArrayOfArrays _objectPoints,
|
|
|
|
InputArrayOfArrays _imagePoints,
|
|
|
|
Size imageSize, int iFixedPoint, InputOutputArray _cameraMatrix,
|
|
|
|
InputOutputArray _distCoeffs,
|
|
|
|
OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs,
|
|
|
|
OutputArray newObjPoints,
|
|
|
|
OutputArray stdDeviationsIntrinsics,
|
|
|
|
OutputArray stdDeviationsExtrinsics,
|
|
|
|
OutputArray stdDeviationsObjPoints,
|
|
|
|
OutputArray _perViewErrors, int flags, TermCriteria criteria )
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
{
|
|
|
|
CV_INSTRUMENT_REGION();
|
|
|
|
|
2010-05-12 01:44:00 +08:00
|
|
|
int rtype = CV_64F;
|
2018-11-09 21:12:22 +08:00
|
|
|
|
|
|
|
CV_Assert( _cameraMatrix.needed() );
|
|
|
|
CV_Assert( _distCoeffs.needed() );
|
|
|
|
|
2011-04-17 21:14:45 +08:00
|
|
|
Mat cameraMatrix = _cameraMatrix.getMat();
|
2018-11-09 21:12:22 +08:00
|
|
|
cameraMatrix = prepareCameraMatrix(cameraMatrix, rtype, flags);
|
2011-04-17 21:14:45 +08:00
|
|
|
Mat distCoeffs = _distCoeffs.getMat();
|
2021-06-07 20:55:25 +08:00
|
|
|
distCoeffs =
|
|
|
|
(flags & CALIB_THIN_PRISM_MODEL) &&
|
|
|
|
!(flags & CALIB_TILTED_MODEL) ?
|
|
|
|
prepareDistCoeffs(distCoeffs, rtype, 12) :
|
2023-02-02 21:44:28 +08:00
|
|
|
prepareDistCoeffs(distCoeffs, rtype, 14);
|
2015-10-14 18:07:28 +08:00
|
|
|
if( !(flags & CALIB_RATIONAL_MODEL) &&
|
|
|
|
(!(flags & CALIB_THIN_PRISM_MODEL)) &&
|
|
|
|
(!(flags & CALIB_TILTED_MODEL)))
|
2010-11-30 04:06:44 +08:00
|
|
|
distCoeffs = distCoeffs.rows == 1 ? distCoeffs.colRange(0, 5) : distCoeffs.rowRange(0, 5);
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2015-09-17 00:15:55 +08:00
|
|
|
int nimages = int(_objectPoints.total());
|
2010-05-12 01:44:00 +08:00
|
|
|
CV_Assert( nimages > 0 );
|
2016-06-07 17:31:11 +08:00
|
|
|
Mat objPt, imgPt, npoints, rvecM, tvecM, stdDeviationsM, errorsM;
|
2015-09-17 00:15:55 +08:00
|
|
|
|
2016-06-07 17:31:11 +08:00
|
|
|
bool rvecs_needed = _rvecs.needed(), tvecs_needed = _tvecs.needed(),
|
|
|
|
stddev_needed = stdDeviationsIntrinsics.needed(), errors_needed = _perViewErrors.needed(),
|
|
|
|
stddev_ext_needed = stdDeviationsExtrinsics.needed();
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
bool newobj_needed = newObjPoints.needed();
|
|
|
|
bool stddev_obj_needed = stdDeviationsObjPoints.needed();
|
2015-09-17 00:15:55 +08:00
|
|
|
|
2015-09-17 00:36:42 +08:00
|
|
|
bool rvecs_mat_vec = _rvecs.isMatVector();
|
|
|
|
bool tvecs_mat_vec = _tvecs.isMatVector();
|
|
|
|
|
2016-06-07 17:31:11 +08:00
|
|
|
if( rvecs_needed )
|
|
|
|
{
|
2015-09-17 00:15:55 +08:00
|
|
|
_rvecs.create(nimages, 1, CV_64FC3);
|
2015-09-17 00:36:42 +08:00
|
|
|
|
|
|
|
if(rvecs_mat_vec)
|
|
|
|
rvecM.create(nimages, 3, CV_64F);
|
|
|
|
else
|
|
|
|
rvecM = _rvecs.getMat();
|
2015-09-17 00:15:55 +08:00
|
|
|
}
|
|
|
|
|
2016-06-07 17:31:11 +08:00
|
|
|
if( tvecs_needed )
|
|
|
|
{
|
2015-09-17 00:15:55 +08:00
|
|
|
_tvecs.create(nimages, 1, CV_64FC3);
|
2015-09-17 00:36:42 +08:00
|
|
|
|
|
|
|
if(tvecs_mat_vec)
|
|
|
|
tvecM.create(nimages, 3, CV_64F);
|
|
|
|
else
|
|
|
|
tvecM = _tvecs.getMat();
|
2015-09-17 00:15:55 +08:00
|
|
|
}
|
|
|
|
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
collectCalibrationData( _objectPoints, _imagePoints, noArray(), iFixedPoint,
|
2022-09-13 21:45:20 +08:00
|
|
|
objPt, imgPt, noArray(), npoints );
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
bool releaseObject = iFixedPoint > 0 && iFixedPoint < npoints.at<int>(0) - 1;
|
|
|
|
|
|
|
|
newobj_needed = newobj_needed && releaseObject;
|
|
|
|
int np = npoints.at<int>( 0 );
|
|
|
|
Mat newObjPt;
|
|
|
|
if( newobj_needed ) {
|
|
|
|
newObjPoints.create( 1, np, CV_32FC3 );
|
|
|
|
newObjPt = newObjPoints.getMat();
|
|
|
|
}
|
|
|
|
|
|
|
|
stddev_obj_needed = stddev_obj_needed && releaseObject;
|
|
|
|
bool stddev_any_needed = stddev_needed || stddev_ext_needed || stddev_obj_needed;
|
2018-09-19 12:27:07 +08:00
|
|
|
if( stddev_any_needed )
|
2016-06-07 17:31:11 +08:00
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int sz = nimages*6 + CALIB_NINTRINSIC + (releaseObject ? np * 3 : 0);
|
|
|
|
stdDeviationsM.create(sz, 1, CV_64F);
|
2016-06-07 17:31:11 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if( errors_needed )
|
|
|
|
{
|
|
|
|
_perViewErrors.create(nimages, 1, CV_64F);
|
|
|
|
errorsM = _perViewErrors.getMat();
|
|
|
|
}
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
double reprojErr = calibrateCameraInternal(
|
|
|
|
objPt, imgPt, npoints, imageSize, iFixedPoint,
|
|
|
|
cameraMatrix, distCoeffs,
|
2022-09-13 21:45:20 +08:00
|
|
|
rvecM, tvecM,
|
|
|
|
newObjPt,
|
|
|
|
stdDeviationsM,
|
|
|
|
errorsM, flags, cvTermCriteria(criteria));
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
|
2016-06-07 17:31:11 +08:00
|
|
|
if( stddev_needed )
|
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
stdDeviationsM.rowRange(0, CALIB_NINTRINSIC).copyTo(stdDeviationsIntrinsics);
|
2016-06-07 17:31:11 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( stddev_ext_needed )
|
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int s = CALIB_NINTRINSIC;
|
|
|
|
stdDeviationsM.rowRange(s, s + nimages*6).copyTo(stdDeviationsExtrinsics);
|
2016-06-07 17:31:11 +08:00
|
|
|
}
|
2012-03-19 01:28:44 +08:00
|
|
|
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
if( stddev_obj_needed )
|
|
|
|
{
|
2022-09-13 21:45:20 +08:00
|
|
|
int s = CALIB_NINTRINSIC + nimages*6;
|
|
|
|
stdDeviationsM.rowRange(s, s + np*3).copyTo(stdDeviationsObjPoints);
|
Merge pull request #12772 from xoox:calib-release-object
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
2018-10-26 00:38:55 +08:00
|
|
|
}
|
|
|
|
|
2015-09-17 00:36:42 +08:00
|
|
|
// overly complicated and inefficient rvec/ tvec handling to support vector<Mat>
|
2015-09-17 00:15:55 +08:00
|
|
|
for(int i = 0; i < nimages; i++ )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2015-09-17 00:36:42 +08:00
|
|
|
if( rvecs_needed && rvecs_mat_vec)
|
2011-07-27 21:03:59 +08:00
|
|
|
{
|
|
|
|
_rvecs.create(3, 1, CV_64F, i, true);
|
|
|
|
Mat rv = _rvecs.getMat(i);
|
2015-09-17 00:15:55 +08:00
|
|
|
memcpy(rv.ptr(), rvecM.ptr(i), 3*sizeof(double));
|
2011-07-27 21:03:59 +08:00
|
|
|
}
|
2015-09-17 00:36:42 +08:00
|
|
|
if( tvecs_needed && tvecs_mat_vec)
|
2011-07-27 21:03:59 +08:00
|
|
|
{
|
|
|
|
_tvecs.create(3, 1, CV_64F, i, true);
|
|
|
|
Mat tv = _tvecs.getMat(i);
|
2015-09-17 00:15:55 +08:00
|
|
|
memcpy(tv.ptr(), tvecM.ptr(i), 3*sizeof(double));
|
2011-07-27 21:03:59 +08:00
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
2015-09-17 00:15:55 +08:00
|
|
|
|
2011-04-17 21:14:45 +08:00
|
|
|
cameraMatrix.copyTo(_cameraMatrix);
|
|
|
|
distCoeffs.copyTo(_distCoeffs);
|
2011-06-17 14:31:54 +08:00
|
|
|
|
2010-05-12 01:44:00 +08:00
|
|
|
return reprojErr;
|
|
|
|
}
|
|
|
|
|
2010-10-28 02:26:39 +08:00
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
void calibrationMatrixValues( InputArray _cameraMatrix, Size imageSize,
|
|
|
|
double apertureWidth, double apertureHeight,
|
|
|
|
double& fovx, double& fovy, double& focalLength,
|
|
|
|
Point2d& principalPoint, double& aspectRatio )
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
2018-09-14 05:35:26 +08:00
|
|
|
CV_INSTRUMENT_REGION();
|
2016-08-18 14:53:00 +08:00
|
|
|
|
2016-04-27 00:02:47 +08:00
|
|
|
if(_cameraMatrix.size() != Size(3, 3))
|
|
|
|
CV_Error(CV_StsUnmatchedSizes, "Size of cameraMatrix must be 3x3!");
|
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
Matx33d A;
|
|
|
|
_cameraMatrix.getMat().convertTo(A, CV_64F);
|
|
|
|
CV_DbgAssert(imageSize.width != 0 && imageSize.height != 0 && A(0, 0) != 0.0 && A(1, 1) != 0.0);
|
2016-04-27 00:02:47 +08:00
|
|
|
|
|
|
|
/* Calculate pixel aspect ratio. */
|
2021-06-07 20:55:25 +08:00
|
|
|
aspectRatio = A(1, 1) / A(0, 0);
|
2016-04-27 00:02:47 +08:00
|
|
|
|
|
|
|
/* Calculate number of pixel per realworld unit. */
|
|
|
|
double mx, my;
|
|
|
|
if(apertureWidth != 0.0 && apertureHeight != 0.0) {
|
|
|
|
mx = imageSize.width / apertureWidth;
|
|
|
|
my = imageSize.height / apertureHeight;
|
|
|
|
} else {
|
|
|
|
mx = 1.0;
|
|
|
|
my = aspectRatio;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Calculate fovx and fovy. */
|
2021-06-07 20:55:25 +08:00
|
|
|
fovx = atan2(A(0, 2), A(0, 0)) + atan2(imageSize.width - A(0, 2), A(0, 0));
|
|
|
|
fovy = atan2(A(1, 2), A(1, 1)) + atan2(imageSize.height - A(1, 2), A(1, 1));
|
2016-04-27 20:47:52 +08:00
|
|
|
fovx *= 180.0 / CV_PI;
|
|
|
|
fovy *= 180.0 / CV_PI;
|
2016-04-27 00:02:47 +08:00
|
|
|
|
|
|
|
/* Calculate focal length. */
|
2021-06-07 20:55:25 +08:00
|
|
|
focalLength = A(0, 0) / mx;
|
2016-04-27 00:02:47 +08:00
|
|
|
|
|
|
|
/* Calculate principle point. */
|
2021-06-07 20:55:25 +08:00
|
|
|
principalPoint = Point2d(A(0, 2) / mx, A(1, 2) / my);
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
double stereoCalibrate( InputArrayOfArrays _objectPoints,
|
|
|
|
InputArrayOfArrays _imagePoints1,
|
|
|
|
InputArrayOfArrays _imagePoints2,
|
|
|
|
InputOutputArray _cameraMatrix1, InputOutputArray _distCoeffs1,
|
|
|
|
InputOutputArray _cameraMatrix2, InputOutputArray _distCoeffs2,
|
|
|
|
Size imageSize, OutputArray _Rmat, OutputArray _Tmat,
|
|
|
|
OutputArray _Emat, OutputArray _Fmat, int flags,
|
|
|
|
TermCriteria criteria)
|
2018-01-27 03:05:13 +08:00
|
|
|
{
|
2018-10-03 20:50:04 +08:00
|
|
|
if (flags & CALIB_USE_EXTRINSIC_GUESS)
|
|
|
|
CV_Error(Error::StsBadFlag, "stereoCalibrate does not support CALIB_USE_EXTRINSIC_GUESS.");
|
|
|
|
|
2018-01-27 03:05:13 +08:00
|
|
|
Mat Rmat, Tmat;
|
|
|
|
double ret = stereoCalibrate(_objectPoints, _imagePoints1, _imagePoints2, _cameraMatrix1, _distCoeffs1,
|
|
|
|
_cameraMatrix2, _distCoeffs2, imageSize, Rmat, Tmat, _Emat, _Fmat,
|
|
|
|
noArray(), flags, criteria);
|
|
|
|
Rmat.copyTo(_Rmat);
|
|
|
|
Tmat.copyTo(_Tmat);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2020-12-02 04:42:15 +08:00
|
|
|
double stereoCalibrate( InputArrayOfArrays _objectPoints,
|
|
|
|
InputArrayOfArrays _imagePoints1,
|
|
|
|
InputArrayOfArrays _imagePoints2,
|
|
|
|
InputOutputArray _cameraMatrix1, InputOutputArray _distCoeffs1,
|
|
|
|
InputOutputArray _cameraMatrix2, InputOutputArray _distCoeffs2,
|
|
|
|
Size imageSize, InputOutputArray _Rmat, InputOutputArray _Tmat,
|
|
|
|
OutputArray _Emat, OutputArray _Fmat,
|
2023-02-02 21:44:28 +08:00
|
|
|
OutputArray _perViewErrors, int flags,
|
|
|
|
TermCriteria criteria)
|
|
|
|
{
|
|
|
|
return stereoCalibrate(_objectPoints, _imagePoints1, _imagePoints2, _cameraMatrix1, _distCoeffs1,
|
|
|
|
_cameraMatrix2, _distCoeffs2, imageSize, _Rmat, _Tmat, _Emat, _Fmat,
|
|
|
|
noArray(), noArray(), _perViewErrors, flags, criteria);
|
|
|
|
}
|
|
|
|
|
|
|
|
double stereoCalibrate( InputArrayOfArrays _objectPoints,
|
|
|
|
InputArrayOfArrays _imagePoints1,
|
|
|
|
InputArrayOfArrays _imagePoints2,
|
|
|
|
InputOutputArray _cameraMatrix1, InputOutputArray _distCoeffs1,
|
|
|
|
InputOutputArray _cameraMatrix2, InputOutputArray _distCoeffs2,
|
|
|
|
Size imageSize, InputOutputArray _Rmat, InputOutputArray _Tmat,
|
|
|
|
OutputArray _Emat, OutputArray _Fmat,
|
|
|
|
OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs,
|
|
|
|
OutputArray _perViewErrors, int flags,
|
2020-12-02 04:42:15 +08:00
|
|
|
TermCriteria criteria)
|
2010-05-12 01:44:00 +08:00
|
|
|
{
|
|
|
|
int rtype = CV_64F;
|
2011-04-17 21:14:45 +08:00
|
|
|
Mat cameraMatrix1 = _cameraMatrix1.getMat();
|
|
|
|
Mat cameraMatrix2 = _cameraMatrix2.getMat();
|
|
|
|
Mat distCoeffs1 = _distCoeffs1.getMat();
|
|
|
|
Mat distCoeffs2 = _distCoeffs2.getMat();
|
2018-11-09 21:12:22 +08:00
|
|
|
cameraMatrix1 = prepareCameraMatrix(cameraMatrix1, rtype, flags);
|
|
|
|
cameraMatrix2 = prepareCameraMatrix(cameraMatrix2, rtype, flags);
|
2023-02-02 21:44:28 +08:00
|
|
|
distCoeffs1 = prepareDistCoeffs(distCoeffs1, rtype, 14);
|
|
|
|
distCoeffs2 = prepareDistCoeffs(distCoeffs2, rtype, 14);
|
2012-03-19 01:28:44 +08:00
|
|
|
|
2015-10-14 18:07:28 +08:00
|
|
|
if( !(flags & CALIB_RATIONAL_MODEL) &&
|
|
|
|
(!(flags & CALIB_THIN_PRISM_MODEL)) &&
|
|
|
|
(!(flags & CALIB_TILTED_MODEL)))
|
2010-11-30 04:06:44 +08:00
|
|
|
{
|
|
|
|
distCoeffs1 = distCoeffs1.rows == 1 ? distCoeffs1.colRange(0, 5) : distCoeffs1.rowRange(0, 5);
|
|
|
|
distCoeffs2 = distCoeffs2.rows == 1 ? distCoeffs2.colRange(0, 5) : distCoeffs2.rowRange(0, 5);
|
|
|
|
}
|
2012-03-19 01:28:44 +08:00
|
|
|
|
2018-01-27 03:05:13 +08:00
|
|
|
if((flags & CALIB_USE_EXTRINSIC_GUESS) == 0)
|
|
|
|
{
|
|
|
|
_Rmat.create(3, 3, rtype);
|
|
|
|
_Tmat.create(3, 1, rtype);
|
|
|
|
}
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
int nimages = int(_objectPoints.total());
|
|
|
|
CV_Assert( nimages > 0 );
|
|
|
|
|
|
|
|
Mat objPt, imgPt, imgPt2, npoints, rvecLM, tvecLM;
|
2010-05-12 01:44:00 +08:00
|
|
|
|
2011-04-17 21:14:45 +08:00
|
|
|
collectCalibrationData( _objectPoints, _imagePoints1, _imagePoints2,
|
2022-09-13 21:45:20 +08:00
|
|
|
objPt, imgPt, imgPt2, npoints );
|
2021-06-07 20:55:25 +08:00
|
|
|
Mat matR = _Rmat.getMat(), matT = _Tmat.getMat();
|
2018-01-27 03:05:13 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
bool E_needed = _Emat.needed(), F_needed = _Fmat.needed();
|
|
|
|
bool rvecs_needed = _rvecs.needed(), tvecs_needed = _tvecs.needed();
|
|
|
|
bool errors_needed = _perViewErrors.needed();
|
2012-03-19 01:28:44 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
Mat matE, matF, matErr;
|
2018-01-27 03:05:13 +08:00
|
|
|
if( E_needed )
|
2011-04-17 21:14:45 +08:00
|
|
|
{
|
|
|
|
_Emat.create(3, 3, rtype);
|
2021-06-07 20:55:25 +08:00
|
|
|
matE = _Emat.getMat();
|
2011-04-17 21:14:45 +08:00
|
|
|
}
|
2018-01-27 03:05:13 +08:00
|
|
|
if( F_needed )
|
2011-04-17 21:14:45 +08:00
|
|
|
{
|
|
|
|
_Fmat.create(3, 3, rtype);
|
2021-06-07 20:55:25 +08:00
|
|
|
matF = _Fmat.getMat();
|
2018-01-27 03:05:13 +08:00
|
|
|
}
|
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
bool rvecs_mat_vec = _rvecs.isMatVector();
|
|
|
|
bool tvecs_mat_vec = _tvecs.isMatVector();
|
|
|
|
|
|
|
|
if( rvecs_needed )
|
|
|
|
{
|
|
|
|
_rvecs.create(nimages, 1, CV_64FC3);
|
|
|
|
|
|
|
|
if( rvecs_mat_vec )
|
|
|
|
rvecLM.create(nimages, 3, CV_64F);
|
|
|
|
else
|
|
|
|
rvecLM = _rvecs.getMat();
|
|
|
|
}
|
|
|
|
if( tvecs_needed )
|
|
|
|
{
|
|
|
|
_tvecs.create(nimages, 1, CV_64FC3);
|
|
|
|
|
|
|
|
if( tvecs_mat_vec )
|
|
|
|
tvecLM.create(nimages, 3, CV_64F);
|
|
|
|
else
|
|
|
|
tvecLM = _tvecs.getMat();
|
|
|
|
}
|
|
|
|
|
2018-01-27 03:05:13 +08:00
|
|
|
if( errors_needed )
|
|
|
|
{
|
|
|
|
_perViewErrors.create(nimages, 2, CV_64F);
|
2021-06-07 20:55:25 +08:00
|
|
|
matErr = _perViewErrors.getMat();
|
2011-04-17 21:14:45 +08:00
|
|
|
}
|
2010-10-28 02:26:39 +08:00
|
|
|
|
2021-06-07 20:55:25 +08:00
|
|
|
double err = stereoCalibrateImpl(objPt, imgPt, imgPt2, npoints, cameraMatrix1,
|
|
|
|
distCoeffs1, cameraMatrix2, distCoeffs2, imageSize,
|
2023-02-02 21:44:28 +08:00
|
|
|
matR, matT, matE, matF, rvecLM, tvecLM,
|
2022-09-03 00:11:42 +08:00
|
|
|
matErr, flags, criteria);
|
2011-04-17 21:14:45 +08:00
|
|
|
cameraMatrix1.copyTo(_cameraMatrix1);
|
|
|
|
cameraMatrix2.copyTo(_cameraMatrix2);
|
|
|
|
distCoeffs1.copyTo(_distCoeffs1);
|
|
|
|
distCoeffs2.copyTo(_distCoeffs2);
|
2012-03-19 01:28:44 +08:00
|
|
|
|
2023-02-02 21:44:28 +08:00
|
|
|
for(int i = 0; i < nimages; i++ )
|
|
|
|
{
|
|
|
|
if( rvecs_needed && rvecs_mat_vec )
|
|
|
|
{
|
|
|
|
_rvecs.create(3, 1, CV_64F, i, true);
|
|
|
|
Mat rv = _rvecs.getMat(i);
|
|
|
|
Mat(rvecLM.row(i).t()).copyTo(rv);
|
|
|
|
}
|
|
|
|
if( tvecs_needed && tvecs_mat_vec )
|
|
|
|
{
|
|
|
|
_tvecs.create(3, 1, CV_64F, i, true);
|
|
|
|
Mat tv = _tvecs.getMat(i);
|
|
|
|
Mat(tvecLM.row(i).t()).copyTo(tv);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-17 21:14:45 +08:00
|
|
|
return err;
|
2010-05-12 01:44:00 +08:00
|
|
|
}
|
|
|
|
|
2010-09-07 23:38:48 +08:00
|
|
|
}
|
|
|
|
|
2010-05-12 01:44:00 +08:00
|
|
|
/* End of file. */
|