gpt4 book ai didi

c++ - 使用 OpenCV 进行单相机校准 - 生成 "Complete"未失真图像时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:28 25 4
gpt4 key购买 nike

我一直在尝试使用 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)

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

感谢大家对我的容忍,这是我在这里的第一个问题,但我尽量做到完整。如果我搞砸了,请告诉我!

最佳答案

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

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

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

关于c++ - 使用 OpenCV 进行单相机校准 - 生成 "Complete"未失真图像时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12924780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com