精华内容
下载资源
问答
  • VTK ICP配准

    千次阅读 2017-07-18 09:57:24
    ICP 全称为vtkIterativeClosestPointTransform,也是vtk经典配准算法之一,输入为vtkdataset,需指定迭代次数,配准效果优于Landmark配准,但效率低于landmark 示例代码如下: vtkSmartPointer...

    ICP 全称为vtkIterativeClosestPointTransform,也是vtk经典配准算法之一,输入为vtkdataset,需指定迭代次数,配准效果优于Landmark配准,但效率低于landmark。该配准算法是一个迭代的过程,每次迭代中对于源数据点P找到目标点集Q中的最近点,然后基于最小二乘原理求解当前的变换T 。通过不断迭代直至收敛,即完成了点集的配准。
    示例代码如下:

        vtkSmartPointer<vtkIterativeClosestPointTransform> icpTransform = 
            vtkSmartPointer<vtkIterativeClosestPointTransform>::New();
        icpTransform->SetSource(sourceDataSet);//源点集
        icpTransform->SetTarget(targetDataSet);//目标点集
        icpTransform->GetLandmarkTransform()->SetModeToRigidBody();//指定刚性变换
        icpTransform->SetMaximumNumberOfIterations(nIterationNum);//迭代次数
        icpTransform->Modified();
        icpTransform->Update();

    对sourceDataSet做icpTransform变换后即为配准结果。

    展开全文
  • Mysql ICP(翻译)

    2019-10-02 14:39:18
    ICP 全称Index Condition Pushdown。这个特性主要是针对索引查找的优化,使得查找数据的时候,无法精确匹配的索引也会做出比较。会在存储引擎层将不满足的数据直接过滤掉。 Index Condition ...

     

    英文版原文链接

    https://mariadb.com/kb/en/library/index-condition-pushdown/

    ICP 全称 Index Condition Pushdown。这个特性主要是针对索引查找的优化,使得查找数据的时候,无法精确匹配的索引也会做出比较。会在存储引擎层将不满足的数据直接过滤掉。

     

    Index Condition Pushdown is an optimization that is applied for access methods that access table data through indexes: range, ref, eq_ref,  
    ref_or_null, and Batched Key Access. The idea is to check part of the WHERE condition that refers to index fields (we call it Pushed Index Condition) as soon as we've accessed the index.
    If the Pushed Index Condition is not satisfied, we won't need to read the whole table record.
    ICP 是一种通过索访问表数据的访问方法的优化,可以优化的类型有range,ref,eq_ref,ref_or_null。只要where后面的条件是索引,那么就可以适用于这个特性。如果ICP不满足(感觉这里应该是满足),则不用访问整个表的记录。

    打开和关闭ICP

    SET optimizer_switch='index_condition_pushdown=off' 
    ICP特性是默认打开的,可以通过sql语句关闭这个特性

     


     

    当ICP特性被打开之后,Explain 字段会显示 “Using index condition”

    When Index Condition Pushdown is used, EXPLAIN will show "Using index condition":
    MariaDB [test]> explain select * from tbl where key_col1 between 10 and 11 and key_col2 like '%foo%';
    +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------+
    | id | select_type | table | type  | possible_keys | key      | key_len | ref  | rows | Extra                 |
    +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------+
    |  1 | SIMPLE      | tbl   | range | key_col1      | key_col1 | 5       | NULL |    2 | Using index condition |
    +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------+
    1 row in set (0.01 sec)

     

     


     

    The idea behind index condition pushdown 关于ICP背后的秘密

    In disk-based storage engines, making an index lookup is done in two steps, like shown on the picture:
    在基于磁盘的存储引擎中,完成一个索引查询需要两个步骤

    第一步是读入匹配的索引记录,第二步是根据索引中的指针读取表中的记录
    Index Condition Pushdown optimization tries to cut down the number of full record reads by checking whether index records satisfy part of the WHERE condition that can be checked for them:
    ICP特性 尝试检测where条件中的条件是否,来减少读取整个表的数据

    How much speed will be gained depends on - How many records will be filtered out - How expensive it was to read them
    
    The former depends on the query and the dataset. The latter is generally bigger when table records are on disk and/or are big, especially when they have blobs.
    将获得多少速度取决于 - 多少记录将被过滤掉 - 取决于多去数据需要消耗的花费
    
    前者取决于查询和数据集。 当表记录在磁盘上和/或是大的时候,后者通常更大,特别是当它们具有斑点时。

     

    转载于:https://www.cnblogs.com/alin-qu/p/7899848.html

    展开全文
  • ICP全称Iterative Closest Point,翻译过来就是迭代最近点。ICP在点云配准领域应用的非常广泛,因此基于深度相机、激光雷达的算法使用ICP的频率比较高。 推导ICP 以下题目来自计算机视觉life从零开始一起学习SLAM...

    SLAM 学习笔记

    ICP全称Iterative Closest Point,翻译过来就是迭代最近点。ICP在点云配准领域应用的非常广泛,因此基于深度相机、激光雷达的算法使用ICP的频率比较高。

    推导ICP

    以下题目来自计算机视觉life从零开始一起学习SLAM系列

    推导ICP中的一个步骤
    证明:《视觉SLAM十四讲》第174页公式7.55中的
    在这里插入图片描述
    各符号定义见书上,其中,tr表示矩阵的迹。

    直接设出qi,R,qiq_i,R,q_i':
    在这里插入图片描述
    高童靴收集的第二种答案看的不是很懂,暂时就先用这种简单粗暴的方式吧。

    求解ICP原理

    线性方法(SVD分解)

    参考14讲173页。
    在这里插入图片描述
    在这里插入图片描述
    最优性的证明可以参考之前的一篇文章:从零手写VIO(六)
    通过对W进行奇异值分解,因为R满秩,所以R=UVT

    非线性方法

    构建无约束优化问题

    在这里插入图片描述
    然后就是使用g2o进行优化了,g2o里面没有3D-3D的边,需要自己构建,自己算算误差对位姿扰动量的偏导数,参考书上175。

    ICP实战

    以下题目来自计算机视觉life从零开始一起学习SLAM系列

    题目: 给定一个轨迹1,数据格式:timestamp tx ty tz qx qy qz qw, 自定义一个任意的旋转矩阵和平移向量(可
    以尝试不同的值,甚至加一些噪声看看结果有什么变化),对轨迹1进行变换,得到一个新的轨迹2, 使用ICP算法
    (提示:取平移作为三维空间点)估计轨迹1,2之间的位姿,然后将该位姿作用在轨迹2。

    验证:ICP算法估计的旋转矩阵和平移向量是否准确;轨迹1,2是否重合。 如下是加了一个旋转平移量后的两个轨迹,经过ICP计算好位姿后再反作用在变换后的轨迹,最终两个轨迹是重合滴!
    在这里插入图片描述
    代码框架及数据 链接:https://pan.baidu.com/s/1a_6FGAd955EPED-duUqpPw 提取码:30sz

    代码

    /****************************
     * 题目:给定一个轨迹1,数据格式:timestamp tx ty tz qx qy qz qw
     * 自定义一个任意的旋转矩阵和平移向量(可以尝试不同的值看看结果有什么变化),对轨迹1进行变换,得到一个新的轨迹2
     * 使用ICP算法(提示:取平移作为三维空间点)估计轨迹1,2之间的位姿,然后将该位姿作用在轨迹2
     * 验证:ICP算法估计的旋转矩阵和平移向量是否准确;轨迹1,2是否重合
    ****************************/
    #include <iostream>
    #include "sophus/se3.h"
    #include <fstream>
    #include <pangolin/pangolin.h>
    #include <opencv2/core/core.hpp>
    #include <opencv2/calib3d/calib3d.hpp>
    #include <Eigen/Core>
    #include <Eigen/Geometry>
    #include <Eigen/SVD>
    
    using namespace std;
    using namespace cv;
    
    void DrawTrajectory(vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> pose1,
                        vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> pose2);
    
    void pose_estimation_3d_3d(
        const vector<Point3f>& pts1,
        const vector<Point3f>& pts2,
        Eigen::Matrix3d& R_,
        Eigen::Vector3d& t_
    );
    
    int main()
    {
        // path to trajectory file
        string trajectory_file = "../trajectory.txt";
    
    
        vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> pose_groundtruth;
        vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> pose_new;
        vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> pose_estimate;
        vector<Point3f> pts_new, pts_groundtruth;
    
        Eigen::Quaterniond q;
        Eigen::Vector3d t;
        Sophus::SE3 T;
        string timestamp;
        ifstream textFile;
    
        // 自定义一个变换矩阵
        /********************** 开始你的代码,参考星球里作业5代码 ****************************/
        // 旋转向量(轴角):沿Z轴旋转45°
        Eigen::AngleAxisd rotation_vector(M_PI/4,Eigen::Vector3d(0,0,1));
        Eigen::Quaterniond rotate(rotation_vector);
       // 平移向量,可以自己自定义,我这里是 x=3, y=-1, z=0.8,可以多尝试其他值
        Eigen::Vector3d tranlation(3,-1,0.8);
        /********************** 结束你的代码 ****************************/
    	
        Sophus::SE3 myTransform(rotate,tranlation);
        cout<<"rotation matrix =\n"<<rotation_vector.matrix() <<endl;
        cout<<"translation vector =\n"<<tranlation <<endl;
        cout<<"myTransform =\n"<<myTransform.matrix() <<endl;
    
        textFile.open(trajectory_file.c_str());
    
        // 读取轨迹数据
        /********************** 开始你的代码,参考星球里作业8代码 ****************************/
    	// 提示:取平移作为三维空间点
        if(!textFile.is_open())
        {
            cout<<"file is empty!"<<endl;
            return -1;
        }else
        {
            string sLineData;
            while(getline(textFile, sLineData) && !sLineData.empty())
            {
                istringstream strData(sLineData);
                strData>>timestamp>>t[0]>>t[1]>>t[2]>>q.x()>>q.y()>>q.z()>>q.w();
                if(timestamp=="#" || timestamp=="-1.#INF")
                {
                    continue;
                }
    
                T = Sophus::SE3(q, t);
                pose_groundtruth.push_back(T);
                pts_groundtruth.push_back(Point3d(t[0], t[1], t[2]));
    
                Sophus::SE3 tmp(myTransform*T); // 新的位姿
                pose_new.push_back(tmp);   
                pts_new.push_back(Point3f(tmp.translation()[0], tmp.translation()[1], tmp.translation()[2]));
            }
    
        }
        /********************** 结束你的代码 ****************************/
        textFile.close();
        cout<<"pose_new size:"<<pose_new.size()<<"pts_new size:"<<pts_new.size()<<endl;
    	
        // 使用ICP算法估计轨迹1,2之间的位姿,然后将该位姿作用在轨迹2
        /********************** 开始你的代码,参考十四讲中第7章ICP代码 ****************************/
        Eigen::Matrix3d R_;
        Eigen::Vector3d t_;
        pose_estimation_3d_3d(pts_new, pts_groundtruth, R_, t_);    // 这里是书上的推导出来是第二帧到第一帧的R和t,即pts_groundtruth到pts_new的变换
        cout<<"Estimated results from ICP:"<<endl;
        cout<<"Estimated rotation matrix=\n"<<R_<<endl;
        cout<<"Estimated translation vector=\n"<<t_<<endl;
        // 取逆
        Eigen::Matrix3d Rot = R_.inverse(); // 第一帧到第二帧的旋转矩阵 即pts_new到pts_groundtruth的变换
        Eigen::Vector3d tran = -Rot*t_;     // 第一帧到第二帧的位移
        Sophus::SE3 T_estimate(Rot, tran);  // 
    
        // 使用我们估计的pts_new到pts_groundtruth的位姿变换pts_new-->pts_groundtruth
        for (int i = 0; i < pose_new.size(); i++)
        {
            pose_estimate.push_back(T_estimate*pose_new[i]);
        }
        
        /********************** 结束你的代码 ****************************/
    
         //DrawTrajectory(pose_groundtruth, pose_new);  // 变换前的两个轨迹
        DrawTrajectory(pose_groundtruth, pose_estimate);  // 轨迹应该是重合的
        return 0;
    }
    
    void pose_estimation_3d_3d(
        const vector<Point3f>& pts1,
        const vector<Point3f>& pts2,
        Eigen::Matrix3d& R_,
        Eigen::Vector3d& t_
    )
    {
        Point3f p1, p2; // center of mass
        int N = pts1.size();
        for (int i = 0; i < N; i++)
        {
            p1+=pts1[i];
            p2+=pts2[i];
        }
        p1/=N;
        p2/=N;
        vector<Point3f> q1(N), q2(N);   // remove the center
        for (int i = 0; i < N; i++)
        {
            q1[i] = pts1[i] - p1;
            q2[i] = pts2[i] - p2;
        }
    
        // compute q1*q2^T
        Eigen::Matrix3d w = Eigen::Matrix3d::Zero();
        for (int i = 0; i < N; i++)
        {
            w+=Eigen::Vector3d(q1[i].x, q1[i].y, q1[i].z)
                *Eigen::Vector3d(q2[i].x, q2[i].y, q2[i].z).transpose();
        }
        cout<<"w="<<w<<endl;
    
        // SVD on w
        Eigen::JacobiSVD<Eigen::Matrix3d> svd(w,Eigen::ComputeFullU|Eigen::ComputeFullV);
        Eigen::Matrix3d U = svd.matrixU();
        Eigen::Matrix3d V = svd.matrixV();
    
        // if(U.determinant()*V.determinant()<0)
        // {
        //     for (int x = 0; x < 3; ++x)
        //     {
        //         U(x,2)*=-1;
        //     }
        // }
    
        cout<<"U="<<U<<endl;
        cout<<"V="<<V<<endl;
    
        R_ = U*(V.transpose());
        t_ = Eigen::Vector3d(p1.x,p1.y,p1.z)-R_*Eigen::Vector3d(p2.x,p2.y,p2.z);
    
    }
    
    void DrawTrajectory(vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> pose1,
                        vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> pose2) {
        if (pose1.empty()||pose2.empty()) {
            cerr << "Trajectory is empty!" << endl;
            return;
        }
    
        // create pangolin window and plot the trajectory
        pangolin::CreateWindowAndBind("Trajectory Viewer", 1024, 768);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
        pangolin::OpenGlRenderState s_cam(
                pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000),
                pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0)
        );
    
        pangolin::View &d_cam = pangolin::CreateDisplay()
                .SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, -1024.0f / 768.0f)
                .SetHandler(new pangolin::Handler3D(s_cam));
    
    
        while (pangolin::ShouldQuit() == false) {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
            d_cam.Activate(s_cam);
            glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    
            glLineWidth(2);
            for (size_t i = 0; i < pose1.size() - 1; i++) {
                glColor3f(1 - (float) i / pose1.size(), 0.0f, (float) i / pose1.size());
                glBegin(GL_LINES);
                auto p1 = pose1[i], p2 = pose1[i + 1];
                glVertex3d(p1.translation()[0], p1.translation()[1], p1.translation()[2]);
                glVertex3d(p2.translation()[0], p2.translation()[1], p2.translation()[2]);
                glEnd();
            }
            for (size_t i = 0; i < pose2.size() - 1; i++) {
                glColor3f(1 - (float) i / pose2.size(), 0.0f, (float) i / pose2.size());
                glBegin(GL_LINES);
                auto p1 = pose2[i], p2 = pose2[i + 1];
                glVertex3d(p1.translation()[0], p1.translation()[1], p1.translation()[2]);
                glVertex3d(p2.translation()[0], p2.translation()[1], p2.translation()[2]);
                glEnd();
            }
    
            pangolin::FinishFrame();
            usleep(5000);   // sleep 5 ms
        }
    }
    
    

    附:CMakeLists.txt:

    cmake_minimum_required( VERSION 2.8 )
    project( ICP )
    
    set( CMAKE_BUILD_TYPE "Release" )
    set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )
    
    find_package( OpenCV REQUIRED )
    # find_package( OpenCV REQUIRED ) # use this if in OpenCV2
    FIND_PACKAGE(Pangolin REQUIRED)
    FIND_PACKAGE(Sophus REQUIRED)
    
    include_directories(
            ${Sophus_INCLUDE_DIRS}
            ${Pangolin_INCLUDE_DIRS}
            ${OpenCV_INCLUDE_DIRS}
            "/usr/include/eigen3/"
    )
    
    add_executable( ${PROJECT_NAME} icp.cpp )
    target_link_libraries( ${PROJECT_NAME}
    #        ${Sophus_LIBRARIES}
            ${Pangolin_LIBRARIES}
            ${OpenCV_LIBS}
            /home/yan/3rdparty/Sophus/build/libSophus.so
    )
    
    

    总结

    其实就是把原始数据旋转平移一下,然后用旋转后点的数据,使用ICP估计这个旋转平移。;这个旋转是从原始位姿到新位姿的旋转,如果对其R求逆,t取负,就是新位姿到原始数据的变换矩阵,能够把新位姿复位,看是否与原位姿重合。

    也可以使用g2o非线性优化方法,参考书上179页。

    参考:
    视觉SLAM14讲
    从零开始一起学习SLAM | ICP原理及应用

    展开全文
  • 小白:师兄,最近忙什么呢,都见不到你人影,我们的课也好久没更新了呢 ...ICP全称Iterative Closest Point,翻译过来就是迭代最近点。ICP在点云配准领域应用的非常广泛,因此基于深度相机、激光雷达的算

    https://zhuanlan.zhihu.com/p/66168444

    小白:师兄,最近忙什么呢,都见不到你人影,我们的课也好久没更新了呢
    师兄:抱歉,抱歉,最近忙于俗事。我后面一起补上,学习劲头得向你们年轻人学习啊!话说,你最近在研究什么呢?
    小白:最近在看ICP,十四讲上简单提了下,还有点懵懵哒
    师兄:好,那今天就说说ICP算法吧。搬个小板凳做好哈:
    ICP全称Iterative Closest Point,翻译过来就是迭代最近点。ICP在点云配准领域应用的非常广泛,因此基于深度相机、激光雷达的算法使用ICP的频率比较高。
    小白:那我是学视觉SLAM的,是不是不用关注了啊(内心OS:毕竟SLAM要学的太多了)
    师兄:哈哈,这个懒不能偷的。ICP现在在视觉SLAM中用的也非常多了。我总结了一下下ICP的应用场景:
    ICP到底有什么用呢?
    假设我们在三维空间中有两组点集,我们分别称之为P1, P2好了,P1, P2中都有几千个点,那么可以分为两种情况:
    1、我们完全不知道P1, P2中每个点是如何对应的。这样的情况很常见,比如我用只有depth的深度相机或者激光雷达在两个不同的位置对着一只兔儿分别拍摄一张深度图并转化为点云图,我特喵的也不知道哪个点和哪个点对应,但是我想把这两个点云“融合”(专业词汇叫做registration,有些地方翻译为注册,有点让人不知所云,我建议翻译为配准)在一起,变成一个更完整的兔儿。


    2、我们已经知道P1, P2中哪个点对应的哪个点。比如我们使用RGB-D相机分别在两个不同位置拍摄一张 RGB彩色图 + 深度图,而且彩色图和深度图是对齐好的。因为有彩色图我们就可以做特征点匹配了,因为每个特征点都对应一个深度图上的深度值,所以我们能够得到两组对应好的三维点。

    小白:原来如此,看起来ICP还挺强大的,对应不对应都能搞定啊,ICP为何这么牛叉?
    ICP为何这么牛叉?
    师兄:来看看ICP的过程就知道了。为了方便,我们用一个二维的例子来说明吧,初始是两个不同角度下的笑脸(深红色和绿色),下面是红色笑脸如何通过ICP过程和绿色笑脸重合的:


    小白:好神奇啊

    师兄:这个只是一个示例,通常情况下我们在SLAM中不会遇到这种情况,都是三维空间的点。我再以点云配准为例进行说明。假设现在有两幅待配准的点云(比如上面的小兔子),ICP算法是这样配准两幅点云的:
    ICP算法流程

    1. 首先对于一幅点云中的每个点,在另一幅点云中计算匹配点(最近点)
    2. 极小化匹配点间的匹配误差,计算位姿
    3. 然后将计算的位姿作用于点云
    4. 再重新计算匹配点
    5. 如此迭代,直到迭代次数达到阈值,或者极小化的能量函数变化量小于设定阈值

    下面是用三维点云进行ICP的一个效果


    小白:第一次计算的误差估计很大,后面会慢慢变小,直到收敛?

    师兄:嗯,这是一个由粗放到精细的过程,在视觉算法中由粗到精的方法很常用。。
    小白:比如图像金字塔!哈哈
    师兄:嗯,熟悉的配方,熟悉的味道(/笑脸)
    ICP的精髓其实就是迭代,一次次的修正错误,最后获得一个还不错的结果。
    不过话是这样说,但是一般情况下数据都有不少噪音,如果噪音较大,第一种情况不一定能完全配准正确。
    小白:听起来合情合理,也不麻烦,书上为啥推导那么复杂?
    师兄:嗯,这就是感性到理性的过程。视觉SLAM十四讲书上从数学上推导了具体如何实现。我这里引用一下求解ICP的三个步骤:


    小白:原理推导大概是能看明白了
    师兄:嗯嗯,推导部分给你留了一个小小的课后作业了
    小白:师兄想的周到,这样才能真正掌握呢(内心OS:真狠啊。。)
    师兄:上面介绍是最简单的点和点匹配的ICP算法,实际应用中为了使得算法鲁棒,也就是在有不少噪声的情况下仍然能够得到正确的结果,很多研究者提出了不同的匹配思路:例如,极小化的误差项包括对应点的点到点的欧式距离,和对应点的点到平面距离,以及极小化对应点的颜色值误差等
    小白:这么多方法,用哪个好呢?
    师兄:如果你应用场景简单,数据干净基本没有噪声,最原始的点点匹配就行。如果有噪声,则最后考虑一下复杂点的方法。2003年的时候,pottman 和Hofer两位大牛的论文中证明了当两幅点云比较接近时,极小化对应点的点到平面距离比点到点距离更接近两个平面之间的真实距离,也就是说计算点到平面的距离更靠谱!
    下面是个示意图


    这就是ICP的原理啦!
    下面是实践环节
    练习
    1、推导ICP中的一个步骤
    证明:《视觉SLAM十四讲》第174页公式7.55中的


    各符号定义见书上,其中,tr表示矩阵的迹。
    2、 精心设计的ICP编程实践
    给定一个轨迹1,数据格式:timestamp tx ty tz qx qy qz qw, 自定义一个任意的旋转矩阵和平移向量(可以尝试不同的值,甚至加一些噪声看看结果有什么变化),对轨迹1进行变换,得到一个新的轨迹2, 使用ICP算法(提示:取平移作为三维空间点)估计轨迹1,2之间的位姿,然后将该位姿作用在轨迹2。
    验证:ICP算法估计的旋转矩阵和平移向量是否准确;轨迹1,2是否重合。
    如下是我加了一个旋转平移量后的两个轨迹,经过ICP计算好位姿后再反作用在变换后的轨迹,最终两个轨迹是重合滴!


    代码框架、数据及预期结果已经为你准备好了,公众号「计算机视觉life」后台回复:ICP,即可获得。
    欢迎留言讨论,更多学习视频、文档资料、参考答案等点击下面链接查看「从零开始学习SLAM」星球介绍,3天内无条件退款,有效期一年,每天0.3元,帮你少走弯路,快速入门SLAM!

    http://mp.weixin.qq.com/s?__biz=MzIxOTczOTM4NA==&mid=100002356&idx=1&sn=1164bb5c8567cbe2672f4b513b48dce5&chksm=17d7efa320a066b50a0ab82e020bb9002df6947be7577cfb85adc01394b2c2c8a3c3045932b6#rd​mp.weixin.qq.com

     

     


    本文参考:高翔《视觉SLAM十四讲》
    推荐阅读
    如何从零开始系统化学习视觉SLAM?
    从零开始一起学习SLAM | 为什么要学SLAM?
    从零开始一起学习SLAM | 学习SLAM到底需要学什么?
    从零开始一起学习SLAM | SLAM有什么用?
    从零开始一起学习SLAM | C++新特性要不要学?
    从零开始一起学习SLAM | 为什么要用齐次坐标?
    从零开始一起学习SLAM | 三维空间刚体的旋转
    从零开始一起学习SLAM | 为啥需要李群与李代数?
    从零开始一起学习SLAM | 相机成像模型
    从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
    从零开始一起学习SLAM | 神奇的单应矩阵
    从零开始一起学习SLAM | 你好,点云
    从零开始一起学习SLAM | 给点云加个滤网
    从零开始一起学习SLAM | 点云平滑法线估计
    从零开始一起学习SLAM | 点云到网格的进化
    从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
    从零开始一起学习SLAM | 掌握g2o顶点编程套路
    从零开始一起学习SLAM | 掌握g2o边的代码套路
    零基础小白,如何入门计算机视觉?
    SLAM领域牛人、牛实验室、牛研究成果梳理
    我用MATLAB撸了一个2D LiDAR SLAM
    可视化理解四元数,愿你不再掉头发
    最近一年语义SLAM有哪些代表性工作?
    视觉SLAM技术综述
    汇总 | VIO、激光SLAM相关论文分类集锦
    研究SLAM,对编程的要求有多高?
    2018年SLAM、三维视觉方向求职经验分享
    2018年SLAM、三维视觉方向求职经验分享
    深度学习遇到SLAM | 如何评价基于深度学习的DeepVO,VINet,VidLoc?
    视觉SLAM关键方法总结

    展开全文
  • 点“计算机视觉life”关注,星标更快接收干货! 小白:师兄,最近忙什么呢,都见不到你人影,我们的课也好久没更新了呢 师兄:抱歉,抱歉,最近忙于俗事。...ICP全称Iterative Closest Point,翻...
  • ICP是什么意思呢?相信大多站长并不清楚ICP是什么意思,就算是网站已经备案的也不了解ICP到底为何物。... ICP的英文全称为Internet Content Provider,中文意思为网络内容服务商。即向广大用户综合提供互联网信息...
  • ICP的英文全称为Internet Content Provider,中文意思为网络内容服务商。即向广大用户综合提供互联网信息业务和增值业务的电信运营商。ICP同样是经国家主管部门批准的正式运营企业,享受国家法律保护。 ICP备案.....
  • 什么是ICP证 ICP全称“《增值电信业务经营许可证》-互联网信息服务”是指通过互联网,向上网用户有偿提供信息或者网页制作等服务活动。经营性ICP,经营的内容主要是网上广告、代制作网页、有偿提供特定信息内容...
  • ICP年检

    2007-03-08 16:36:29
    ICP全称“《增值电信业务经营许可证》-互联网信息服务”是指通过互联网,向上网用户×××信息或者网页制作等服务活动。经营性ICP,经营的内容主要是网上广告、代制作网页、×××特定信息内容、电子商务及其它...
  • 企业 ICP

    2011-06-24 15:17:00
    ICP证,全称:《增值电信业务经营许可证》,是网站经营的许可证。根据国家>,经营性网站必须办理ICP证,否则就属于非法经营。 
  • 什么是ICP,什么是ICP

    千次阅读 2006-12-31 12:25:00
    ICP的英文是Internet Content Provider,翻译为互联网内容提供...如新浪、搜狐、163、21CN等 ICP全称“《增值电信业务经营许可证》-互联网信息服务”是指通过互联网,向上网用户有偿提供信息或者网页制作等服务活动
  •  在写程序的时候,我们如果能说出一个术语的全称,首先让对方会感觉很好,其次也方便我们从字面上去理解这个术语的含义,比如:Object Oriented Design OOD 面向对象设计,Internet Content Provider ICP ...
  • ICP全称为Index Condition Pushdown,是MySQL 5.6引入的一项优化策略。简单的来说就是将本该在MySQL进行过滤的条件下推到Innodb引擎层去做。但是这种策略和我们平时说的使用到了索引实际上是不同的,我们平时说的...
  • 写在开头的话近日小编在ESG(Enterprise Strategy Group)官网偶然瞥到一份关于ICP(Integrated Computing Platform)的趋势报告,“ICP?集成计算平台?”小编怀着强烈的好奇心研读后,惊奇发现这家伙本尊是超融合...
  • ==cncert/cc国家互联网应急中心国家互联网应急中心(英文:National Internet Emergency Center,缩写CNCERT或CNCERT/CC)全称是国家计算机网络应急技术处理协调中心==只要了解了他们的攻击手段,具有丰富的网络知识...
  • stm32 IAP软件更新方法

    2018-12-03 15:18:45
    IAP,全称是“In-Application Programming”(在应用中编程)。IAP是一种通过微控制器的对外接口(如USART)对正在运行程序的微控制器进行内部程序的更新的技术(其有别于ICP或者ISP)。ICP(In-Circuit Programming...
  • STM32的IAP实现

    2014-07-28 16:31:06
    IAP,全称是“In-ApplicationProgramming”,中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口(如USART,IIC,CAN,USB,以太网接口甚至是无线射频通道)对正在运行程序的微控制器进行内部程序的...
  • PCL全称Point Cloud Library,官方网站为(https://pointclouds.org),是一个专门用于点云处理的C++开源库。其功能包括了点云数据的基本操作,如保存、读取、显示;包括了点云的进阶操作,如空间刚体变换(旋转、平移...
  • BGP就是边界网关协议,英文全称Border Gateway Protocol,是一种在自治系统(即AS)之间动态交换路由信息的路由协议。 谈到BGP对于IDC的好处,还得从头说起。 自从2003年电信与网通南北分离之后,北方网通与南方...
  • 互联网数据中心(Internet Data Center)简称IDC,就是电信部门利用已有的互联网通信线路、带宽资源,建立标准化的电信专业级机房环境,为企业、政府提供服务器托管、租用以及相关增值等方面的...CDN的全称是Content De
  • 全称是Dynamic Host Configuration Protocol (动态主机配置协议) 协议可自动为局域网中的每一台自动分配IP地址,并完成每台计算机的ICP/IP协议的配置,包括IP地址,子网掩码,网关,以及指定...
  • Internet概述

    2019-10-26 14:28:10
    网络(network):许多...ISP全称(Internet Service Provider)即**“互联网服务提供商”.** 这里的服务主要是指Internet接入服务,即通过电话线把你的计算机或其他终端设备连入Internet。 ICP是什么? 是Internet ...
  • Internet的概述

    2019-10-26 14:55:32
    网络(network):许多...ISP全称(Internet Service Provider)即**“互联网服务提供商”.** 这里的服务主要是指Internet接入服务,即通过电话线把你的计算机或其他终端设备连入Internet。 ICP是什么? 是Internet ...
  • “互联港湾”是中国电信互联网数据中心(简称数据中心,英文全称为internet data center、简称(IDC) 的业务品牌。广东电信互联港湾成功打造了服务于全国的国家级 IDC平台,为企业、应用服 务提供商(ISP)、内容...
  • 上一篇文章咱们对 ICP 进行了一次全面的分析,本篇文章小编继续为大家分析优化器的另外两个选项: MRR & batched_key_access(BKA) ,分析一下他们的作用、原理、相互关系、源码实现以及使用范围。 什么是 MRR ...
  • 上一篇文章咱们对 ICP 进行了一次全面的分析,本篇文章小编继续为大家分析优化器的另外两个选项: MRR & batched_key_access(BKA) ,分析一下他们的作用、原理、相互关系、源码实现以及使用范围。 什么是 MRR MRR...
  • 优化器 MRR & BKA

    2016-02-03 17:51:17
    上一篇文章咱们对 ICP 进行了一次全面的分析,本篇文章小编继续为大家分析优化器的另外两个选项: MRR & batched_key_access(BKA) ,分析一下他们的作用、原理、相互关系、源码实现以及使用范围。 什么是 MRR MRR ...
  • 开源负载均衡器DPVS

    千次阅读 2017-10-31 19:12:55
    介绍 DPVS是基于DPDK的高性能第4层负载均衡器。基于阿里巴巴/ LVS修改而来,出于蓝而胜于蓝。 ...DPDK全称为 “DPDK-LVS”. ...内核旁路(用户空间实现)无CPU,无密钥数据(无锁)RX转向和CPU绑定...高性能ICP的无锁
  • IAP,全称是“In-Application-Programming”,中文解释为“在程序程”。不同于ISP通过设置MCU内部的BootLoader程序引导烧写或者是ICP通过SWD、JTAG在线仿真烧写。IAP是一种对通过微控制器的对外接口如:USART,IIC,...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

icp全称