![]() |
OpenCV 4.10.0
开源计算机视觉
|
上一个教程:交互式相机校准应用程序
| 原作者 | 马西姆·伊瓦谢奇金 |
| 兼容性 | OpenCV >= 4.0 |
此作品已作为 Google Summer of Code 的一部分(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 估计本质矩阵,并将本质矩阵分解为旋转和平移。然后通过构建具有投影矩阵的两个相对姿态,将图像点三角测量为目标点。通过使用 3D 平面拟合运行 RANSAC,可以对目标点以及对应关系进行平面聚类。essential_mat_reconstr.py – 与 .cpp 文件中的功能相同,但是不是将点聚类到平面,而是绘制目标点的 3D 地图。
1.9.8 于 2024 年 6 月 2 日星期日 21:52:13 为 OpenCV 生