使用newCameraMatrix的OpenCV undistort()函数

时间:2015-07-08 18:38:22

标签: c++ opencv matrix computer-vision camera-calibration

我使用针孔相机模型校准了一台广角相机(水平约120°,垂直约110°)。结果非常好,但图像的大部分区域被丢弃。

good

所以我试图使用getOptimalNewCameraMatrix函数(使用alpha = 1)计算newCameraMatrix,然后将其传递给cv :: undistord,但结果帧真的失真了。

bad

我使用的代码是:

// 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来裁剪内部区域,希望它无论如何都要比没有额外的矩阵更大,但事实上它不是。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

好的,我明白了。问题是alpha = 1.0太大了。奇怪的是,即使使用0.0,newCameraMatrix也会放大~20°的视野,并且显然没有错误的像素或失真。