我正在尝试使用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::initUndistortRectifyMap
和cv::remap
重复此过程,以获得校正后的图像。
结果看起来不错。问题是我想增加FOV。我已经知道可以将焦距更改为here。就我而言,如果执行此操作,则无法看到黑色背景,但图像会缩小。
我尝试更改焦距,并使用fisheye::estimateNewCameraMatrixForUndistortRectify()
和balance参数估计新的相机矩阵,但结果是相同的。
我的问题是:
cv::fisheye::undistortImage
和重新映射过程有什么区别?生成相机内部函数后使用的代码是:
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);