1.首先对摄像头进行标定
正确安装好摄像头之后,可以在终端下输入,摄像头就会开启
nvgstcapture-1.0
想关掉摄像头的话,直接在终端输入q再按回车;
想获图片的话,在终端输入j再按回车,图片将保存当前目录下;
利用张正友标定法对相机进行标定:
首先打印一张用于标定的棋盘格,然后按照上述方式,从不同角度不同具体拍摄棋盘格照片(大约20张左右),然后用Matlab工具箱进行标定。
参考:https://blog.csdn.net/heroacool/article/details/51023921
2.重写一个接口,用来调用ORBSLAM2
对于数据集上的示例,ORB-SLAM2 会首先读取数据集中的图像,再放到 SLAM 中处理。那么对于我们自己的摄像头,同样可以这样处理。所以最方便的方案是直接将我 们的程序作为一个新的可执行程序,加入到 ORB-SLAM2 工程中。
cd Examples/Monocular/
vim myslam.cc
vim myslam.yaml
在myslam.cc 中写入以下内容
// 该文件将打开你电脑的摄像头,并将图像传递给ORB-SLAM2进行定位
// 需要opencv
#include <opencv2/opencv.hpp>
// ORB-SLAM的系统接口
#include "System.h"
#include <string>
#include <chrono> // for time stamp
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
//传入参数文件和词典文件
string parameterFile = argv[1];
string vocFile = argv[2];
// 声明 ORB-SLAM2 系统
ORB_SLAM2::System SLAM(vocFile, parameterFile, ORB_SLAM2::System::MONOCULAR, true);
// 获取相机图像代码
cv::VideoCapture cap(0); // change to 1 if you want to use USB camera.
// 分辨率设为640x480
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
// 记录系统时间
auto start = chrono::system_clock::now();
while (1) {
cv::Mat frame;
cap >> frame; // 读取相机数据
auto now = chrono::system_clock::now();
auto timestamp = chrono::duration_cast<chrono::milliseconds>(now - start);
SLAM.TrackMonocular(frame, double(timestamp.count())/1000.0);
}
return 0;
}
在myslam.yaml 中写入自己标定的相机内参
%YAML:1.0
#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------
# Camera calibration and distortion parameters (OpenCV)
# 主要是在这里写入自己的标定参数,这个文件可以通过copy 数据集的yaml文件进行修改即可
Camera.fx:
Camera.fy:
Camera.cx:
Camera.cy:
Camera.k1:
Camera.k2:
Camera.p1:
Camera.p2: