我使用针孔相机模型校准了一个广角相机(水平约 120°,垂直约 110°)。结果非常好,但图像的大面积区域被丢弃。
所以我尝试使用 getOptimalNewCameraMatrix 函数(使用 alpha = 1)来计算 newCameraMatrix,然后将其传递给 cv::undistord,但结果帧确实失真了。
我使用的代码是:
// Matrices calculation
data.rms = calibrateCamera(objectPoints, imagePoints, data.size, data.cameraMatrix,
data.distCoeffs, data.rvecs, data.tvecs, settings.calibFlags);
if(!settings.cropCorrected) {
Rect roi;
data.newCameraMatrix = getOptimalNewCameraMatrix(data.cameraMatrix, data.distCoeffs,
data.size, 1, data.size, &roi, true);
}
// Undistort
cv::undistort(in, corrected, cameraMatrix, distCoeffs, newCameraMatrix);
这很简单,但有些东西不起作用。我已经尝试过使用 roi 来裁剪内部区域,希望它无论如何都会比没有附加矩阵更大,但事实并非如此。
我该如何解决这个问题?
最佳答案
好的,我想通了。问题是 alpha = 1.0 太大了。奇怪的是,即使使用 0.0,newCameraMatrix 也会将视野扩大约 20°,而且显然没有错误的像素或失真。
关于c++ - 带有 newCameraMatrix 的 OpenCV undistort() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31301013/