对于高翔一起做RGB-D SLAM中问题进行的程序修改[附代码]

高翔博客:

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程序

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值