c++ - 带有 newCameraMatrix 的 OpenCV undistort() 函数

标签 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 来裁剪内部区域,希望它无论如何都会比没有附加矩阵更大,但事实并非如此。

我该如何解决这个问题?

最佳答案

好的,我想通了。问题是 alpha = 1.0 太大了。奇怪的是,即使使用 0.0,newCameraMatrix 也会将视野扩大约 20°,而且显然没有错误的像素或失真。

关于c++ - 带有 newCameraMatrix 的 OpenCV undistort() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31301013/

相关文章:

c++ - C++ 中的运行时自省(introspection)

python - 使用PyAV的视频中的帧数

python - 如何找到向量化矩阵 numpy 的索引

c++ - c++ 中的 LU 分解不适用于大矩阵

python - 在没有 numpy 的情况下在 Python 中创建矩阵

c++ - 如何检测 win32 NTFS 下的文件移动?

c++ - QtPropertyBrowser 和值更改信号

c++ - PCA 输出特征向量和特征值

android - Android 的 OpenCV 文档

c++ - 如何在if语句中定义变量和比较值?