OpenCV 4.11.0
开源计算机视觉
|
上一教程: 交互式相机标定应用程序
原作者 | Maksym Ivashechkin |
兼容性 | OpenCV >= 4.0 |
这项工作作为谷歌代码之夏项目的一部分(2020年8月)集成。
集成到OpenCV calib3d
模块的部分是基于RANSAC的通用框架USAC(namespace usac
),用C++编写。该框架包含不同的最先进的采样、验证或局部优化方法。该框架的主要优点是它独立于任何估计问题,并且具有模块化结构。因此,可以轻松地添加/删除新的求解器或方法。到目前为止,它包括以下组件:
UsacParams
的solvePnPRansac(...)
的新版本中,可以选择传递空的内参矩阵InputOutputArray cameraMatrix
。如果矩阵为空,则使用直接线性变换算法(具有6个点的PnP)框架不仅输出旋转和平移向量,还输出校准矩阵。此外,该框架可以并行运行。并行化是通过创建多个RANSAC并共享两个原子变量bool success
和int num_hypothesis_tested
来实现的,这两个变量决定所有RANSAC何时必须终止。如果其中一个RANSAC成功终止,则所有其他RANSAC也将终止。最后,最佳模型将从所有线程中同步。如果使用PROSAC采样器,则线程必须共享相同的采样器,因为采样是顺序进行的。但是,使用框架的默认选项,并行RANSAC不是确定性的,因为它取决于每个线程运行的频率。使其确定性最简单的方法是使用不带SPRT和局部优化的PROSAC采样器,并且不适用于基础矩阵,因为它们内部使用随机生成器。
对于NAPSAC、渐进式NAPSAC或图割方法,需要构建邻域图。在框架中,有3种方法可以做到这一点
NEIGH_FLANN_RADIUS
– 与前一种情况类似,查找距离小于20像素的邻近点。NEIGH_GRID
– 使用哈希表在单元格中平铺点以查找点的邻域。该方法在文献[17]中进行了描述。虽然速度显著提高,但精度不如NEIGH_FLANN_RADIUS
。注意,NEIGH_FLANN_RADIUS
和NEIGH_FLANN_RADIUS
无法用于PnP求解器,因为存在3D目标点。
USAC_DEFAULT
– 具有标准LO-RANSAC。USAC_PARALLEL
– 具有LO-RANSAC,并且RANSAC并行运行。USAC_ACCURATE
– 具有GC-RANSAC。USAC_FAST
– 具有LO-RANSAC,局部优化步骤中的迭代次数较少。使用RANSAC分数来最大化内点数量并尽早终止。USAC_PROSAC
– 具有PROSAC采样。注意,必须对点进行排序。USAC_FM_8PTS
– 具有LO-RANSAC。仅对具有8点求解器的基础矩阵有效。USAC_MAGSAC
– 具有MAGSAC++。每个标志都使用SPRT验证。最后,最终迄今为止最佳的模型通过对所有找到的内点的非最小估计进行优化。
randomGeneratorState
– 由于OpenCV中的每个USAC求解器都是确定性的(即,对于相同的点和参数返回相同的结果),因此通过提供新的状态,它将输出新的模型。loIterations
– 局部优化方法的迭代次数。*默认值为10*。通过增加loIterations
,输出模型可能会更准确,但是计算时间也可能会增加。loSampleSize
– 局部优化的最大样本数。*默认值为14*。请注意,通过增加loSampleSize
,模型的精度可能会提高,计算时间也会增加。但是,建议保持值小于100,因为对少量点的估计速度更快且更鲁棒。opencv/samples目录中有三个新的示例文件。
epipolar_lines.cpp
– main
函数的输入参数是两张图像的路径。然后使用SIFT检测器找到对应关系。使用RANSAC从初步对应关系中找到基础矩阵,并绘制极线。essential_mat_reconstr.cpp
– 输入参数是包含图像名称和单个内参矩阵的数据文件的路径以及这些图像所在的目录。使用SIFT找到对应关系。使用RANSAC估计本质矩阵并将其分解为旋转和平移。然后通过使用投影矩阵构建两个相对位姿,将图像点三角化成目标点。通过运行RANSAC进行3D平面拟合目标点以及对应关系被聚类成平面。essential_mat_reconstr.py
– 与.cpp文件具有相同的功能,但是它不将点聚类到平面,而是绘制目标点的3D地图。