mar*_*rol 5 c++ opencv stereo-3d
我注意到即使我已经设置了适当的标志(即 CV_CALIB_FIX_FOCAL_LENGTH),opencvstereoCalibrate() 也会改变相机矩阵中的焦距。我正在使用两个相同的相机,它们在镜头上机械设置了相同的焦距,而且我知道传感器尺寸,因此我可以手动计算内部相机矩阵,我实际上是做什么的。
这里有一些立体声校准程序的输出 - 立体声校准(stereoCalibrate()之前和之后的相机矩阵)。
std::cout << "Before calibration: " << std::endl;
std::cout << "C1: " << _cameraMatrixA << std::endl;
std::cout << "C2: " << _cameraMatrixB << std::endl;
double error = cv::stereoCalibrate(objectPoints, imagePointsA, imagePointsB, _cameraMatrixA, _distCoeffsA, _cameraMatrixB, _distCoeffsB, _imageSize,
R, T, E, F,
cv::TermCriteria((cv::TermCriteria::COUNT + cv::TermCriteria::EPS), 30, 9.999999999999e-7), CV_CALIB_FIX_FOCAL_LENGTH | CV_CALIB_FIX_PRINCIPAL_POINT);
std::cout << "After calibration: " << std::endl;
std::cout << "C1: " << _cameraMatrixA << std::endl;
std::cout << "C2: " << _cameraMatrixB << std::endl;
Run Code Online (Sandbox Code Playgroud)
校准前:
C1: [6203.076923076923, 0, 1280; 0、6203.076923076923、960;0, 0, 1]
C2: [6203.076923076923, 0, 1280; 0、6203.076923076923、960;0, 0, 1]
校准后:
C1: [6311.77650416514, 0, 1279.5; 0, 6331.34531760757, 959.5; 0, 0, 1]
C2: [6152.655897294907, 0, 1279.5; 0、6206.591406832492、959.5;0, 0, 1]
我认为这是奇怪的 opencv 行为。有人遇到过类似的问题吗?我知道这很容易解决,我可以在立体校准后将焦距设置为相机矩阵。
为了做你想做的事,你必须stereoCalibrate
使用标志来调用:
CV_CALIB_USE_INTRINSIC_GUESS | CV_CALIB_FIX_FOCAL_LENGTH | CV_CALIB_FIX_PRINCIPAL_POINT
Run Code Online (Sandbox Code Playgroud)
如果不使用该CV_CALIB_USE_INTRINSIC_GUESS
标志,stereoCalibrate
将首先初始化相机矩阵和畸变系数本身,然后在后续优化中修复其中的部分内容。文档中对此进行了说明,尽管相当不清楚并且没有提及该关键标志:
除了立体相关信息之外,该功能还可以对两个摄像头中的每一个进行全面校准。然而,由于参数空间的高维性和输入数据中的噪声,该函数可能会偏离正确的解。如果可以单独高精度地估计每个相机的内在参数(例如,使用 calibrateCamera() ),建议您这样做 [...]。
使用CV_CALIB_USE_INTRINSIC_GUESS
除了任何标志之外的任何CV_CALIB_FIX_*
标志告诉函数使用您传递的内容作为输入,否则,该输入将被忽略并覆盖。
归档时间: |
|
查看次数: |
2784 次 |
最近记录: |