【问题标题】:OpenCV undistort() function with newCameraMatrix带有 newCameraMatrix 的 OpenCV undistort() 函数
【发布时间】:2015-09-26 20:32:54
【问题描述】:

我使用针孔相机模型校准了广角相机(水平约 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 来裁剪内部区域,希望它会比没有附加矩阵的情况下更大,但实际上并非如此。

我该如何解决这种情况?

【问题讨论】:

  • 很难帮助没有原始图像,校准参数值。您在校正后的图像中观察到的像素化圆是由于不失真函数中的奇异性造成的。由于似乎有超出它的有效像素,您可能使用了无效的模型,或校准参数不准确。

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


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2013-11-19
  • 1970-01-01
  • 2016-09-26
相关资源
最近更新 更多