我一直试图使用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(没有更改矩阵),我会得到合理的(虽然是裁剪的)结果。
如果我使用alpha = 1,我认为应该给我一张图像,每个原始像素映射到新图像,我得到以下内容:
所以,我的问题是:我做错了什么,为什么我不能从校准中得到未裁剪的,未失真的图像?
感谢所有人提出我,这是我的第一个问题,但我尽量做到尽可能完整。如果我搞砸了,请告诉我!
答案 0 :(得分:4)
我认为纠正相机矩阵并不是你应该做的不失真的事情,因为这会给你一个相机矩阵,好像没有失真。
如果您不想“丢失”图像信息,最好在x和y中移动地图并将图像映射到更大的图像。这是因为当不失真时,角落中的像素将向外移动以矫正图像。
请记住,鱼眼镜头有很高的失真,即使使用正确的代码也可能无法完全纠正。