一段时间后 SolvePNP return 错误的 rvec 和 tvec
SolvePNP return bad rvec and tvec after some time
我正在尝试使用来自 KITTI 数据集的立体相机对来估计相机轨迹。
该程序在某些时候使用 cv::SolvePNP(),对于前 1500 帧,它 return 的结果非常好,但之后它就完全疯狂了。
这是我目前正在做的事情:
- 加载 2 帧,将它们称为 P 和 Q(一帧是立体对的左右图片)
- 使用 SIFT/SURF/ORB 获取功能(尝试了所有这些)
- 匹配P中的特征,匹配P.left和Q.left
- 基于匹配项,我过滤掉了匹配项中不存在的关键点。
- 我对帧 P 上的点进行三角测量(注意我已经有 KITTI 数据集提供的相机矩阵)
- 我从均匀
转换点
现在是最棘手的部分,我正在尝试实现我自己的 RANSAC,它将利用 solvePNP 以便从标准 cv::solvePNP 获得更好的 rvec 和 tvec(请注意,我尝试使用 cv::solvePNPRansac 并且它工作正常但一段时间后也开始失败)。
所以Ransac过程是这样的:
7.1 我随机化 3D space(P 上的三角点)和 Q.left
上的相应关键点
7.2 我将它们放入 N 个点(N 是我的 RANSAC 参数)到 cv::SolvePNP() 以获得相机在 2 帧之间移动了多少(注意我的 dist Coefs 是零矩阵)
它 return 我使用 cv::Rodrigues()
将一些 tvec 和 rvec 转换为 Matrix
7.3 我连接这些向量
7.4 我尝试使用以下公式将所有三角点(不仅仅是 solvePNP 中使用的点)投影回二维图像:
https://i.imgur.com/aMlZw9z.png
(请注意,我在左侧没有得到 1,而是得到了一些 x、y、z 值,所以我将 x 和 y 与 z 分开)。
7.5 我发现 P.left
上的投影点和关键点之间的区别
7.6 现在我的 RANSAC 有一些阈值,我用它来过滤离群值,而不是在 RANSAC 的下一次迭代中使用它们。
7.7 我用新的(过滤的)点重复这个过程 K 次(K 也是 RANSAC 参数)
现在这适用于 80% 的帧,一段时间后它就会失败,因为 solvePNP 接收的点太少。发生这种情况是因为 none 的投影点实际上超过了距离阈值。所以问题出在前一帧的rvec和tvec中。
真的不知道我应该展示哪部分代码,请求我会写它。
我预计 rvec 和 tvec 会出现小错误,但错误太大了。
显然是由于一堆错误匹配的特征严重影响了后来的三角测量过程。
可以通过实施 RANSAC 或提高匹配阈值来解决问题。
我正在尝试使用来自 KITTI 数据集的立体相机对来估计相机轨迹。 该程序在某些时候使用 cv::SolvePNP(),对于前 1500 帧,它 return 的结果非常好,但之后它就完全疯狂了。
这是我目前正在做的事情:
- 加载 2 帧,将它们称为 P 和 Q(一帧是立体对的左右图片)
- 使用 SIFT/SURF/ORB 获取功能(尝试了所有这些)
- 匹配P中的特征,匹配P.left和Q.left
- 基于匹配项,我过滤掉了匹配项中不存在的关键点。
- 我对帧 P 上的点进行三角测量(注意我已经有 KITTI 数据集提供的相机矩阵)
- 我从均匀 转换点
现在是最棘手的部分,我正在尝试实现我自己的 RANSAC,它将利用 solvePNP 以便从标准 cv::solvePNP 获得更好的 rvec 和 tvec(请注意,我尝试使用 cv::solvePNPRansac 并且它工作正常但一段时间后也开始失败)。 所以Ransac过程是这样的:
7.1 我随机化 3D space(P 上的三角点)和 Q.left
上的相应关键点7.2 我将它们放入 N 个点(N 是我的 RANSAC 参数)到 cv::SolvePNP() 以获得相机在 2 帧之间移动了多少(注意我的 dist Coefs 是零矩阵) 它 return 我使用 cv::Rodrigues()
将一些 tvec 和 rvec 转换为 Matrix7.3 我连接这些向量
7.4 我尝试使用以下公式将所有三角点(不仅仅是 solvePNP 中使用的点)投影回二维图像:
https://i.imgur.com/aMlZw9z.png
(请注意,我在左侧没有得到 1,而是得到了一些 x、y、z 值,所以我将 x 和 y 与 z 分开)。
7.5 我发现 P.left
上的投影点和关键点之间的区别7.6 现在我的 RANSAC 有一些阈值,我用它来过滤离群值,而不是在 RANSAC 的下一次迭代中使用它们。
7.7 我用新的(过滤的)点重复这个过程 K 次(K 也是 RANSAC 参数)
现在这适用于 80% 的帧,一段时间后它就会失败,因为 solvePNP 接收的点太少。发生这种情况是因为 none 的投影点实际上超过了距离阈值。所以问题出在前一帧的rvec和tvec中。
真的不知道我应该展示哪部分代码,请求我会写它。
我预计 rvec 和 tvec 会出现小错误,但错误太大了。
显然是由于一堆错误匹配的特征严重影响了后来的三角测量过程。 可以通过实施 RANSAC 或提高匹配阈值来解决问题。