OpenCV鱼眼镜头相机校准问题

时间:2020-07-29 10:29:39

标签: c++ opencv camera camera-calibration fisheye

我正在尝试使用this OpenCV模块校准鱼眼镜头。据我所知,它支持FOV高达150º的摄像机的校准。运行校准过程时,我得到了一些很好的本征和镜头变形的结果。

K = [650.8   0.51     0
       0      651.6   1024
       0       0     1026.4]

d = [-0.34177 0.09135 0.94044 0.00271]

如果我使用函数cv::fisheye::undistortImage,则会得到模糊的图像。

我认为校准是错误的,但是我使用功能fisheye::initUndistortRectifyMapcv::remap重复此过程,以获得校正后的图像。

结果看起来不错。问题是我想增加FOV。我已经知道可以将焦距更改为here。就我而言,如果执行此操作,则无法看到黑色背景,但图像会缩小。

我尝试更改焦距,并使用fisheye::estimateNewCameraMatrixForUndistortRectify()和balance参数估计新的相机矩阵,但结果是相同的。

我的问题是:

  1. cv::fisheye::undistortImage和重新映射过程有什么区别?
  2. 我在做什么错,因此如果不进行缩放效果就无法增加FOV?

生成相机内部函数后使用的代码是:

Mat map1, map2;
Mat imageUndistorted;

Mat knew;
knew = camera.k.clone();
//knew.at<double>(0, 0) = camera.k.at<double>(0, 0) / 4;
//knew.at<double>(1, 1) = camera.k.at<double>(1, 1) / 4;
fisheye::estimateNewCameraMatrixForUndistortRectify(camera.k, camera.d, image.size(), cv::Matx33f::eye(), knew,0.5,image.size());
//fisheye::undistortImage(image, imageUndistorted, camera.k, camera.d, cv::noArray(), image.size());

fisheye::initUndistortRectifyMap(camera.k, camera.d, cv::Matx33d::eye(), knew, image.size(), CV_32FC1, map1, map2);
remap(image, imageUndistorted, map1, map2, INTER_LINEAR, BORDER_CONSTANT);

0 个答案:

没有答案