OpenCV V4.x以后的版本中补充了一个重载的双目标定函数 cv::stereoCalibrate()
,这个新函数中补充了一个输出量,即perViewErrors
代表每对图像所对应的均方根重投影误差(RMS re-projection error),可以更方便检视输入的标定板图像存在的误差,从而进行剔除或重拍用以提高标定精度。建议之后再去做双目标定时都尽量采用新的函数。
函数定义
double cv::stereoCalibrate ( InputArrayOfArrays objectPoints,
InputArrayOfArrays imagePoints1,
InputArrayOfArrays imagePoints2,
InputOutputArray cameraMatrix1,
InputOutputArray distCoeffs1,
InputOutputArray cameraMatrix2,
InputOutputArray distCoeffs2,
Size imageSize,
InputOutputArray R,
InputOutputArray T,
OutputArray E,
OutputArray F,
OutputArray perViewErrors,
int flags = CALIB_FIX_INTRINSIC,
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6)
)
但是这个函数在OpenCV官网Doc中,对于其参数数据类型补充极其模糊,导致C++下去使用该函数的时候压根不知道该把参数初始化为什么类型,如图所示就是其官网对于该函数的说明(你告诉我个 )OutputArray
,我TM哪里知道他是啥数据格式
其他参数还好毕竟有个例程,但是这个新增perViewErrors
,我按照他的描述分别尝试vector<float>
、vector<Point2f>
、vector<vector<float>>
全部都会在运行时报这么一个错误:
OpenCV(4.3.0) Error: Assertion failed (d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0)) in cv::debug_build_guard::_OutputArray::create, file D:\OpenCV\opencv\sources\modules\core\src\matrix_wrap.cpp, line 1366
这个报错的含义基本上就是输入的数据维度或者类型存在问题,我最后还是在一个java的OpenCV DOC中才找到具体的函数定义实际上是Mat
。为方便大家使用,我这边还是把这个函数具体的参数说明做一个补充吧,也是做一个问题记录。
参数补充说明
- objectPoints:【输入量】标定板特征点在世界坐标系下的坐标,为 M ∗ N ∗ 3 M*N*3 M∗N∗3的矩阵,