在使用MatLab校准鱼眼相机时,我得到了鱼眼内部参数:
% Calibrate the camera using fisheye parameters
[cameraParams, imagesUsed, estimationErrors] = estimateFisheyeParameters(imagePoints, worldPoints, ...
[mrows, ncols], ...
'EstimateAlignment', true, ...
'WorldUnits', 'millimeters');
该函数的输出是Scaramuzza参数,其形状与经典的3x3本质矩阵非常不同。
从这个内在参数中,我想估计我的一个校准图案的姿势。到目前为止,我找到了两个解决方案,但我不知道哪一个更准确。
首先,我发现我可以直接向extrinsics
函数提供当前的内部函数:
% Extract intrinsics parameters
intrinsics = cameraParams.Intrinsics;
% Compute Rt matrix
[R,t] = extrinsics(imagePoints,worldPoints,intrinsics);
在函数内部,我可以看到这个方法使用的是单应函数,但有点像Scaramuzza的本征参数。它是用于鱼眼和非鱼眼模型的相同函数。你知道斯卡拉穆扎的参数是在这里处理的吗?
第二种解决方案是使用函数estimateWorldCameraPose
,该函数使用P3P
和下面的RANSAC。此函数不接受原始鱼眼参数。我找到的一个解决方案(https://fr.mathworks.com/matlabcentral/answers/548787-function-estimateworldcamerapose-or-extrinsics-for-fisheyeparameters-is-missing-is-it-possible?s_tid=answers_rc1-2_p2_MLT)使用函数undistortFisheyeImage
作为临时解决方案来提取3x3内部参数:
[J,camIntrinsics] = undistortFisheyeImage(I,intrinsics)
然后,我可以在estimateWorldCameraPose
中添加新的内部函数。
这个解决方案更好吗?这个新的本质矩阵的可靠性有多高?
2条答案
按热度按时间w8rqjzmb1#
1.在所有的标定方法(无论是普通透镜还是鱼眼透镜)中,非本征估计都使用未失真的像素点。因此,MatLab函数“Extrinsics”也应该有未失真部分(使用Scaramuzza的镜头失真模型未失真)。看一看代码“Extrinsics”,我发现当它是鱼眼模型时,它是单独处理内部的。
1.这是唯一的解决办法,也是实现这一目标的唯一途径。
lnvxswe22#
extrinsics
函数同时接受鱼眼模型和非鱼眼模型,如果接受鱼眼模型,则输入参数imagePoints
为畸变点,而针孔(非鱼眼)模型,则必须接受未失真的图像点。它的内部实现都是vision.internal.calibration.extrinsicsPlanar.m
函数。Extrinsics从平面校准图案计算相机Extrinics,因此此功能适合您。
在处理鱼眼像素点之前(在
extrinsicsPlanar
函数之前),使用fisheyeIntrinsics
类中的隐藏方法执行像素点消除锯齿。estimateWorldCameraPose
函数输入参数worldPoints
接受3列位置。但你使用的坐标z=0,可能是这个函数返回的status
是1或2。所以你后面的解决方案可能不会更好。