高翔博客:
https://www.cnblogs.com/gaoxiang12/tag/%E4%B8%80%E8%B5%B7%E5%81%9ARGB-D%20SLAM/
个人程序:
https://github.com/eminbogen/one_slam
作为小萝卜N+10086号,来的时候大部队已经走了很远了,所以很多库的版本发生了变化,程序也需要修改。具体如下:
程序I
无;
程序II
对generatePointCloud.cpp读取图片的地址部分进行修改,变成
rgb = cv::imread( "../data/rgb.png" );
depth = cv::imread( "../data/depth.png", -1 );
当然,把data文件夹移动到bin下也ok呀。
程序III
对detectFeatures.cpp添加命名空间cv,声明特征提取器与描述子提取器部分修改,同时图像读取地址也要进行修改。
using namespace cv;
/*****************************************************/
cv::Ptr<cv::FeatureDetector> detector;
cv::Ptr<cv::DescriptorExtractor> descriptor;
detector = ORB::create();
descriptor = ORB::create();
求解PNP的函数也要修改,0.99是可信度。
cv::solvePnPRansac( pts_obj, pts_img, cameraMatrix, cv::Mat(), rvec, tvec, false, 100, 1.0, 0.99, inliers );
程序IV
将上述detectFeatures.cpp复制过来,或CMakelist去掉该部分,对slamBase.cpp进行修改。
using namespace cv;
/********************************************************************/
void computeKeyPointsAndDesp( FRAME& frame, string detector, string descriptor ){
//_detector = cv::FeatureDetector::create( detector.c_str() );
//_descriptor = cv::DescriptorExtractor::create( descriptor.c_str() );
_detector = ORB::create();
_descriptor = ORB::create();
/********************************************************************/
cv::solvePnPRansac( pts_obj, pts_img, cameraMatrix, cv::Mat(), rvec, tvec, false, 100, 1.0, 0.99, inliers );
/********************************************************************/
同时slamBase.h的参数读取程序里地址和joinPointCloud.cpp里的读取图片地址进行修改或移到bin下。
ParameterReader( string filename="../parameters.txt" )
/******************************************************************/
cv::Mat rgb1 = cv::imread( "../data/rgb1.png");
cv::Mat rgb2 = cv::imread( "../data/rgb2.png");
cv::Mat depth1 = cv::imread( "../data/depth1.png", -1);
cv::Mat depth2 = cv::imread( "../data/depth2.png", -1);
程序V
我用的TUM网上的数据,不过考虑到易推广性,我在slambase程序中写了一个读取图片子函数,这样各种数据集就可以直接用了,不需要高翔网盘那样进行预处理了,图片路径,总图片数量,帧间隔使用参数文本读取。之后对帧类进行了修改,全程序以程序IV为基础修改。
int readfile_getstring( vector<string>& path_to_rgb,vector<string>& path_to_depth)
{
ParameterReader pd;
string path_to_dataset = pd.getData("path_to_dataset");
int associate_line = atoi( pd.getData( "associate_line" ).c_str() );
int interval_frame = atoi( pd.getData( "interval_frame" ).c_str() );
//给予路径。图片信息文件路径和机器人运动数据文件路径
string associate_file = path_to_dataset + "/associate.txt";
//找不到怎么办
ifstream fin1( associate_file );
if ( !fin1 )
{
cerr<<"I cann't find associate.txt!"<<endl;
return 1;
}
//给予读取时的内容名
string rgb_file, depth_file, time_rgb, time_depth;
//读取图片时存储名
cv::Mat color, depth;
vector<cv::Mat> colorImgs, depthImgs; // 彩色图和深度图
vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d> > poses; // 相机位姿
//标志位,检测到图片时间和机器人位置时间相等时变成1
for ( int index=0; index<=associate_line/interval_frame; index++)
{
//读取图像位置信息,并存储
int interval_frame_c =interval_frame;
while(interval_frame_c--) fin1>>time_rgb>>rgb_file>>time_depth>>depth_file;
path_to_rgb.push_back (path_to_dataset+"/"+rgb_file );
path_to_depth.push_back(path_to_dataset+"/"+depth_file);
}
}
程序VI
以程序V为基础加上了g2o。
程序VII
slambase.h增加frameid,其余主函数对应修改。
程序VII
拆成各种子函数
程序IX
增加了不同的:
特征法类别(1:SIFT,2:SURF,3:ORB)
匹配类别(1:BruteForce,2:ORB's BruteForce or other's FlannBased)
线性方程求解器分类(1:Eigen,2:CSparse,3:Cholmod,4:Dense)
优化器分类(1:Levenberg,2:Dogleg,3:GaussNewton)
程序X
选定方案的SLAM系统,bin有误差绘图与计算python程序