使用OpenCV进行单摄像头校准 - 生成“完整”未失真图像的问题

时间:2012-10-16 23:04:57

标签: c++ opencv

我一直试图使用OpenCV的相机校准套件从鱼眼相机(如果相关,我正在使用GoPro)中取消图像。我已经完成了大部分工作,可以生成无失真的图像。但是,使用重映射时,未失真的图像是“有效矩形” - 换句话说,返回的图像是原始图像的裁剪版本,以避免未失真帧中固有的弯曲黑色边框。

我试图使用getOptimalNewCameraMatrix()来纠正这种情况,结果非常奇怪。我希望你们中的一个能够解决我的问题。

我目前按如下方式校准相机:

double error = calibrateCamera(worldPoints, sensorPoints, process_size, cameraMatrix, distCoeffs, rvecs, tvecs, calibration_flags);

生成我需要的cameraMatrix。这部分工作(我认为),因为如果我通过initUndistortRectifyMap()后跟remap()运行它,我会得到一个有效的图像。但是,我正在寻找完整的图像,所以我接下来要做的是尝试按照以下方式更正我的cameraMatrix:

int alpha = 1;
cameraMatrix_corr = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, image.size(), alpha);

然后,我为重映射生成X和Y贴图,如下所示(这是直接从OpenCV 2.0 Cookbook借来的,所以我相信它也有效)。

initUndistortRectifyMap(
    cameraMatrix_corr,  // computed camera matrix
    distCoeffs, // computed distortion matrix
    Mat(), // optional rectification (none)
    Mat(), // camera matrix to generate undistorted
    image.size(),  // size of undistorted
    CV_32FC1,      // type of output map
    map1, map2);   // the x and y mapping functions

最后,我重新制作了我的形象!

// Apply mapping functions
remap(image, undistorted, map1, map2, INTER_LINEAR);

到目前为止,这是我的结果。如果我使用alpha = 0(没有更改矩阵),我会得到合理的(虽然是裁剪的)结果。

Image (alpha = 1)

如果我使用alpha = 1,我认为应该给我一张图像,每个原始像素映射到新图像,我得到以下内容:

Image(alpha = 0)

所以,我的问题是:我做错了什么,为什么我不能从校准中得到未裁剪的,未失真的图像?

感谢所有人提出我,这是我的第一个问题,但我尽量做到尽可能完整。如果我搞砸了,请告诉我!

1 个答案:

答案 0 :(得分:4)

我认为纠正相机矩阵并不是你应该做的不失真的事情,因为这会给你一个相机矩阵,好像没有失真。

如果您不想“丢失”图像信息,最好在x和y中移动地图并将图像映射到更大的图像。这是因为当不失真时,角落中的像素将向外移动以矫正图像。

请记住,鱼眼镜头有很高的失真,即使使用正确的代码也可能无法完全纠正。