【CV.SLAM之四:架构设计】单目系统

本文详细介绍了一种基于OpenCV/C++实现的单目视觉测距(Monocular Visual Odometry)方法,包括畸变校正、特征提取与跟踪、本质矩阵计算及相机位姿更新等关键技术环节,并探讨了如何处理意外情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计目的

This post would be focussing on Monocular Visual Odometry, and how we can implement it in OpenCV/C++.

设计要求

流程

设计流程

流程

畸变校正

使用OpenCV自带的库函数;

特征提取

仍然是FAST特征点提取,代码如下:

void featureDetection(Mat img_1, vector<Point2f>& points1)  { 
  vector<KeyPoint> keypoints_1;
  int fast_threshold = 20;
  bool nonmaxSuppression = true;
  FAST(img_1, keypoints_1, fast_threshold, nonmaxSuppression);
  KeyPoint::convert(keypoints_1, points1, vector<int>());
}

特征跟踪

采用OpenCV库函数:KLT tracker

针对跟踪失败,进行重检测跟踪。

本质矩阵(基础矩阵)

  • RANSAC
  • 5-Points法

OpenCV 库函数:

E = findEssentialMat(points2, points1, focal, pp, RANSAC, 0.999, 1.0, mask)

计算R,t

通过本质矩阵E (Essential Matrix)计算R,t,这里采用SVD和旋转矩阵的约束条件,得到:

E=UΣVTN E = U Σ V T N

[t]x=VWΣVT [ t ] x = V W Σ V T

R=UW1VT R = U W − 1 V T

这里也通过调用OpenCV函数:

recoverPose(E, points2, points1, R, t, focal, pp, mask)

构造轨迹

Rpos=RRpos R p o s = R R p o s

tpos=tpos+tRpos t p o s = t p o s + t R p o s

通过R,t来跟踪相机位姿,其中,平移scale t需要提前确定,我们可以通过外部输入。

启发思考

大多数计算机视觉算法是不完整的,没有针对各种意外情况的发生,视觉测距也不例外。所以,我们需要有个前提:运动主方向。

结果

得到数据很容易,但是,怎么解决意外情况,任重而道远。

参考文章

Avi Singh : Monocular Visual Odometry using OpenCV

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值