我一直试图使用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,我认为应该给我一个图像,每个原始像素映射到新图像,我得到以下内容:

所以,我的问题是:我做错了什么,为什么我不能从校准中得到未裁剪的,不失真的图像?
谢谢大家跟我说,这是我的第一个问题,但我尽量做到尽可能完整.如果我搞砸了,请告诉我!
我相信校正相机矩阵不是为了不失真而应该做的事情,因为这会给你一个相机矩阵,就好像没有失真一样。
如果您不想“丢失”图像信息,最好在 x 和 y 方向上移动贴图,并将图像映射到更大的图像。这是因为当不扭曲时,角落中的像素将向外移动以校正图像。
请记住,鱼眼镜头具有很高的失真度,即使使用正确的代码也可能无法完全校正。
| 归档时间: |
|
| 查看次数: |
4700 次 |
| 最近记录: |