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

Gle*_*enn 6 c++ opencv

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

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

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

double error = calibrateCamera(worldPoints, sensorPoints, process_size, cameraMatrix, distCoeffs, rvecs, tvecs, calibration_flags);
Run Code Online (Sandbox Code Playgroud)

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

int alpha = 1;
cameraMatrix_corr = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, image.size(), alpha);
Run Code Online (Sandbox Code Playgroud)

然后,我生成重映射的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
Run Code Online (Sandbox Code Playgroud)

最后,我重新映射了我的形象!

// Apply mapping functions
remap(image, undistorted, map1, map2, INTER_LINEAR);
Run Code Online (Sandbox Code Playgroud)

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

图像(alpha = 1)

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

图像(alpha = 0)

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

谢谢大家跟我说,这是我的第一个问题,但我尽量做到尽可能完整.如果我搞砸了,请告诉我!

p.s*_*eef 4

我相信校正相机矩阵不是为了不失真而应该做的事情,因为这会给你一个相机矩阵,就好像没有失真一样。

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

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