第7讲 视觉里程计1 上篇

1 OpenCV的ORB特征

  cpp文件内容为,

#include <iostream>
#include <chrono>

using namespace std;

#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

string path1 = "../1.png";  //图片1路径
string path2 = "../2.png";  //图片2路径

int main()
{
    //读取图像
    Mat img_1 = imread(path1, CV_LOAD_IMAGE_COLOR);  //CV_LOAD_IMAGE_COLOR表示返回一张彩色图
    Mat img_2 = imread(path2, CV_LOAD_IMAGE_COLOR);  //CV_LOAD_IMAGE_COLOR表示返回一张彩色图

    assert(img_1.data != nullptr && img_2.data != nullptr);  //assert()为断言函数,如果它的条件返回错误,则终止程序执行

    //初始化
    vector<KeyPoint> keypoints_1, keypoints_2;
    Mat descriptors_1, descriptors_2;
    Ptr<FeatureDetector> detector = ORB::create();
    Ptr<DescriptorExtractor> descriptor = ORB::create();
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");

    //检测Oriented_FAST角点位置
    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    detector->detect(img_1, keypoints_1);
    detector->detect(img_2, keypoints_2);

    //根据Oriented_FAST角点位置计算Rotated_BRIEF描述子
    descriptor->compute(img_1, keypoints_1, descriptors_1);
    descriptor->compute(img_2, keypoints_2, descriptors_2);
    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>> (t2 - t1);
    cout << "提取ORB特征点花费的时间为:" << time_used.count() << "秒!" << endl;

    //使用Hamming距离,对两幅图像中的Rotated BRIEF描述子进行匹配
    vector<DMatch> matches;
    t1 = chrono::steady_clock::now();
    matcher->match(descriptors_1, descriptors_2, matches);
    t2 = chrono::steady_clock::now();
    time_used = chrono::duration_cast<chrono::duration<double>> (t2 - t1);
    cout << "匹配Rotated BRIEF描述子所花时间为:" << time_used.count() << "秒!" << endl;

    //好的匹配点对筛选
    //计算最小距离和最大距离
    auto min_max = minmax_element(matches.begin(), matches.end(),
                                  [](const DMatch& m1, const DMatch& m2){return m1.distance < m2.distance;});
    //minmax_element()为c++中定义的寻找最小值和最大值的函数。
    //第3个参数表示比较函数,默认从小到大,可以省略
    double min_dist = min_max.first->distance;
    double max_dist = min_max.second->distance;

    cout << "最小距离为" << min_dist << ",最大距离为" << max_dist << "!" << endl;

    //当描述子之间的距离大于max(30.0, 2 * min_dist),即认为匹配有误
    vector<DMatch> good_matches;
    for(int i = 0; i < descriptors_1.rows; i++)
    {
        if(matches[i].distance <= max(30.0, 2 * min_dist))
            good_matches.push_back(matches[i]);
    }

    cout << "所有匹配的数目为" << matches.size() << ",好的匹配的数目为" << good_matches.size() << "!" << endl;

    //绘制批配结果
    Mat img_match;
    Mat img_goodmatch;
    drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_match);
    drawMatches(img_1, keypoints_1, img_2, keypoints_2, good_matches, img_goodmatch);
    imshow("所有的匹配", img_match);
    imshow("好的匹配", img_goodmatch);
    waitKey(0);

    return 0;
}

  CMakeLists.txt文件内容为,

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_DIRECTORIES})

add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBRARIES})

  结果为,

提取ORB特征点花费的时间为:0.0329158秒!
匹配Rotated BRIEF描述子所花时间为:0.0018441秒!
最小距离为7,最大距离为95!
所有匹配的数目为500,好的匹配的数目为81

在这里插入图片描述在这里插入图片描述

2 手写ORB特征

  现用OpenCV中的FAST()函数提取FAST角点,然后计算该角点的方向和Rotated BRIEF描述子;接着采用暴力匹配策略进行描述子匹配,如果两者之间的距离小于40,则认为是正确的匹配。
  cpp文件内容如下,

#include <iostream>
#include <string>
#include <chrono>
#include <nmmintrin.h>

using namespace std;

#include <opencv2/opencv.hpp>

using namespace cv;

//uint32_t表示unsigned int类型,占4个字节,总共32位。每个vector中有8个元素,因此,一共有8*32=256位!
typedef vector<uint32_t> DescType;  //描述子类型

//输入图像和Fast角点,输出描述子
void ComputeORB(const Mat& img, vector<KeyPoint>& keypoints, vector<DescType>& descriptors);

//输入描述子desc1和描述子desc2,输出匹配对matches
void BfMatch(const vector<DescType>& desc1, const vector<DescType>& desc2, vector<DMatch>& matches);



//ORB pattern
//确定二进制描述子Rotated BRIEF中每一位上是0还是1时,两个像素点的选择;32*32图像块
int ORB_pattern[256 * 4] =
        {
                8, -3, 9, 5/*mean (0), correlation (0)*/,
                4, 2, 7, -12/*mean (1.12461e-05), correlation (0.0437584)*/,
                -11, 9, -8, 2/*mean (3.37382e-05), correlation (0.0617409)*/,
                7, -12, 12, -13/*mean (5.62303e-05), correlation (0.0636977)*/,
                2, -13, 2, 12/*mean (0.000134953), correlation (0.085099)*/,
                1, -7, 1, 6/*mean (0.000528565), correlation (0.0857175)*/,
                -2, -10, -2, -4/*mean (0.0188821), correlation (0.0985774)*/,
                -13, -13, -11, -8/*mean (0.0363135), correlation (0.0899616)*/,
                -13, -3, -12, -9/*mean (0.121806), correlation (0.099849)*/,
                10, 4, 11, 9/*mean (0.122065), correlation (0.093285)*/,
                -13, -8, -8, -9/*mean (0.162787), correlation (0.0942748)*/,
                -11, 7, -9, 12/*mean (0.21561), correlation (0.0974438)*/,
                7, 7, 12, 6/*mean (0.160583), correlation (0.130064)*/,
                -4, -5, -3, 0/*mean (0.228171), correlation (0.132998)*/,
                -13, 2, -12, -3/*mean (0.00997526), correlation (0.145926)*/,
                -9, 0, -7, 5/*mean (0.198234), correlation (0.143636)*/,
                12, -6, 12, -1/*mean (0.0676226), correlation (0.16689)*/,
                -3, 6, -2, 12/*mean (0.166847), correlation (0.171682)*/,
                -6, -13, -4, -8/*mean (0.101215), correlation (0.179716)*/,
                11, -13, 12, -8/*mean (0.200641), correlation (0.192279)*/,
                4, 7, 5, 1/*mean (0.205106), correlation (0.186848)*/,
                5, -3, 10, -3/*mean (0.234908), correlation (0.192319)*/,
                3, -7, 6, 12/*mean (0.0709964), correlation (0.210872)*/,
                -8, -7, -6, -2/*mean (0.0939834), correlation (0.212589)*/,
                -2, 11, -1, -10/*mean (0.127778), correlation (0.20866)*/,
                -13, 12, -8, 10/*mean (0.14783), correlation (0.206356)*/,
                -7, 3, -5, -3/*mean (0.182141), correlation (0.198942)*/,
                -4, 2, -3, 7/*mean (0.188237), correlation (0.21384)*/,
                -10, -12, -6, 11/*mean (0.14865), correlation (0.23571)*/,
                5, -12, 6, -7/*mean (0.222312), correlation (0.23324)*/,
                5, -6, 7, -1/*mean (0.229082), correlation (0.23389)*/,
                1, 0, 4, -5/*mean (0.241577), correlation (0.215286)*/,
                9, 11, 11, -13/*mean (0.00338507), correlation (0.251373)*/,
                4, 7, 4, 12/*mean (0.131005), correlation (0.257622)*/,
                2, -1, 4, 4/*mean (0.152755), correlation (0.255205)*/,
                -4, -12, -2, 7/*mean (0.182771), correlation (0.244867)*/,
                -8, -5, -7, -10/*mean (0.186898), correlation (0.23901)*/,
                4, 11, 9, 12/*mean (0.226226), correlation (0.258255)*/,
                0, -8, 1, -13/*mean (0.0897886), correlation (0.274827)*/,
                -13, -2, -8, 2/*mean (0.148774), correlation (0.28065)*/,
                -3, -2, -2, 3/*mean (0.153048), correlation (0.283063)*/,
                -6, 9, -4, -9/*mean (0.169523), correlation (0.278248)*/,
                8, 12, 10, 7/*mean (0.225337), correlation (0.282851)*/,
                0, 9, 1, 3/*mean (0.226687), correlation (0.278734)*/,
                7, -5, 11, -10/*mean (0.00693882), correlation (0.305161)*/,
                -13, -6, -11, 0/*mean (0.0227283), correlation (0.300181)*/,
                10, 7, 12, 1/*mean (0.125517), correlation (0.31089)*/,
                -6, -3, -6, 12/*mean (0.131748), correlation (0.312779)*/,
                10, -9, 12, -4/*mean (0.144827), correlation (0.292797)*/,
                -13, 8, -8, -12/*mean (0.149202), correlation (0.308918)*/,
                -13, 0, -8, -4/*mean (0.160909), correlation (0.310013)*/,
                3, 3, 7, 8/*mean (0.177755), correlation (0.309394)*/,
                5, 7, 10, -7/*mean (0.212337), correlation (0.310315)*/,
                -1, 7, 1, -12/*mean (0.214429), correlation (0.311933)*/,
                3, -10, 5, 6/*mean (0.235807), correlation (0.313104)*/,
                2, -4, 3, -10/*mean (0.00494827), correlation (0.344948)*/,
                -13, 0, -13, 5/*mean (0.0549145), correlation (0.344675)*/,
                -13, -7, -12, 12/*mean (0.103385), correlation (0.342715)*/,
                -13, 3, -11, 8/*mean (0.134222), correlation (0.322922)*/,
                -7, 12, -4, 7/*mean (0.153284), correlation (0.337061)*/,
                6, -10, 12, 8/*mean (0.154881), correlation (0.329257)*/,
                -9, -1, -7, -6/*mean (0.200967), correlation (0.33312)*/,
                -2, -5, 0, 12/*mean (0.201518), correlation (0.340635)*/,
                -12, 5, -7, 5/*mean (0.207805), correlation (0.335631)*/,
                3, -10, 8, -13/*mean (0.224438), correlation (0.34504)*/,
                -7, -7, -4, 5/*mean (0.239361), correlation (0.338053)*/,
                -3, -2, -1, -7/*mean (0.240744), correlation (0.344322)*/,
                2, 9, 5, -11/*mean (0.242949), correlation (0.34145)*/,
                -11, -13, -5, -13/*mean (0.244028), correlation (0.336861)*/,
                -1, 6, 0, -1/*mean (0.247571), correlation (0.343684)*/,
                5, -3, 5, 2/*mean (0.000697256), correlation (0.357265)*/,
                -4, -13, -4, 12/*mean (0.00213675), correlation (0.373827)*/,
                -9, -6, -9, 6/*mean (0.0126856), correlation (0.373938)*/,
                -12, -10, -8, -4/*mean (0.0152497), correlation (0.364237)*/,
                10, 2, 12, -3/*mean (0.0299933), correlation (0.345292)*/,
                7, 12, 12, 12/*mean (0.0307242), correlation (0.366299)*/,
                -7, -13, -6, 5/*mean (0.0534975), correlation (0.368357)*/,
                -4, 9, -3, 4/*mean (0.099865), correlation (0.372276)*/,
                7, -1, 12, 2/*mean (0.117083), correlation (0.364529)*/,
                -7, 6, -5, 1/*mean (0.126125), correlation (0.369606)*/,
                -13, 11, -12, 5/*mean (0.130364), correlation (0.358502)*/,
                -3, 7, -2, -6/*mean (0.131691), correlation (0.375531)*/,
                7, -8, 12, -7/*mean (0.160166), correlation (0.379508)*/,
                -13, -7, -11, -12/*mean (0.167848), correlation (0.353343)*/,
                1, -3, 12, 12/*mean (0.183378), correlation (0.371916)*/,
                2, -6, 3, 0/*mean (0.228711), correlation (0.371761)*/,
                -4, 3, -2, -13/*mean (0.247211), correlation (0.364063)*/,
                -1, -13, 1, 9/*mean (0.249325), correlation (0.378139)*/,
                7, 1, 8, -6/*mean (0.000652272), correlation (0.411682)*/,
                1, -1, 3, 12/*mean (0.00248538), correlation (0.392988)*/,
                9, 1, 12, 6/*mean (0.0206815), correlation (0.386106)*/,
                -1, -9, -1, 3/*mean (0.0364485), correlation (0.410752)*/,
                -13, -13, -10, 5/*mean (0.0376068), correlation (0.398374)*/,
                7, 7, 10, 12/*mean (0.0424202), correlation (0.405663)*/,
                12, -5, 12, 9/*mean (0.0942645), correlation (0.410422)*/,
                6, 3, 7, 11/*mean (0.1074), correlation (0.413224)*/,
                5, -13, 6, 10/*mean (0.109256), correlation (0.408646)*/,
                2, -12, 2, 3/*mean (0.131691), correlation (0.416076)*/,
                3, 8, 4, -6/*mean (0.165081), correlation (0.417569)*/,
                2, 6, 12, -13/*mean (0.171874), correlation (0.408471)*/,
                9, -12, 10, 3/*mean (0.175146), correlation (0.41296)*/,
                -8, 4, -7, 9/*mean (0.183682), correlation (0.402956)*/,
                -11, 12, -4, -6/*mean (0.184672), correlation (0.416125)*/,
                1, 12, 2, -8/*mean (0.191487), correlation (0.386696)*/,
                6, -9, 7, -4/*mean (0.192668), correlation (0.394771)*/,
                2, 3, 3, -2/*mean (0.200157), correlation (0.408303)*/,
                6, 3, 11, 0/*mean (0.204588), correlation (0.411762)*/,
                3, -3, 8, -8/*mean (0.205904), correlation (0.416294)*/,
                7, 8, 9, 3/*mean (0.213237), correlation (0.409306)*/,
                -11, -5, -6, -4/*mean (0.243444), correlation (0.395069)*/,
                -10, 11, -5, 10/*mean (0.247672), correlation (0.413392)*/,
                -5, -8, -3, 12/*mean (0.24774), correlation (0.411416)*/,
                -10, 5, -9, 0/*mean (0.00213675), correlation (0.454003)*/,
                8, -1, 12, -6/*mean (0.0293635), correlation (0.455368)*/,
                4, -6, 6, -11/*mean (0.0404971), correlation (0.457393)*/,
                -10, 12, -8, 7/*mean (0.0481107), correlation (0.448364)*/,
                4, -2, 6, 7/*mean (0.050641), correlation (0.455019)*/,
                -2, 0, -2, 12/*mean (0.0525978), correlation (0.44338)*/,
                -5, -8, -5, 2/*mean (0.0629667), correlation (0.457096)*/,
                7, -6, 10, 12/*mean (0.0653846), correlation (0.445623)*/,
                -9, -13, -8, -8/*mean (0.0858749), correlation (0.449789)*/,
                -5, -13, -5, -2/*mean (0.122402), correlation (0.450201)*/,
                8, -8, 9, -13/*mean (0.125416), correlation (0.453224)*/,
                -9, -11, -9, 0/*mean (0.130128), correlation (0.458724)*/,
                1, -8, 1, -2/*mean (0.132467), correlation (0.440133)*/,
                7, -4, 9, 1/*mean (0.132692), correlation (0.454)*/,
                -2, 1, -1, -4/*mean (0.135695), correlation (0.455739)*/,
                11, -6, 12, -11/*mean (0.142904), correlation (0.446114)*/,
                -12, -9, -6, 4/*mean (0.146165), correlation (0.451473)*/,
                3, 7, 7, 12/*mean (0.147627), correlation (0.456643)*/,
                5, 5, 10, 8/*mean (0.152901), correlation (0.455036)*/,
                0, -4, 2, 8/*mean (0.167083), correlation (0.459315)*/,
                -9, 12, -5, -13/*mean (0.173234), correlation (0.454706)*/,
                0, 7, 2, 12/*mean (0.18312), correlation (0.433855)*/,
                -1, 2, 1, 7/*mean (0.185504), correlation (0.443838)*/,
                5, 11, 7, -9/*mean (0.185706), correlation (0.451123)*/,
                3, 5, 6, -8/*mean (0.188968), correlation (0.455808)*/,
                -13, -4, -8, 9/*mean (0.191667), correlation (0.459128)*/,
                -5, 9, -3, -3/*mean (0.193196), correlation (0.458364)*/,
                -4, -7, -3, -12/*mean (0.196536), correlation (0.455782)*/,
                6, 5, 8, 0/*mean (0.1972), correlation (0.450481)*/,
                -7, 6, -6, 12/*mean (0.199438), correlation (0.458156)*/,
                -13, 6, -5, -2/*mean (0.211224), correlation (0.449548)*/,
                1, -10, 3, 10/*mean (0.211718), correlation (0.440606)*/,
                4, 1, 8, -4/*mean (0.213034), correlation (0.443177)*/,
                -2, -2, 2, -13/*mean (0.234334), correlation (0.455304)*/,
                2, -12, 12, 12/*mean (0.235684), correlation (0.443436)*/,
                -2, -13, 0, -6/*mean (0.237674), correlation (0.452525)*/,
                4, 1, 9, 3/*mean (0.23962), correlation (0.444824)*/,
                -6, -10, -3, -5/*mean (0.248459), correlation (0.439621)*/,
                -3, -13, -1, 1/*mean (0.249505), correlation (0.456666)*/,
                7, 5, 12, -11/*mean (0.00119208), correlation (0.495466)*/,
                4, -2, 5, -7/*mean (0.00372245), correlation (0.484214)*/,
                -13, 9, -9, -5/*mean (0.00741116), correlation (0.499854)*/,
                7, 1, 8, 6/*mean (0.0208952), correlation (0.499773)*/,
                7, -8, 7, 6/*mean (0.0220085), correlation (0.501609)*/,
                -7, -4, -7, 1/*mean (0.0233806), correlation (0.496568)*/,
                -8, 11, -7, -8/*mean (0.0236505), correlation (0.489719)*/,
                -13, 6, -12, -8/*mean (0.0268781), correlation (0.503487)*/,
                2, 4, 3, 9/*mean (0.0323324), correlation (0.501938)*/,
                10, -5, 12, 3/*mean (0.0399235), correlation (0.494029)*/,
                -6, -5, -6, 7/*mean (0.0420153), correlation (0.486579)*/,
                8, -3, 9, -8/*mean (0.0548021), correlation (0.484237)*/,
                2, -12, 2, 8/*mean (0.0616622), correlation (0.496642)*/,
                -11, -2, -10, 3/*mean (0.0627755), correlation (0.498563)*/,
                -12, -13, -7, -9/*mean (0.0829622), correlation (0.495491)*/,
                -11, 0, -10, -5/*mean (0.0843342), correlation (0.487146)*/,
                5, -3, 11, 8/*mean (0.0929937), correlation (0.502315)*/,
                -2, -13, -1, 12/*mean (0.113327), correlation (0.48941)*/,
                -1, -8, 0, 9/*mean (0.132119), correlation (0.467268)*/,
                -13, -11, -12, -5/*mean (0.136269), correlation (0.498771)*/,
                -10, -2, -10, 11/*mean (0.142173), correlation (0.498714)*/,
                -3, 9, -2, -13/*mean (0.144141), correlation (0.491973)*/,
                2, -3, 3, 2/*mean (0.14892), correlation (0.500782)*/,
                -9, -13, -4, 0/*mean (0.150371), correlation (0.498211)*/,
                -4, 6, -3, -10/*mean (0.152159), correlation (0.495547)*/,
                -4, 12, -2, -7/*mean (0.156152), correlation (0.496925)*/,
                -6, -11, -4, 9/*mean (0.15749), correlation (0.499222)*/,
                6, -3, 6, 11/*mean (0.159211), correlation (0.503821)*/,
                -13, 11, -5, 5/*mean (0.162427), correlation (0.501907)*/,
                11, 11, 12, 6/*mean (0.16652), correlation (0.497632)*/,
                7, -5, 12, -2/*mean (0.169141), correlation (0.484474)*/,
                -1, 12, 0, 7/*mean (0.169456), correlation (0.495339)*/,
                -4, -8, -3, -2/*mean (0.171457), correlation (0.487251)*/,
                -7, 1, -6, 7/*mean (0.175), correlation (0.500024)*/,
                -13, -12, -8, -13/*mean (0.175866), correlation (0.497523)*/,
                -7, -2, -6, -8/*mean (0.178273), correlation (0.501854)*/,
                -8, 5, -6, -9/*mean (0.181107), correlation (0.494888)*/,
                -5, -1, -4, 5/*mean (0.190227), correlation (0.482557)*/,
                -13, 7, -8, 10/*mean (0.196739), correlation (0.496503)*/,
                1, 5, 5, -13/*mean (0.19973), correlation (0.499759)*/,
                1, 0, 10, -13/*mean (0.204465), correlation (0.49873)*/,
                9, 12, 10, -1/*mean (0.209334), correlation (0.49063)*/,
                5, -8, 10, -9/*mean (0.211134), correlation (0.503011)*/,
                -1, 11, 1, -13/*mean (0.212), correlation (0.499414)*/,
                -9, -3, -6, 2/*mean (0.212168), correlation (0.480739)*/,
                -1, -10, 1, 12/*mean (0.212731), correlation (0.502523)*/,
                -13, 1, -8, -10/*mean (0.21327), correlation (0.489786)*/,
                8, -11, 10, -6/*mean (0.214159), correlation (0.488246)*/,
                2, -13, 3, -6/*mean (0.216993), correlation (0.50287)*/,
                7, -13, 12, -9/*mean (0.223639), correlation (0.470502)*/,
                -10, -10, -5, -7/*mean (0.224089), correlation (0.500852)*/,
                -10, -8, -8, -13/*mean (0.228666), correlation (0.502629)*/,
                4, -6, 8, 5/*mean (0.22906), correlation (0.498305)*/,
                3, 12, 8, -13/*mean (0.233378), correlation (0.503825)*/,
                -4, 2, -3, -3/*mean (0.234323), correlation (0.476692)*/,
                5, -13, 10, -12/*mean (0.236392), correlation (0.475462)*/,
                4, -13, 5, -1/*mean (0.236842), correlation (0.504132)*/,
                -9, 9, -4, 3/*mean (0.236977), correlation (0.497739)*/,
                0, 3, 3, -9/*mean (0.24314), correlation (0.499398)*/,
                -12, 1, -6, 1/*mean (0.243297), correlation (0.489447)*/,
                3, 2, 4, -8/*mean (0.00155196), correlation (0.553496)*/,
                -10, -10, -10, 9/*mean (0.00239541), correlation (0.54297)*/,
                8, -13, 12, 12/*mean (0.0034413), correlation (0.544361)*/,
                -8, -12, -6, -5/*mean (0.003565), correlation (0.551225)*/,
                2, 2, 3, 7/*mean (0.00835583), correlation (0.55285)*/,
                10, 6, 11, -8/*mean (0.00885065), correlation (0.540913)*/,
                6, 8, 8, -12/*mean (0.0101552), correlation (0.551085)*/,
                -7, 10, -6, 5/*mean (0.0102227), correlation (0.533635)*/,
                -3, -9, -3, 9/*mean (0.0110211), correlation (0.543121)*/,
                -1, -13, -1, 5/*mean (0.0113473), correlation (0.550173)*/,
                -3, -7, -3, 4/*mean (0.0140913), correlation (0.554774)*/,
                -8, -2, -8, 3/*mean (0.017049), correlation (0.55461)*/,
                4, 2, 12, 12/*mean (0.01778), correlation (0.546921)*/,
                2, -5, 3, 11/*mean (0.0224022), correlation (0.549667)*/,
                6, -9, 11, -13/*mean (0.029161), correlation (0.546295)*/,
                3, -1, 7, 12/*mean (0.0303081), correlation (0.548599)*/,
                11, -1, 12, 4/*mean (0.0355151), correlation (0.523943)*/,
                -3, 0, -3, 6/*mean (0.0417904), correlation (0.543395)*/,
                4, -11, 4, 12/*mean (0.0487292), correlation (0.542818)*/,
                2, -4, 2, 1/*mean (0.0575124), correlation (0.554888)*/,
                -10, -6, -8, 1/*mean (0.0594242), correlation (0.544026)*/,
                -13, 7, -11, 1/*mean (0.0597391), correlation (0.550524)*/,
                -13, 12, -11, -13/*mean (0.0608974), correlation (0.55383)*/,
                6, 0, 11, -13/*mean (0.065126), correlation (0.552006)*/,
                0, -1, 1, 4/*mean (0.074224), correlation (0.546372)*/,
                -13, 3, -9, -2/*mean (0.0808592), correlation (0.554875)*/,
                -9, 8, -6, -3/*mean (0.0883378), correlation (0.551178)*/,
                -13, -6, -8, -2/*mean (0.0901035), correlation (0.548446)*/,
                5, -9, 8, 10/*mean (0.0949843), correlation (0.554694)*/,
                2, 7, 3, -9/*mean (0.0994152), correlation (0.550979)*/,
                -1, -6, -1, -1/*mean (0.10045), correlation (0.552714)*/,
                9, 5, 11, -2/*mean (0.100686), correlation (0.552594)*/,
                11, -3, 12, -8/*mean (0.101091), correlation (0.532394)*/,
                3, 0, 3, 5/*mean (0.101147), correlation (0.525576)*/,
                -1, 4, 0, 10/*mean (0.105263), correlation (0.531498)*/,
                3, -6, 4, 5/*mean (0.110785), correlation (0.540491)*/,
                -13, 0, -10, 5/*mean (0.112798), correlation (0.536582)*/,
                5, 8, 12, 11/*mean (0.114181), correlation (0.555793)*/,
                8, 9, 9, -6/*mean (0.117431), correlation (0.553763)*/,
                7, -4, 8, -12/*mean (0.118522), correlation (0.553452)*/,
                -10, 4, -10, 9/*mean (0.12094), correlation (0.554785)*/,
                7, 3, 12, 4/*mean (0.122582), correlation (0.555825)*/,
                9, -7, 10, -2/*mean (0.124978), correlation (0.549846)*/,
                7, 0, 12, -2/*mean (0.127002), correlation (0.537452)*/,
                -1, -6, 0, -11/*mean (0.127148), correlation (0.547401)*/
        };



//图片路径
string path1 = "../1.png";
string path2 = "../2.png";




int main()
{
    Mat first_image = imread(path1, 0);  //0表示返回一张灰度图
    Mat second_image = imread(path2, 0);  //0表示返回一张灰度图

    assert(first_image.data != nullptr && second_image.data != nullptr);  //assert()表示断言函数,条件为假则程序停止执行

    //提取FAST角点
    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    //提取first_image中的FAST角点
    vector<KeyPoint> keypoints1;
    vector<DescType> descriptor1;
    FAST(first_image, keypoints1, 40);  //40表示灰度显著性变化:要比它小40,或者比它大40。
    ComputeORB(first_image, keypoints1, descriptor1);
    //提取second_image中的FAST角点
    vector<KeyPoint> keypoints2;
    vector<DescType> descriptor2;
    FAST(second_image, keypoints2, 40);  //40表示灰度显著性变化:要比它小40,或者比它大40。
    ComputeORB(second_image, keypoints2, descriptor2);
    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>> (t2 - t1);
    cout << "提取两张图片上的FAST角点所花费的时间为" << time_used.count() << "秒!" << endl;


    //匹配两个描述子集合
    vector<DMatch> matches;
    t1 = chrono::steady_clock::now();
    BfMatch(descriptor1, descriptor2, matches);
    t2 = chrono::steady_clock::now();
    time_used = chrono::duration_cast<chrono::duration<double>> (t2 - t1);
    cout << "匹配两张图像上的描述子所花费的时间为" << time_used.count() << "秒!" << endl;
    cout << "匹配点对数目为" << matches.size() << "!" << endl;


    //画出匹配图像
    Mat image_show;
    drawMatches(first_image, keypoints1, second_image, keypoints2, matches, image_show);
    imshow("匹配图像", image_show);
    imwrite("matches.png", image_show);  //将匹配图像存储为matches.png
    waitKey(0);



    cout << "程序执行完毕!" << endl;
    return 0;
}




//主要包括两件事:(1)计算角点的方向;(2)计算描述子。
void ComputeORB(const Mat& img, vector<KeyPoint>& keypoints, vector<DescType>& descriptors)
{
    const int half_patch_size = 8;  //计算特征点方向时,选取的图像块,16*16
    const int half_boundary = 16;  //猜测是在计算描述子时在32*32的图像块中选点
    int bad_points = 0;  //计算描述子时,在32*32的区域块选择两个点比较,所选择的点超出图像范围的。出现这种情况下的FAST角点的数目。
    //遍历所有FAST角点
    for(auto &kp : keypoints)
    {
        //超出图像边界的角点的描述子设为空!
        if(kp.pt.x < half_boundary || kp.pt.y < half_boundary || kp.pt.x >= img.cols - half_boundary || kp.pt.y >= img.rows - half_boundary)
        {
            bad_points++;
            descriptors.push_back({});  //bad_points的描述子设为空
            continue;
        }
        //计算16*16图像块的灰度质心
        float m01 = 0, m10 = 0;
        for(int dx = -half_patch_size; dx < half_patch_size; ++dx)
            for(int dy = -half_patch_size; dy < half_patch_size; ++dy)
            {
                uchar pixel = img.at<uchar>(kp.pt.y + dy, kp.pt.x + dx);  //pixel表示灰度值
                m10 += dx * pixel;  //书中配套代码在此处写错了,已更正;m10对应的是dx。
                m01 += dy * pixel;  //书中配套代码在此处写错了,已更正;m01对应的是dy。
            }
        //计算角点的三角函数值
        float m_sqrt = sqrt(m10 * m10 + m01 * m01) + 1e-18;  //1e-18避免了m_sqrt的值为0(图像块全黑)
        float sin_theta = m01 / m_sqrt;
        float cos_theta = m10 / m_sqrt;

        //计算描述子
        DescType desc(8, 0);  //8个元素,它们的值初始化为0
        for(int i = 0;  i < 8; i++)
        {
            unsigned int d = 0;
            for(int k = 0; k < 32; k++)
            {
                int idx_pq = i * 8 + k;  //idx_pq表示二进制描述子中的第几位
                Point2f p(ORB_pattern[idx_pq * 4], ORB_pattern[idx_pq * 4 + 1]);
                Point2f q(ORB_pattern[idx_pq * 4 + 2], ORB_pattern[idx_pq * 4 +3]);

                //p,q绕原点旋转theta得到pp,qq
                Point2f pp = Point2f(cos_theta * p.x - sin_theta * p.y, sin_theta * p.x + cos_theta * p.y) + kp.pt;  //以kp.pt为原点
                Point2f qq = Point2f(cos_theta * q.x - sin_theta * q.y, sin_theta * q.x + cos_theta * q.y) + kp.pt;  //以kp.pt为原点

                if(img.at<uchar>(pp.y, pp.x) < img.at<uchar>(qq.y, qq.x))
                    d |= 1 << k;
            }

            desc[i] = d;
        }

        descriptors.push_back(desc);  //desc表示该Oriented_FAST角点的描述子
    }

    cout << "FAST角点总共有" << keypoints.size() << "个,其中计算描述子时超过边界的点有" << bad_points << "个!" << endl;
}


//暴力匹配
void BfMatch(const vector<DescType>& desc1, const vector<DescType>& desc2, vector<DMatch>& matches)
{
    const int d_max = 40;  //描述子之间的距离小于这个值,才被认为是正确匹配

    for(size_t i1 = 0; i1 < desc1.size(); i1++)  //size_t相当于int,便于代码移植
    {
        if(desc1[i1].empty()) continue;
        DMatch m{i1, 0, 256};  //定义了一个匹配对m
        for(size_t i2 = 0; i2 < desc2.size(); i2++)
        {
            if(desc2[i2].empty()) continue;
            int distance = 0;
            for(int k = 0; k < 8; k++)  //计算描述子desc1[i1]和描述子desc2[i2]的距离,即不同位数的数目
                distance += _mm_popcnt_u32(desc1[i1][k] ^ desc2[i2][k]);


            if(distance < d_max && distance < m.distance)
            {
                m.distance = distance;
                m.trainIdx = i2;
            }
        }
        if(m.distance < d_max)
            matches.push_back(m);  //可能m.distance一次也没有更新
    }
}

  CMakeLists.txt文件内容如下,

add_definitions("-DENABLE_SSE")  #SSE指令集相关设置
set(CMAKE_CXX_FLAGS "${SSE_FLAGS} -msse4")  #SSE指令集相关设置

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_DIRECTORIES})

add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBRARIES})

  展示结果如下,

FAST角点总共有638个,其中计算描述子时超过边界的点有43个!
FAST角点总共有595个,其中计算描述子时超过边界的点有8个!
提取两张图片上的FAST角点所花费的时间为0.0241697秒!
匹配两张图像上的描述子所花费的时间为0.0308529秒!
匹配点对数目为43!
程序执行完毕!

在这里插入图片描述

3 对极约束求解相机运动

3.1 解题思路

  有图像1和图像2,并且两图像进行了特征提取和特征匹配,求图像1到图像2的变换矩阵?
  解答如下,
  由于只有特征点层信息,且只有两帧,该情况下是无法获得深度信息的,因此只能通过对极几何求解出真实的旋转矩阵和尺度的平移向量。所谓的“尺度的平移向量”是指与真实的平移向量差了一个尺度倍数。
  一般的解题步骤为:1)根据匹配特征点对和相机内参计算出本质矩阵 E E E;2)从本质矩阵 E E E中恢复出旋转矩阵 R R R和平移向量 t t t。注意,其中的 t t t是带有尺度不确定性的。

3.2 对极约束

  对极几何或极线约束是指:1)对于图像1中的特征点 p 1 ( u 1 , v 1 ) p_1(u_1, v_1) p1(u1,v1)及其在图像2中的对应点 p 2 ( u 2 , v 2 ) p_2(u_2,v_2) p2(u2,v2),它们满足,
[ u 2 v 2 1 ] F [ u 1 v 1 1 ] = 0 \left[ \begin{matrix} u_2 \\ v_2 \\ 1 \end{matrix} \right] F \left[ \begin{matrix} u_1 & v_1 & 1 \end{matrix} \right]=0 u2v21F[u1v11]=0
其中3 * 3维矩阵 F F F被称为基础矩阵。
2)对于图像1中特征点 p 1 p_1 p1在相机的归一化平面上坐标 ( X 1 / Z 1 , Y 1 / Z 1 ) (X_1/Z_1,Y_1/Z_1) (X1/Z1,Y1/Z1)及其图像2中特征点 p 2 p_2 p2在相机的归一化平面上坐标 ( X 2 / Z 2 , Y 2 / Z 2 ) (X_2/Z_2,Y_2/Z_2) (X2/Z2,Y2/Z2),它们满足,
[ X 2 / Z 2 Y 2 / Z 2 1 ] E [ X 2 / Z 2 Y 2 / Z 2 1 ] = 0 \left[ \begin{matrix} X_2/Z_2 \\ Y_2/Z_2 \\ 1 \end{matrix} \right] E \left[ \begin{matrix} X_2/Z_2 & Y_2/Z_2 & 1 \end{matrix} \right] = 0 X2/Z2Y2/Z21E[X2/Z2Y2/Z21]=0
其中3 * 3矩阵E被称为本质矩阵。
  1)或2)被称为对极约束或极线约束。

3.3 矩阵介绍

  基础矩阵 F F F满足,
F = K − T E K − 1 F=K^{-T}EK^{-1} F=KTEK1
其中矩阵 K K K为相机内参矩阵。
  本质矩阵 E E E满足,
E = t × R = [ 0 − t 3 t 2 t 3 0 − t 1 − t 2 t 1 0 ] R E=t \times R=\left[ \begin{matrix} 0 & -t_3 & t_2 \\ t_3 & 0 & -t_1 \\ -t_2 & t_1 & 0 \end{matrix} \right ]R E=t×R=0t3t2t30t1t2t10R

其中第1个矩阵为平移向量 t t t的反对称矩阵。
  单应矩阵 H H H介绍如下。当场景中的特征点都落在同一平面上时,对于图像1中的特征点 p 1 ( u 1 , v 1 ) p_1(u_1,v_1) p1(u1,v1)和图像2中相应的特征点 p 2 ( u 2 , v 2 ) p_2(u_2,v_2) p2(u2,v2),有,
[ u 2 v 2 1 ] × H [ u 1 v 1 1 ] = [ 0 0 0 ] \left[ \begin{matrix} u_2 \\ v_2 \\ 1 \end{matrix} \right] \times H \left[ \begin{matrix} u_1 \\ v_1 \\ 1 \end{matrix} \right] = \left[ \begin{matrix} 0 \\ 0 \\ 0 \end{matrix} \right] u2v21×Hu1v11=000
其中 × \times ×表示叉乘。3 * 3维单应矩阵 H H H满足,
H = K ( R − t n T d ) K − 1 H=K(R-\frac{tn^T}{d})K^{-1} H=K(RdtnT)K1
其中 K K K为相机内参矩阵, n n n d d d为平面参数, R R R为待求的旋转矩阵, t t t为待求的平移向量。

3.4 代码内容

  cpp文件内容如下,

#include <iostream>
#include <chrono>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/calib3d/calib3d.hpp>

using namespace std;
using namespace cv;

//输入图像1和图像2,输出特征点集合1、特征点集合2和匹配点对
void find_feature_matches(const Mat& img1, const Mat& img2, vector<KeyPoint>& keypoints1, vector<KeyPoint>& keypoints2, vector<DMatch>& matches);
//输入特征点集合1、特征点集合2和匹配点对,输出估计的旋转矩阵、估计的平移向量和本质矩阵,记住平移向量差了一个尺度因子
void pose_estimation_2d2d(vector<KeyPoint> keypoints1, vector<KeyPoint> keypoints2, vector<DMatch> matches, Mat& R, Mat& t, Mat& E);
//输出一个像素点和相机内参矩阵,输出该像素点在归一化平面上的坐标
Point2d pixel2cam(const Point2d& p, const Mat& K);

//图像路径
string path1 = "../1.png";
string path2 = "../2.png";

int main()
{
    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();  //计时开始

    //读取图像
    Mat img1 = imread(path1, CV_LOAD_IMAGE_COLOR);
    Mat img2 = imread(path2, CV_LOAD_IMAGE_COLOR);

    assert(img1.data && img2.data);  //assert()为断言函数,条件为假则停止执行

    //特征提取和特征匹配
    vector<KeyPoint> keypoints1, keypoints2;
    vector<DMatch> matches;
    find_feature_matches(img1, img2, keypoints1, keypoints2, matches);
    cout << "一共找到了" << matches.size() << "组匹配点!" << endl;

    //估计两张图像间的运动
    Mat R, t;
    Mat E;
    pose_estimation_2d2d(keypoints1, keypoints2, matches, R, t, E);

    //验证E = t^R * scale
    Mat t_x = (Mat_<double>(3, 3) << 0, -t.at<double>(2, 0), t.at<double>(1, 0),
                                                 t.at<double>(2, 0), 0, -t.at<double>(0, 0),
                                                 -t.at<double>(1, 0), t.at<double>(0, 0), 0);
    //Mat_<double>(3, 3) << ...表示opencv中的初始化方法
    Mat E1 = t_x * R;
    cout << "t^R = \n" << E1 << endl;

    //求解scale的大小
    double scale = 0;
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
        {
            double tmp1 = E.at<double>(i, j) / E1.at<double>(i, j);
            scale += tmp1;
        }
    scale /= 9;
    cout << "尺度scale等于" << scale << "!" << endl;
    Mat residual = E1 * scale - E;
    cout << "t^R*scale-E的残差为:\n" << residual << endl;

    //验证关于E的对极约束
    Mat K = (Mat_<double>(3, 3) << 520.9, 0, 325.1, 0, 521.0, 249.7, 0, 0, 1);  //相机内参矩阵
    for(int i = 0; i < matches.size(); i++)
    {
        DMatch m = matches[i];
        Point2d pt1 = pixel2cam(keypoints1[m.queryIdx].pt, K);
        Mat y1 = (Mat_<double>(3, 1) << pt1.x, pt1.y, 1);
        Point2d pt2 = pixel2cam(keypoints2[m.trainIdx].pt, K);
        Mat y2 = (Mat_<double>(3, 1) << pt2.x, pt2.y, 1);
        Mat d = y2.t() * E * y1;  //对极几何的残差,结果应该为标量0
        cout << "第" << i << "个匹配点对的对极几何残差为" << d << "!" << endl;

    }

    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>> (t2- t1);
    cout << "执行程序所花的时间为" << time_used.count() << "秒!" << endl;

    return 0;
}


void find_feature_matches(const Mat& img1, const Mat& img2, vector<KeyPoint>& keypoints1, vector<KeyPoint>& keypoints2, vector<DMatch>& matches)
{
    //构建ORB提取器
    Ptr<ORB> ptrORB = ORB::create(1000, 1.2, 8);

    //提取特征点
    ptrORB->detect(img1, keypoints1);
    ptrORB->detect(img2, keypoints2);

    //计算描述子
    Mat desc1, desc2;
    ptrORB->compute(img1, keypoints1, desc1);
    ptrORB->compute(img2, keypoints2, desc2);

    //特征匹配
    vector<DMatch> matches1;
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
    matcher->match(desc1, desc2, matches1);

    //排除误匹配
    float mindist = 196;  //求最小距离
    for(int i = 0; i < matches1.size(); i++)
        mindist = min(mindist, matches1[i].distance);
    for(int i = 0; i < matches1.size(); i++)  //遍历所有匹配,排除误匹配
    {
        float threshold = max(30.0f, 2 * mindist);
        if(matches1[i].distance <= threshold)
            matches.push_back(matches1[i]);
    }

    //显示匹配图
    Mat img_match;
    drawMatches(img1, keypoints1, img2, keypoints2, matches, img_match, Scalar::all(-1));
    imshow("匹配图像", img_match);
    waitKey(0);  //程序暂停执行,等待一个按键输入

}


Point2d pixel2cam(const Point2d& p, const Mat& K)
{
    Point2d q;
    q.x = (p.x - K.at<double>(0, 2)) / K.at<double>(0, 0);
    q.y = (p.y - K.at<double>(1, 2)) / K.at<double>(1, 1);
    return q;
}



void pose_estimation_2d2d(vector<KeyPoint> keypoints1, vector<KeyPoint> keypoints2, vector<DMatch> matches, Mat& R, Mat& t, Mat& E)
{
    //相机内参矩阵
    Mat K = (Mat_<double>(3, 3) << 520.9, 0, 325.1, 0, 521.0, 249.7, 0, 0, 1);

    //计算匹配点集vector<Point2f>
    vector<Point2f> points1, points2;
    for(int i = 0; i < matches.size(); i++)
    {
        points1.push_back(keypoints1[matches[i].queryIdx].pt);
        points2.push_back(keypoints2[matches[i].trainIdx].pt);
    }

    //计算基础矩阵
    Mat F;
    F = findFundamentalMat(points1, points2, CV_FM_8POINT);  //采用8点法求解F
    cout << "基础矩阵F为:\n" << F << endl;

    //计算本质矩阵E
    Point2d optic_center(325.1, 249.7);
    double focal_length = 521;
    E = findEssentialMat(points1, points2, focal_length, optic_center);
    cout << "本质矩阵E为:\n" << E << endl;

    //计算单应矩阵,本例场景中不是平面,意义不大
    Mat H;
    H = findHomography(points1, points2, RANSAC, 3);
    cout << "单应矩阵H为:\n" << H << endl;

    //从本质矩阵E中恢复旋转矩阵R和平移向量t
    recoverPose(E, points1, points2, R, t, focal_length, optic_center);
    cout << "旋转矩阵R等于:\n" << R << endl;
    cout << "平移向量t等于:\n" << t << endl;

}


  CMakeLists.txt文件内容如下,

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_DIRECTORIES})

add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBRARIES})

  程序运行结果如下,

一共找到了180组匹配点!
基础矩阵F为:
[4.386856100159475e-06, 0.0001131844941242232, -0.01490353654586843;
 -0.0001058195667557915, 1.390729895576112e-05, -0.04871704234033722;
 0.01594265341691711, 0.04052124684912396, 1]
本质矩阵E为:
[0.01491038555093828, 0.3164685158686645, 0.05864557708815913;
 -0.2988064809623225, 0.03300253381801869, -0.6380689446371188;
 -0.01739168162936821, 0.6309717103680531, 0.01586905372406568]
单应矩阵H为:
[1.068235902247163, -0.07430303707691538, 10.45663436382183;
 0.06435164168405785, 1.175169581502872, -22.404650037132;
 2.439237115396229e-05, 0.0004300779029334956, 1]
旋转矩阵R等于:
[0.998216646204992, -0.05234786537500747, 0.02869195409759479;
 0.05156169716945402, 0.9982914436791046, 0.0274879039232722;
 -0.03008186537207896, -0.02595947741711402, 0.9992102816264284]
平移向量t等于:
[-0.8901528578335342;
 -0.07061928328971975;
 0.4501564244997935]
t^R = 
[-0.02108646946634849, -0.4475540672055504, -0.08293737049127148;
 0.4225761779018948, -0.04667263091811903, 0.9023657552349013;
 0.02459555203272754, -0.8923287502762492, -0.02244223099860069]
尺度scale等于-0.707107!
t^R*scale-E的残差为:
[-1.52655665885959e-16, 5.551115123125783e-16, 9.71445146547012e-17;
 -7.216449660063518e-16, 2.567390744445674e-16, -1.332267629550188e-15;
 -4.510281037539698e-17, 1.221245327087672e-15, -1.665334536937735e-16]0个匹配点对的对极几何残差为[-0.001506019422442884]!
第1个匹配点对的对极几何残差为[0.000776454391657945]!
第2个匹配点对的对极几何残差为[-0.0005108711178478942]!
第3个匹配点对的对极几何残差为[0.001311618194128145]!
第4个匹配点对的对极几何残差为[-0.0008171574947269389]!
第5个匹配点对的对极几何残差为[-0.000268297578110914]!
第6个匹配点对的对极几何残差为[-3.227928753568587e-06]!
第7个匹配点对的对极几何残差为[-0.000188596766501993]!
第8个匹配点对的对极几何残差为[-0.0004643536354706213]!
第9个匹配点对的对极几何残差为[-0.0004639731221603577]!
第10个匹配点对的对极几何残差为[-0.0003106719489033988]!
第11个匹配点对的对极几何残差为[-0.001484084504745103]!
第12个匹配点对的对极几何残差为[-0.001017319559735552]!
第13个匹配点对的对极几何残差为[-0.00081023584521955]!
第14个匹配点对的对极几何残差为[-0.0003440495392492554]!
第15个匹配点对的对极几何残差为[-0.0006407131479070349]!
第16个匹配点对的对极几何残差为[-0.001032177630001831]!
第17个匹配点对的对极几何残差为[-0.0004602070144889038]!
第18个匹配点对的对极几何残差为[-0.0008058121642220972]!
第19个匹配点对的对极几何残差为[-4.299293447362906e-05]!
第20个匹配点对的对极几何残差为[0.0006600782786950962]!
第21个匹配点对的对极几何残差为[0.0002117361221107561]!
第22个匹配点对的对极几何残差为[-0.0004581867662531158]!
第23个匹配点对的对极几何残差为[-0.001134842591743609]!
第24个匹配点对的对极几何残差为[-0.0009736711670648365]!
第25个匹配点对的对极几何残差为[-0.000207876999331294]!
第26个匹配点对的对极几何残差为[1.855704756399679e-05]!
第27个匹配点对的对极几何残差为[-0.001852276609267067]!
第28个匹配点对的对极几何残差为[-0.0005209047315820337]!
第29个匹配点对的对极几何残差为[-0.0001855524875550574]!
第30个匹配点对的对极几何残差为[0.0009588889406586115]!
第31个匹配点对的对极几何残差为[-0.001281392201347209]!
第32个匹配点对的对极几何残差为[-0.0006978420446343281]!
第33个匹配点对的对极几何残差为[0.0009701117270825566]!
第34个匹配点对的对极几何残差为[-0.001127365565799732]!
第35个匹配点对的对极几何残差为[-0.0004852080097565437]!
第36个匹配点对的对极几何残差为[-0.0009677409761675165]!
第37个匹配点对的对极几何残差为[7.116325500341331e-05]!
第38个匹配点对的对极几何残差为[-0.001265764587868375]!
第39个匹配点对的对极几何残差为[-4.81155365459271e-05]!
第40个匹配点对的对极几何残差为[-0.003090996800382551]!
第41个匹配点对的对极几何残差为[-0.001617914149744812]!
第42个匹配点对的对极几何残差为[-0.002193797752864352]!
第43个匹配点对的对极几何残差为[-8.168132845169651e-05]!
第44个匹配点对的对极几何残差为[-0.0002080639291066819]!
第45个匹配点对的对极几何残差为[-0.0006190718459955363]!
第46个匹配点对的对极几何残差为[1.215208934909895e-06]!
第47个匹配点对的对极几何残差为[-0.0004386171717076105]!
第48个匹配点对的对极几何残差为[0.0001097844498145484]!
第49个匹配点对的对极几何残差为[-0.0009795824870687114]!
第50个匹配点对的对极几何残差为[-2.456292744168129e-05]!
第51个匹配点对的对极几何残差为[-0.0004322674676274021]!
第52个匹配点对的对极几何残差为[-0.0002985708616612022]!
第53个匹配点对的对极几何残差为[-0.0003206753392596441]!
第54个匹配点对的对极几何残差为[0.000200876451211876]!
第55个匹配点对的对极几何残差为[-8.746054590219599e-05]!
第56个匹配点对的对极几何残差为[-0.001389202915006521]!
第57个匹配点对的对极几何残差为[-0.0002778347123136987]!
第58个匹配点对的对极几何残差为[-8.852173524614287e-05]!
第59个匹配点对的对极几何残差为[1.026061645525642e-05]!
第60个匹配点对的对极几何残差为[4.824901115845805e-05]!
第61个匹配点对的对极几何残差为[0.00152158106021151]!
第62个匹配点对的对极几何残差为[-7.303455012291904e-07]!
第63个匹配点对的对极几何残差为[-0.0001662789189254138]!
第64个匹配点对的对极几何残差为[-0.001941397924256308]!
第65个匹配点对的对极几何残差为[0.0007076665182703112]!
第66个匹配点对的对极几何残差为[-0.0001307475098468597]!
第67个匹配点对的对极几何残差为[-0.001222769585927236]!
第68个匹配点对的对极几何残差为[-0.001084820933092062]!
第69个匹配点对的对极几何残差为[-0.001159826015844179]!
第70个匹配点对的对极几何残差为[9.038577290892275e-05]!
第71个匹配点对的对极几何残差为[0.0002942204148855578]!
第72个匹配点对的对极几何残差为[-0.0008794393334248252]!
第73个匹配点对的对极几何残差为[-0.0008165486797965388]!
第74个匹配点对的对极几何残差为[3.639405178041191e-05]!
第75个匹配点对的对极几何残差为[-0.002114766887153365]!
第76个匹配点对的对极几何残差为[0.0003137842023573645]!
第77个匹配点对的对极几何残差为[-0.0009956100069476032]!
第78个匹配点对的对极几何残差为[-0.0008253229728147089]!
第79个匹配点对的对极几何残差为[-0.0006310926288580904]!
第80个匹配点对的对极几何残差为[0.0006867897977901744]!
第81个匹配点对的对极几何残差为[0.001747759386758557]!
第82个匹配点对的对极几何残差为[-0.0006041683141248325]!
第83个匹配点对的对极几何残差为[-0.0003764138369930434]!
第84个匹配点对的对极几何残差为[-0.002285819379046913]!
第85个匹配点对的对极几何残差为[-0.001121759923751367]!
第86个匹配点对的对极几何残差为[-0.0007640793282955305]!
第87个匹配点对的对极几何残差为[0.001656642739730631]!
第88个匹配点对的对极几何残差为[0.0005427542994107665]!
第89个匹配点对的对极几何残差为[8.35175582895864e-05]!
第90个匹配点对的对极几何残差为[0.0001794974277416136]!
第91个匹配点对的对极几何残差为[-0.001473791136198652]!
第92个匹配点对的对极几何残差为[-0.002258799201270173]!
第93个匹配点对的对极几何残差为[-0.001151026480866291]!
第94个匹配点对的对极几何残差为[-0.0009264920844357753]!
第95个匹配点对的对极几何残差为[-0.001068324267359796]!
第96个匹配点对的对极几何残差为[0.0007620749130448079]!
第97个匹配点对的对极几何残差为[0.0002344251453102256]!
第98个匹配点对的对极几何残差为[-0.001090292448970437]!
第99个匹配点对的对极几何残差为[0.001219508634357352]!
第100个匹配点对的对极几何残差为[-0.002815697728243166]!
第101个匹配点对的对极几何残差为[-0.001499527619462059]!
第102个匹配点对的对极几何残差为[0.001119654265756522]!
第103个匹配点对的对极几何残差为[0.0005032934196459726]!
第104个匹配点对的对极几何残差为[0.0005033258497348925]!
第105个匹配点对的对极几何残差为[8.681222596722965e-05]!
第106个匹配点对的对极几何残差为[0.0007583903918401969]!
第107个匹配点对的对极几何残差为[7.828918685647002e-05]!
第108个匹配点对的对极几何残差为[-0.0006964835899778681]!
第109个匹配点对的对极几何残差为[-0.001007390027720968]!
第110个匹配点对的对极几何残差为[-0.001615116566298709]!
第111个匹配点对的对极几何残差为[-0.0001134366992352753]!
第112个匹配点对的对极几何残差为[-0.000232168707927756]!
第113个匹配点对的对极几何残差为[-0.002176301161276425]!
第114个匹配点对的对极几何残差为[0.0003074105164388996]!
第115个匹配点对的对极几何残差为[8.588118765837094e-05]!
第116个匹配点对的对极几何残差为[0.001453978512518911]!
第117个匹配点对的对极几何残差为[-0.0001404422216680738]!
第118个匹配点对的对极几何残差为[-0.0001282001507610653]!
第119个匹配点对的对极几何残差为[-0.001266864260013434]!
第120个匹配点对的对极几何残差为[-0.0002272025451245281]!
第121个匹配点对的对极几何残差为[-0.0005109227552549788]!
第122个匹配点对的对极几何残差为[0.002069690309990754]!
第123个匹配点对的对极几何残差为[-0.0009132810352549328]!
第124个匹配点对的对极几何残差为[-0.00021849912591132]!
第125个匹配点对的对极几何残差为[0.0009196460168504929]!
第126个匹配点对的对极几何残差为[-0.00123813280887872]!
第127个匹配点对的对极几何残差为[0.0004936566623374994]!
第128个匹配点对的对极几何残差为[0.0003827333425753879]!
第129个匹配点对的对极几何残差为[0.001342229072097009]!
第130个匹配点对的对极几何残差为[0.0001037262713292353]!
第131个匹配点对的对极几何残差为[2.739938401580266e-07]!
第132个匹配点对的对极几何残差为[0.000579350136389177]!
第133个匹配点对的对极几何残差为[-0.001395999670636056]!
第134个匹配点对的对极几何残差为[0.001162444839521548]!
第135个匹配点对的对极几何残差为[-0.002205764122642492]!
第136个匹配点对的对极几何残差为[0.002672086673905338]!
第137个匹配点对的对极几何残差为[-0.002049459301424965]!
第138个匹配点对的对极几何残差为[-0.0006042619269245961]!
第139个匹配点对的对极几何残差为[-0.001988535805259622]!
第140个匹配点对的对极几何残差为[-0.001347457323443928]!
第141个匹配点对的对极几何残差为[0.0003645806786053973]!
第142个匹配点对的对极几何残差为[0.003745427864737388]!
第143个匹配点对的对极几何残差为[-0.0008421645878944062]!
第144个匹配点对的对极几何残差为[-0.000516328925855878]!
第145个匹配点对的对极几何残差为[-0.002531723782175893]!
第146个匹配点对的对极几何残差为[-0.0019888878929957]!
第147个匹配点对的对极几何残差为[0.0004149523467164469]!
第148个匹配点对的对极几何残差为[0.0005211392618580044]!
第149个匹配点对的对极几何残差为[-9.282888437453507e-05]!
第150个匹配点对的对极几何残差为[-0.002418012558306634]!
第151个匹配点对的对极几何残差为[0.0004358532246863077]!
第152个匹配点对的对极几何残差为[0.003021217426489732]!
第153个匹配点对的对极几何残差为[-0.0001243394195238265]!
第154个匹配点对的对极几何残差为[-1.078722346462002e-06]!
第155个匹配点对的对极几何残差为[-0.000653301394161504]!
第156个匹配点对的对极几何残差为[0.001971605524172259]!
第157个匹配点对的对极几何残差为[-0.00353304898602913]!
第158个匹配点对的对极几何残差为[-0.002311568398967623]!
第159个匹配点对的对极几何残差为[0.0001055549114633569]!
第160个匹配点对的对极几何残差为[0.0004196519320216474]!
第161个匹配点对的对极几何残差为[0.0003124146670598904]!
第162个匹配点对的对极几何残差为[-0.003865163572264206]!
第163个匹配点对的对极几何残差为[-0.001848091924202017]!
第164个匹配点对的对极几何残差为[-0.001313254998307617]!
第165个匹配点对的对极几何残差为[-0.001931476026839601]!
第166个匹配点对的对极几何残差为[-0.000400438931902905]!
第167个匹配点对的对极几何残差为[0.003472811184259558]!
第168个匹配点对的对极几何残差为[-0.001907548868845288]!
第169个匹配点对的对极几何残差为[-0.001207468257755523]!
第170个匹配点对的对极几何残差为[-0.003733667449430191]!
第171个匹配点对的对极几何残差为[0.0004494485832622803]!
第172个匹配点对的对极几何残差为[0.003146140011376006]!
第173个匹配点对的对极几何残差为[-0.003992753772868198]!
第174个匹配点对的对极几何残差为[9.725258224348166e-05]!
第175个匹配点对的对极几何残差为[0.0002214460481441971]!
第176个匹配点对的对极几何残差为[0.00198045834192094]!
第177个匹配点对的对极几何残差为[0.003223448211827535]!
第178个匹配点对的对极几何残差为[0.001790867412546332]!
第179个匹配点对的对极几何残差为[-0.003865163572264206]!
执行程序所花的时间为1.04588秒!

在这里插入图片描述

4 三角测量

  图像1和图像2进行了特征匹配,通过OpenCV中的函数FindEssentialMat()求得本质矩阵 E E E,然后通过函数recoverPose()恢复出从图像1到图像2的真实的旋转矩阵 R R R和归一化的平移向量 t t t。利用triangulatePoints()函数求解出特征点集在相机1的相机坐标系下的坐标值,以真实的平移大小作为尺度1。
  cpp文件为,

#include <iostream>
#include <chrono>
#include <opencv2/opencv.hpp>


using namespace std;
using namespace cv;

void find_feature_matches(Mat img1, Mat img2, vector<KeyPoint>& keypoints1, vector<KeyPoint>& keypoints2, vector<DMatch>& matches);
void pose_estimation_2d2d(vector<KeyPoint> keypoints1, vector<KeyPoint> keypoints2, vector<DMatch> matches, Mat& R, Mat& t);
void triangulation(vector<KeyPoint> keypoints1, vector<KeyPoint> keypoints2, vector<DMatch> matches, Mat R, Mat t, vector<Point3d>& landmarks);

//输入深度,返回颜色信息
//inline表示内联函数,解决了因频繁调用小函数而导致大量消耗栈空间的问题
inline Scalar get_color(float depth)
{
    float up_th = 50, low_th = 10, th_range = up_th - low_th;
    if(depth > up_th) depth = up_th;
    if(depth < low_th) depth = low_th;
    return Scalar(0, 0, 255 * depth / th_range);  //Scalar()中的颜色顺序为BGR,即蓝绿红
    //越远的像素点颜色越红
}

//像素坐标转归一化平面坐标
Point2f pixel2cam(Point2f p);

//相机内参矩阵
Mat K = (Mat_<double>(3, 3) << 520.9, 0, 325.1, 0, 521.0, 249.7, 0, 0, 1);

//图片路径
string path1 = "../1.png";
string path2 = "../2.png";

int main()
{
    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();

    //读取图像
    Mat img1 = imread(path1, IMREAD_COLOR);  //IMREAD_COLOR表示返回一张彩色图
    Mat img2 = imread(path2, IMREAD_COLOR);  //IMREAD_COLOR表示返回一张彩色图

    //特征匹配
    vector<KeyPoint> keypoints1, keypoints2;
    vector<DMatch> matches;
    find_feature_matches(img1, img2, keypoints1, keypoints2, matches);
    cout << "特征点对的数目为:" << matches.size() << "!" << endl;

    //估计两张图像间的运动
    Mat R, t;
    pose_estimation_2d2d(keypoints1, keypoints2, matches, R, t);

    //三角化,得到特征点在相机1的相机坐标系下的坐标
    vector<Point3d> landmarks;  //相机1中的特征点在其相机坐标系中的坐标
    triangulation(keypoints1, keypoints2, matches, R, t, landmarks);

    //验证三角化点与特征点的重投影关系
    Mat img1_plot = img1.clone();
    Mat img2_plot = img2.clone();
    for(int i = 0; i < matches.size(); i++)
    {
        //图像1中点的深度
        Point3d landmark1 = landmarks[i];
        float depth1 = landmark1.z;  //深度信息
        Point2f pixel1 = keypoints1[matches[i].queryIdx].pt;
        circle(img1_plot, pixel1, 2, get_color(depth1), 2);  //画圆
        Mat tmp1 = K * (Mat_<double>(3, 1) << landmark1.x / landmark1.z, landmark1.y / landmark1.z, 1);  //tmp1表示的是(u, v, 1)
        Point2f residual1;
        residual1.x = tmp1.at<double>(0, 0) - pixel1.x;
        residual1.y = tmp1.at<double>(1, 0) - pixel1.y;
        cout << "当i等于" << i << "时:图像1中像素点的深度为" << depth1 << "平移单位,残差为(" << residual1.x << ", " << residual1.y << ")像素单位; ";


        //图像2中点的深度
        Mat landmark2 = R * (Mat_<double>(3, 1) << landmark1.x, landmark1.y, landmark1.z) + t;
        float depth2 = landmark2.at<double>(2, 0);  //深度信息
        Point2f pixel2 = keypoints2[matches[i].trainIdx].pt;
        circle(img2_plot, pixel2, 2, get_color(depth2), 2);  //画圆
        Mat tmp2 = K * landmark2 / landmark2.at<double>(2, 0);  //tmp2表示的是(u, v, 1)
        Point2f residual2;
        residual2.x = tmp2.at<double>(0, 0) - pixel2.x;
        residual2.y = tmp2.at<double>(1, 0) - pixel2.y;
        cout << "图像2中对应像素点的深度为" << depth2 << "平移单位,残差为(" << residual2.x << ", " << residual2.y << ")像素单位! " << endl;
    }

    imshow("图像1中点的深度", img1_plot);
    imshow("图像2中点的深度", img2_plot);
    waitKey(0);

    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>> (t2 - t1);
    cout << "执行程序所花费的时间为:" << time_used.count() << "秒!" << endl;
    return 0;
}


void find_feature_matches(Mat img1, Mat img2, vector<KeyPoint>& keypoints1, vector<KeyPoint>& keypoints2, vector<DMatch>& matches)
{
    //定义ORB特征点提取器
    Ptr<ORB> ptrORB = ORB::create(1000, 1.2, 8);

    //提取特征点
    ptrORB->detect(img1, keypoints1);
    ptrORB->detect(img2, keypoints2);

    //计算描述子
    Mat desc1, desc2;
    ptrORB->compute(img1, keypoints1, desc1);
    ptrORB->compute(img2, keypoints2, desc2);

    //特征匹配
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
    vector<DMatch> matches1;
    matcher->match(desc1, desc2, matches1);

    //排除误匹配
    float mindist = 196;
    for(auto m : matches1) mindist = min(mindist, m.distance);
    float threshold = max(30.0f, 2 * mindist);
    for(auto m : matches1)
        if(m.distance <= threshold)
            matches.push_back(m);

}


void pose_estimation_2d2d(vector<KeyPoint> keypoints1, vector<KeyPoint> keypoints2, vector<DMatch> matches, Mat& R, Mat& t)
{
    vector<Point2f> points1, points2;  //像素点,为了配合findEssentialMat()函数输入参数
    for(auto m : matches)
    {
        points1.push_back(keypoints1[m.queryIdx].pt);
        points2.push_back(keypoints2[m.trainIdx].pt);
    }

    Point2d optic_center(K.at<double>(0, 2), K.at<double>(1, 2));
    double focal_length = K.at<double>(1, 1);
    Mat E;
    E = findEssentialMat(points1, points2, focal_length, optic_center);

    recoverPose(E, points1, points2, R, t, focal_length, optic_center);
}


void triangulation(vector<KeyPoint> keypoints1, vector<KeyPoint> keypoints2, vector<DMatch> matches, Mat R, Mat t, vector<Point3d>& landmarks)
{
    Mat T1 = (Mat_<double>(3, 4) <<
            1, 0, 0, 0,
            0, 1, 0, 0,
            0, 0, 1, 0);
    Mat T2 = (Mat_<double>(3, 4) <<
            R.at<double>(0, 0), R.at<double>(0, 1), R.at<double>(0, 2), t.at<double>(0, 0),
            R.at<double>(1, 0), R.at<double>(1, 1), R.at<double>(1, 2), t.at<double>(1, 0),
            R.at<double>(2, 0), R.at<double>(2, 1), R.at<double>(2, 2), t.at<double>(2, 0));
    vector<Point2f> points1, points2;  //归一化平面上的点,为了配合triangulatePoints()函数的输入参数
    for(auto m : matches)
    {
        points1.push_back(pixel2cam(keypoints1[m.queryIdx].pt));
        points2.push_back(pixel2cam(keypoints2[m.trainIdx].pt));
    }

    Mat points4d;  //4行N维矩阵,每一列表示一个空间点
    triangulatePoints(T1, T2, points1, points2, points4d);

    //转换成X,Y,Z坐标
    for(int i = 0; i < points4d.cols; i++)
    {
        Mat x = points4d.col(i);  //取第i列
        x /= x.at<float>(3, 0);  //归一化处理
        Point3d tmp(x.at<float>(0, 0), x.at<float>(1, 0), x.at<float>(2, 0));
        landmarks.push_back(tmp);

    }

}


Point2f pixel2cam(Point2f p)
{
    Point2f q;
    q.x = (p.x - K.at<double>(0, 2)) / K.at<double>(0, 0);
    q.y = (p.y - K.at<double>(1, 2)) / K.at<double>(1, 1);
    return q;
}

  CMakeLists.txt文件内容为,

set(CMAKE_CXX_FLAGS "-std=c++11")

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_DIRECTORIES})

add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBRARIES})

  结果为,

特征点对的数目为:180!
当i等于0时:图像1中像素点的深度为12.7309平移单位,残差为(0.0234249, 0.76373)像素单位; 图像2中对应像素点的深度为13.3517平移单位,残差为(0.0120148, -0.731457)像素单位! 
当i等于1时:图像1中像素点的深度为13.292平移单位,残差为(0.00149001, -0.353144)像素单位; 图像2中对应像素点的深度为13.819平移单位,残差为(-0.0185653, 0.339685)像素单位! 
当i等于2时:图像1中像素点的深度为11.2996平移单位,残差为(-0.0338357, 0.276243)像素单位; 图像2中对应像素点的深度为11.8649平移单位,残差为(0.0471918, -0.259664)像素单位! 
当i等于3时:图像1中像素点的深度为18.7236平移单位,残差为(-0.0229779, -0.493068)像素单位; 图像2中对应像素点的深度为19.1346平移单位,残差为(-6.44548e-05, 0.485116)像素单位! 
当i等于4时:图像1中像素点的深度为25.3362平移单位,残差为(0.0343007, 0.336509)像素单位; 图像2中对应像素点的深度为25.9753平移单位,残差为(-0.0190704, -0.332247)像素单位! 
当i等于5时:图像1中像素点的深度为11.5787平移单位,残差为(-0.00269884, 0.0937975)像素单位; 图像2中对应像素点的深度为11.8792平移单位,残差为(0.00734543, -0.0911872)像素单位! 
当i等于6时:图像1中像素点的深度为11.2145平移单位,残差为(-0.00017919, 0.00175884)像素单位; 图像2中对应像素点的深度为11.7894平移单位,残差为(0.000290076, -0.00165206)像素单位! 
当i等于7时:图像1中像素点的深度为12.1157平移单位,残差为(-0.000740346, 0.0760413)像素单位; 图像2中对应像素点的深度为12.5424平移单位,残差为(0.00442071, -0.0734183)像素单位! 
当i等于8时:图像1中像素点的深度为11.958平移单位,残差为(-0.00511494, 0.159903)像素单位; 图像2中对应像素点的深度为12.2389平移单位,残差为(0.0131276, -0.155771)像素单位! 
当i等于9时:图像1中像素点的深度为11.1585平移单位,残差为(-0.0315836, 0.256863)像素单位; 图像2中对应像素点的深度为11.7357平移单位,残差为(0.0438581, -0.24105)像素单位! 
当i等于10时:图像1中像素点的深度为19.9914平移单位,残差为(0.00359076, 0.11828)像素单位; 图像2中对应像素点的深度为20.3965平移单位,残差为(0.00209195, -0.116401)像素单位! 
当i等于11时:图像1中像素点的深度为12.9681平移单位,残差为(-0.0425164, 0.71647)像素单位; 图像2中对应像素点的深度为13.5038平移单位,残差为(0.0771078, -0.683951)像素单位! 
当i等于12时:图像1中像素点的深度为-117.552平移单位,残差为(0.0795427, 0.454686)像素单位; 图像2中对应像素点的深度为-119.171平移单位,残差为(-0.0609302, -0.457723)像素单位! 
当i等于13时:图像1中像素点的深度为12.2996平移单位,残差为(-0.00762847, 0.285662)像素单位; 图像2中对应像素点的深度为12.6018平移单位,残差为(0.0219021, -0.278151)像素单位! 
当i等于14时:图像1中像素点的深度为11.4073平移单位,残差为(-0.0214731, 0.187203)像素单位; 图像2中对应像素点的深度为11.9803平移单位,残差为(0.0305092, -0.176092)像素单位! 
当i等于15时:图像1中像素点的深度为11.5487平移单位,残差为(-0.0402399, 0.35238)像素单位; 图像2中对应像素点的深度为12.1303平移单位,残差为(0.0571429, -0.331435)像素单位! 
当i等于16时:图像1中像素点的深度为11.2555平移单位,残差为(-0.0407208, 0.488046)像素单位; 图像2中对应像素点的深度为11.7518平移单位,残差为(0.0644454, -0.463358)像素单位! 
当i等于17时:图像1中像素点的深度为13.6857平移单位,残差为(-0.00358085, 0.198876)像素单位; 图像2中对应像素点的深度为14.1655平移单位,残差为(0.0132459, -0.191881)像素单位! 
当i等于18时:图像1中像素点的深度为11.0505平移单位,残差为(-0.0434179, 0.441078)像素单位; 图像2中对应像素点的深度为11.6285平移单位,残差为(0.0643498, -0.414822)像素单位! 
当i等于19时:图像1中像素点的深度为-232.882平移单位,残差为(0.00263707, 0.017203)像素单位; 图像2中对应像素点的深度为-234.876平移单位,残差为(-0.00192135, -0.0173451)像素单位! 
当i等于20时:图像1中像素点的深度为13.2552平移单位,残差为(0.00131982, -0.300854)像素单位; 图像2中对应像素点的深度为13.7834平移单位,残差为(-0.0158227, 0.28933)像素单位! 
当i等于21时:图像1中像素点的深度为19.1116平移单位,残差为(-0.00276474, -0.0802517)像素单位; 图像2中对应像素点的深度为19.5169平移单位,残差为(-0.001065, 0.0789352)像素单位! 
当i等于22时:图像1中像素点的深度为11.2048平移单位,残差为(-0.0260428, 0.253818)像素单位; 图像2中对应像素点的深度为11.7902平移单位,残差为(0.0381527, -0.23862)像素单位! 
当i等于23时:图像1中像素点的深度为11.3468平移单位,残差为(-0.0509769, 0.646072)像素单位; 图像2中对应像素点的深度为11.9591平移单位,残差为(0.0811912, -0.608038)像素单位! 
当i等于24时:图像1中像素点的深度为10.9498平移单位,残差为(-0.0413349, 0.553306)像素单位; 图像2中对应像素点的深度为11.5562平移单位,残差为(0.0671763, -0.520278)像素单位! 
当i等于25时:图像1中像素点的深度为11.3415平移单位,残差为(-0.0117524, 0.11439)像素单位; 图像2中对应像素点的深度为11.9247平移单位,残差为(0.0172508, -0.107624)像素单位! 
当i等于26时:图像1中像素点的深度为13.357平移单位,残差为(0.00014756, -0.00779071)像素单位; 图像2中对应像素点的深度为13.811平移单位,残差为(-0.000526889, 0.00752056)像素单位! 
当i等于27时:图像1中像素点的深度为13.7369平移单位,残差为(-0.0167923, 0.801822)像素单位; 图像2中对应像素点的深度为14.2166平移单位,残差为(0.0557331, -0.773543)像素单位! 
当i等于28时:图像1中像素点的深度为10.6351平移单位,残差为(-0.0178373, 0.214904)像素单位; 图像2中对应像素点的深度为11.0373平移单位,残差为(0.0285577, -0.205288)像素单位! 
当i等于29时:图像1中像素点的深度为10.4287平移单位,残差为(-0.00622615, 0.0746416)像素单位; 图像2中对应像素点的深度为10.8135平移单位,残差为(0.0099558, -0.0713636)像素单位! 
当i等于30时:图像1中像素点的深度为18.6937平移单位,残差为(-0.0166185, -0.362065)像素单位; 图像2中对应像素点的深度为19.1091平移单位,残差为(-0.000348122, 0.356127)像素单位! 
当i等于31时:图像1中像素点的深度为-87.1712平移单位,残差为(0.115657, 0.621301)像素单位; 图像2中对应像素点的深度为-88.6391平移单位,残差为(-0.0904938, -0.624485)像素单位! 
当i等于32时:图像1中像素点的深度为10.8551平移单位,残差为(-0.0242971, 0.294887)像素单位; 图像2中对应像素点的深度为11.2742平移单位,残差为(0.0389643, -0.281485)像素单位! 
当i等于33时:图像1中像素点的深度为19.3419平移单位,残差为(-0.0174234, -0.366274)像素单位; 图像2中对应像素点的深度为19.7591平移单位,残差为(0.000287467, 0.360562)像素单位! 
当i等于34时:图像1中像素点的深度为11.4136平移单位,残差为(-0.0690159, 0.613113)像素单位; 图像2中对应像素点的深度为11.9875平移单位,残差为(0.098259, -0.57679)像素单位! 
当i等于35时:图像1中像素点的深度为11.3039平移单位,残差为(-0.01251, 0.192998)像素单位; 图像2中对应像素点的深度为11.687平移单位,残差为(0.0221638, -0.185435)像素单位! 
当i等于36时:图像1中像素点的深度为13.6614平移单位,残差为(-0.00220721, 0.439796)像素单位; 图像2中对应像素点的深度为14.1909平移单位,残差为(0.0232696, -0.423476)像素单位! 
当i等于37时:图像1中像素点的深度为12.4318平移单位,残差为(0.000276228, -0.0286925)像素单位; 图像2中对应像素点的深度为12.8587平移单位,残差为(-0.00167381, 0.0277267)像素单位! 
当i等于38时:图像1中像素点的深度为11.1102平移单位,残差为(-0.0595274, 0.705044)像素单位; 图像2中对应像素点的深度为11.7045平移单位,残差为(0.0925351, -0.663405)像素单位! 
当i等于39时:图像1中像素点的深度为12.1373平移单位,残差为(-0.000457464, 0.0169256)像素单位; 图像2中对应像素点的深度为12.4391平移单位,残差为(0.00127825, -0.0164764)像素单位! 
当i等于40时:图像1中像素点的深度为27.4585平移单位,残差为(0.121661, 1.25596)像素单位; 图像2中对应像素点的深度为28.0874平移单位,残差为(-0.064587, -1.24334)像素单位! 
当i等于41时:图像1中像素点的深度为19.9671平移单位,残差为(0.0189055, 0.615901)像素单位; 图像2中对应像素点的深度为20.3728平移单位,残差为(0.0107847, -0.606232)像素单位! 
当i等于42时:图像1中像素点的深度为26.8841平移单位,残差为(0.0898693, 0.902623)像素单位; 图像2中对应像素点的深度为27.5318平移单位,残差为(-0.0489908, -0.89245)像素单位! 
当i等于43时:图像1中像素点的深度为19.1753平移单位,残差为(0.000917192, 0.0308978)像素单位; 图像2中对应像素点的深度为19.5728平移单位,残差为(0.000550493, -0.0303955)像素单位! 
当i等于44时:图像1中像素点的深度为11.3285平移单位,残差为(-0.0114006, 0.113599)像素单位; 图像2中对应像素点的深度为11.9078平移单位,残差为(0.0169027, -0.106945)像素单位! 
当i等于45时:图像1中像素点的深度为11.2837平移单位,残差为(-0.035207, 0.342939)像素单位; 图像2中对应像素点的深度为11.8702平移单位,残差为(0.0515649, -0.322488)像素单位! 
当i等于46时:图像1中像素点的深度为18.9954平移单位,残差为(-1.78652e-05, -0.000457943)像素单位; 图像2中对应像素点的深度为19.3993平移单位,残差为(-8.9094e-06, 0.000454656)像素单位! 
当i等于47时:图像1中像素点的深度为11.6712平移单位,残差为(-0.0046578, 0.151505)像素单位; 图像2中对应像素点的深度为11.959平移单位,残差为(0.01222, -0.147446)像素单位! 
当i等于48时:图像1中像素点的深度为9.93402平移单位,残差为(0.00409531, -0.0433769)像素单位; 图像2中对应像素点的深度为10.3032平移单位,残差为(-0.00628074, 0.0414158)像素单位! 
当i等于49时:图像1中像素点的深度为11.4443平移单位,残差为(-0.0386314, 0.463172)像素单位; 图像2中对应像素点的深度为11.9418平移单位,残差为(0.061213, -0.440014)像素单位! 
当i等于50时:图像1中像素点的深度为13.3423平移单位,残差为(-0.000194053, 0.0103188)像素单位; 图像2中对应像素点的深度为13.7971平移单位,残差为(0.000697967, -0.00996329)像素单位! 
当i等于51时:图像1中像素点的深度为13.5091平移单位,残差为(-0.000884914, 0.197007)像素单位; 图像2中对应像素点的深度为14.0397平移单位,残差为(0.0103447, -0.189594)像素单位! 
当i等于52时:图像1中像素点的深度为13.3565平移单位,残差为(-0.00237977, 0.129101)像素单位; 图像2中对应像素点的深度为13.8351平移单位,残差为(0.00865214, -0.124459)像素单位! 
当i等于53时:图像1中像素点的深度为12.1249平移单位,残差为(-0.0030422, 0.113136)像素单位; 图像2中对应像素点的深度为12.4293平移单位,残差为(0.00864618, -0.110105)像素单位! 
当i等于54时:图像1中像素点的深度为10.9325平移单位,残差为(0.00824211, -0.114663)像素单位; 图像2中对应像素点的深度为11.5414平移单位,残差为(-0.0137084, 0.107815)像素单位! 
当i等于55时:图像1中像素点的深度为12.6628平移单位,残差为(-0.00245665, 0.0422552)像素单位; 图像2中对应像素点的深度为13.1964平移单位,残差为(0.0045417, -0.0403093)像素单位! 
当i等于56时:图像1中像素点的深度为10.5914平移单位,残差为(-0.0466194, 0.558952)像素单位; 图像2中对应像素点的深度为10.9757平移单位,残差为(0.0747137, -0.534604)像素单位! 
当i等于57时:图像1中像素点的深度为11.7627平移单位,残差为(0.00250859, 0.139587)像素单位; 图像2中对应像素点的深度为12.3551平移单位,残差为(0.00408279, -0.133248)像素单位! 
当i等于58时:图像1中像素点的深度为10.9802平移单位,残差为(-0.00215739, 0.0339129)像素单位; 图像2中对应像素点的深度为11.3371平移单位,残差为(0.00383885, -0.0326321)像素单位! 
当i等于59时:图像1中像素点的深度为11.8546平移单位,残差为(0.000125861, -0.00360169)像素单位; 图像2中对应像素点的深度为12.1559平移单位,残差为(-0.00026493, 0.00350367)像素单位! 
当i等于60时:图像1中像素点的深度为11.7152平移单位,残差为(0.000549058, -0.0165661)像素单位; 图像2中对应像素点的深度为11.9962平移单位,残差为(-0.00134944, 0.016131)像素单位! 
当i等于61时:图像1中像素点的深度为10.9395平移单位,残差为(0.100189, -0.844054)像素单位; 图像2中对应像素点的深度为11.5155平移单位,残差为(-0.141991, 0.791941)像素单位! 
当i等于62时:图像1中像素点的深度为10.5778平移单位,残差为(-2.5031e-05, 0.000297072)像素单位; 图像2中对应像素点的深度为10.9798平移单位,残差为(4.14866e-05, -0.000291388)像素单位! 
当i等于63时:图像1中像素点的深度为19.3436平移单位,残差为(0.00279807, 0.0634253)像素单位; 图像2中对应像素点的深度为19.7689平移单位,残差为(0.0001981, -0.0623962)像素单位! 
当i等于64时:图像1中像素点的深度为9.89913平移单位,残差为(-0.0696366, 0.779144)像素单位; 图像2中对应像素点的深度为10.2813平移单位,残差为(0.10874, -0.742932)像素单位! 
当i等于65时:图像1中像素点的深度为18.511平移单位,残差为(-0.0125231, -0.267326)像素单位; 图像2中对应像素点的深度为18.9281平移单位,残差为(-2.78795e-05, 0.262908)像素单位! 
当i等于66时:图像1中像素点的深度为10.5847平移单位,残差为(-0.00456444, 0.0552782)像素单位; 图像2中对应像素点的深度为11.004平移单位,残差为(0.0073067, -0.0527205)像素单位! 
当i等于67时:图像1中像素点的深度为11.6013平移单位,残差为(-0.0866276, 0.675943)像素单位; 图像2中对应像素点的深度为12.1821平移单位,残差为(0.118846, -0.634887)像素单位! 
当i等于68时:图像1中像素点的深度为8.98593平移单位,残差为(-0.0527532, 0.424047)像素单位; 图像2中对应像素点的深度为9.34149平移单位,残差为(0.0742398, -0.402406)像素单位! 
当i等于69时:图像1中像素点的深度为13.1591平移单位,残差为(-0.00912557, 0.501741)像素单位; 图像2中对应像素点的深度为13.6377平移单位,残差为(0.0334517, -0.483499)像素单位! 
当i等于70时:图像1中像素点的深度为12.4062平移单位,残差为(0.000316267, -0.0364622)像素单位; 图像2中对应像素点的深度为12.8342平移单位,残差为(-0.00208585, 0.0352336)像素单位! 
当i等于71时:图像1中像素点的深度为12.2076平移单位,残差为(0.0027092, -0.103156)像素单位; 图像2中对应像素点的深度为12.5064平移单位,残差为(-0.0077947, 0.100464)像素单位! 
当i等于72时:图像1中像素点的深度为12.3332平移单位,残差为(-0.0623698, 0.485404)像素单位; 图像2中对应像素点的深度为12.9223平移单位,残差为(0.0858446, -0.456933)像素单位! 
当i等于73时:图像1中像素点的深度为12.7758平移单位,残差为(-0.0231258, 0.394509)像素单位; 图像2中对应像素点的深度为13.3105平移单位,残差为(0.0422536, -0.376438)像素单位! 
当i等于74时:图像1中像素点的深度为11.8525平移单位,残差为(0.000353668, -0.0127713)像素单位; 图像2中对应像素点的深度为12.1539平移单位,残差为(-0.00101014, 0.0124236)像素单位! 
当i等于75时:图像1中像素点的深度为13.7734平移单位,残差为(-0.0304417, 1.05271)像素单位; 图像2中对应像素点的深度为14.3578平移单位,残差为(0.0801166, -1.00749)像素单位! 
当i等于76时:图像1中像素点的深度为11.25平移单位,残差为(0.0207998, -0.17408)像素单位; 图像2中对应像素点的深度为11.8305平移单位,残差为(-0.0292441, 0.163458)像素单位! 
当i等于77时:图像1中像素点的深度为19.3933平移单位,残差为(0.0133477, 0.378997)像素单位; 图像2中对应像素点的深度为19.805平移单位,残差为(0.00478371, -0.372866)像素单位! 
当i等于78时:图像1中像素点的深度为10.8926平移单位,残差为(-0.0127516, 0.295751)像素单位; 图像2中对应像素点的深度为11.2102平移单位,残差为(0.0276101, -0.286154)像素单位! 
当i等于79时:图像1中像素点的深度为11.2815平移单位,残差为(-0.0411692, 0.347187)像素单位; 图像2中对应像素点的深度为11.8582平移单位,残差为(0.0577878, -0.32615)像素单位! 
当i等于80时:图像1中像素点的深度为18.9883平移单位,残差为(-0.00892153, -0.259992)像素单位; 图像2中对应像素点的深度为19.3922平移单位,残差为(-0.00340221, 0.255661)像素单位! 
当i等于81时:图像1中像素点的深度为18.624平移单位,残差为(-0.0302118, -0.656424)像素单位; 图像2中对应像素点的深度为19.0332平移单位,残差为(-0.000372065, 0.645727)像素单位! 
当i等于82时:图像1中像素点的深度为10.53平移单位,残差为(-0.0205631, 0.24914)像素单位; 图像2中对应像素点的深度为10.9323平移单位,残差为(0.0329797, -0.237904)像素单位! 
当i等于83时:图像1中像素点的深度为10.5245平移单位,残差为(-0.0130136, 0.159102)像素单位; 图像2中对应像素点的深度为10.9441平移单位,残差为(0.0209008, -0.151699)像素单位! 
当i等于84时:图像1中像素点的深度为13.6621平移单位,残差为(-0.00535518, 1.03872)像素单位; 图像2中对应像素点的深度为14.192平移单位,残差为(0.0547736, -1.00032)像素单位! 
当i等于85时:图像1中像素点的深度为13.2552平移单位,残差为(-0.00205997, 0.511786)像素单位; 图像2中对应像素点的深度为13.7853平移单位,残差为(0.0265094, -0.492274)像素单位! 
当i等于86时:图像1中像素点的深度为11.3418平移单位,残差为(-0.0413567, 0.416865)像素单位; 图像2中对应像素点的深度为11.9215平移单位,残差为(0.0612302, -0.39246)像素单位! 
当i等于87时:图像1中像素点的深度为11.8588平移单位,残差为(0.0184853, -0.583281)像素单位; 图像2中对应像素点的深度为12.1609平移单位,残差为(-0.0470497, 0.567194)像素单位! 
当i等于88时:图像1中像素点的深度为19.1357平移单位,残差为(-0.00630681, -0.205482)像素单位; 图像2中对应像素点的深度为19.535平移单位,残差为(-0.00345463, 0.20205)像素单位! 
当i等于89时:图像1中像素点的深度为19.0485平移单位,残差为(-0.000978961, -0.0318166)像素单位; 图像2中对应像素点的深度为19.4558平移单位,残差为(-0.000538022, 0.0312807)像素单位! 
当i等于90时:图像1中像素点的深度为11.3189平移单位,残差为(0.00698656, -0.0849516)像素单位; 图像2中对应像素点的深度为11.8165平移单位,残差为(-0.0111375, 0.0806855)像素单位! 
当i等于91时:图像1中像素点的深度为11.0536平移单位,残差为(-0.0627562, 0.837291)像素单位; 图像2中对应像素点的深度为11.6617平移单位,残差为(0.101624, -0.787572)像素单位! 
当i等于92时:图像1中像素点的深度为11.7433平移单位,残差为(-0.14279, 1.2425)像素单位; 图像2中对应像素点的深度为12.3282平移单位,残差为(0.200877, -1.16902)像素单位! 
当i等于93时:图像1中像素点的深度为25.7436平移单位,残差为(0.0475027, 0.473228)像素单位; 图像2中对应像素点的深度为26.3814平移单位,残差为(-0.0260657, -0.467418)像素单位! 
当i等于94时:图像1中像素点的深度为14.3435平移单位,残差为(-0.0131327, 0.461216)像素单位; 图像2中对应像素点的深度为14.934平移单位,残差为(0.0352276, -0.441903)像素单位! 
当i等于95时:图像1中像素点的深度为19.4544平移单位,残差为(0.0126895, 0.406966)像素单位; 图像2中对应像素点的深度为19.8618平移单位,残差为(0.00685262, -0.400318)像素单位! 
当i等于96时:图像1中像素点的深度为12.113平移单位,残差为(0.00259651, -0.307699)像素单位; 图像2中对应像素点的深度为12.5416平移单位,残差为(-0.017458, 0.297068)像素单位! 
当i等于97时:图像1中像素点的深度为13.1304平移单位,残差为(0.00173858, -0.101398)像素单位; 图像2中对应像素点的深度为13.6091平移单位,残差为(-0.00666392, 0.0977039)像素单位! 
当i等于98时:图像1中像素点的深度为25.2277平移单位,残差为(0.0473669, 0.449397)像素单位; 图像2中对应像素点的深度为25.8733平移单位,残差为(-0.0270695, -0.443775)像素单位! 
当i等于99时:图像1中像素点的深度为25.5122平移单位,残差为(-0.0534203, -0.501131)像素单位; 图像2中对应像素点的深度为26.1563平移单位,残差为(0.0308241, 0.494571)像素单位! 
当i等于100时:图像1中像素点的深度为12.9271平移单位,残差为(-0.20529, 1.54794)像素单位; 图像2中对应像素点的深度为13.5207平移单位,残差为(0.278121, -1.45865)像素单位! 
当i等于101时:图像1中像素点的深度为11.6325平移单位,残差为(-0.0689605, 0.830169)像素单位; 图像2中对应像素点的深度为12.2317平移单位,残差为(0.107844, -0.782735)像素单位! 
当i等于102时:图像1中像素点的深度为11.6633平移单位,残差为(0.0107602, -0.393842)像素单位; 图像2中对应像素点的深度为11.9695平移单位,残差为(-0.0300226, 0.382859)像素单位! 
当i等于103时:图像1中像素点的深度为11.8673平移单位,残差为(0.0331538, -0.274461)像素单位; 图像2中对应像素点的深度为12.445平移单位,残差为(-0.0466423, 0.258394)像素单位! 
当i等于104时:图像1中像素点的深度为11.1368平移单位,残差为(0.0237063, -0.281906)像素单位; 图像2中对应像素点的深度为11.7337平移单位,残差为(-0.0373345, 0.265242)像素单位! 
当i等于105时:图像1中像素点的深度为13.3876平移单位,残差为(0.00017996, -0.0394566)像素单位; 图像2中对应像素点的深度为13.9148平移单位,残差为(-0.00209096, 0.0379662)像素单位! 
当i等于106时:图像1中像素点的深度为11.7355平移单位,残差为(0.00867733, -0.266977)像素单位; 图像2中对应像素点的深度为12.0378平移单位,残差为(-0.021884, 0.259504)像素单位! 
当i等于107时:图像1中像素点的深度为19.3746平移单位,残差为(-0.000885881, -0.0296542)像素单位; 图像2中对应像素点的深度为19.7732平移单位,残差为(-0.000530979, 0.0291657)像素单位! 
当i等于108时:图像1中像素点的深度为11.8139平移单位,残差为(-0.00777881, 0.242397)像素单位; 图像2中对应像素点的深度为12.1055平移单位,残差为(0.0199639, -0.235849)像素单位! 
当i等于109时:图像1中像素点的深度为11.4395平移单位,残差为(-0.0392638, 0.4768)像素单位; 图像2中对应像素点的深度为11.9381平移单位,残差为(0.0625016, -0.452964)像素单位! 
当i等于110时:图像1中像素点的深度为12.731平移单位,残差为(-0.0420603, 0.75049)像素单位; 图像2中对应像素点的深度为13.2387平移单位,残差为(0.0784843, -0.717664)像素单位! 
当i等于111时:图像1中像素点的深度为9.16763平移单位,残差为(-0.0057045, 0.0451366)像素单位; 图像2中对应像素点的深度为9.53271平移单位,残差为(0.00798017, -0.042817)像素单位! 
当i等于112时:图像1中像素点的深度为10.758平移单位,残差为(-0.00805676, 0.0980073)像素单位; 图像2中对应像素点的深度为11.1765平移单位,残差为(0.0129282, -0.0935366)像素单位! 
当i等于113时:图像1中像素点的深度为13.2104平移单位,残差为(-0.0209749, 0.944121)像素单位; 图像2中对应像素点的深度为13.6889平移单位,残差为(0.0667351, -0.909568)像素单位! 
当i等于114时:图像1中像素点的深度为10.0428平移单位,残差为(0.0102554, -0.123955)像素单位; 图像2中对应像素点的深度为10.4308平移单位,残差为(-0.0164195, 0.118326)像素单位! 
当i等于115时:图像1中像素点的深度为11.9788平移单位,残差为(0.00617591, -0.0471998)像素单位; 图像2中对应像素点的深度为12.5595平移单位,残差为(-0.00851072, 0.0443966)像素单位! 
当i等于116时:图像1中像素点的深度为18.7996平移单位,残差为(-0.0255673, -0.545489)像素单位; 图像2中对应像素点的深度为19.2085平移单位,残差为(0.000102665, 0.536804)像素单位! 
当i等于117时:图像1中像素点的深度为13.4087平移单位,残差为(-0.00225661, 0.0696447)像素单位; 图像2中对应像素点的深度为13.9828平移单位,残差为(0.0056359, -0.0665843)像素单位! 
当i等于118时:图像1中像素点的深度为19.0456平移单位,残差为(0.00174456, 0.0488523)像素单位; 图像2中对应像素点的深度为19.4592平移单位,残差为(0.000574912, -0.0480292)像素单位! 
当i等于119时:图像1中像素点的深度为8.79994平移单位,残差为(-0.0615723, 0.495218)像素单位; 图像2中对应像素点的深度为9.15685平移单位,残差为(0.0865935, -0.469483)像素单位! 
当i等于120时:图像1中像素点的深度为12.9114平移单位,残差为(-0.00641871, 0.109829)像素单位; 图像2中对应像素点的深度为13.4475平移单位,残差为(0.0117856, -0.104833)像素单位! 
当i等于121时:图像1中像素点的深度为13.8295平移单位,残差为(-0.00829658, 0.253305)像素单位; 图像2中对应像素点的深度为14.4082平移单位,残差为(0.0205165, -0.242411)像素单位! 
当i等于122时:图像1中像素点的深度为9.32437平移单位,残差为(0.100184, -0.807966)像素单位; 图像2中对应像素点的深度为9.67719平移单位,残差为(-0.140824, 0.768806)像素单位! 
当i等于123时:图像1中像素点的深度为11.6516平移单位,残差为(-0.0351171, 0.43123)像素单位; 图像2中对应像素点的深度为12.1504平移单位,残差为(0.0561603, -0.410024)像素单位! 
当i等于124时:图像1中像素点的深度为26.8028平移单位,残差为(0.00959934, 0.0898823)像素单位; 图像2中对应像素点的深度为27.461平移单位,残差为(-0.00555071, -0.0888131)像素单位! 
当i等于125时:图像1中像素点的深度为13.322平移单位,残差为(0.0134582, -0.464003)像素单位; 图像2中对应像素点的深度为13.909平移单位,残差为(-0.0360818, 0.443222)像素单位! 
当i等于126时:图像1中像素点的深度为13.3916平移单位,残差为(-0.0169386, 0.617468)像素单位; 图像2中对应像素点的深度为13.9733平移单位,残差为(0.0463307, -0.59041)像素单位! 
当i等于127时:图像1中像素点的深度为19.8342平移单位,残差为(-0.00584864, -0.187155)像素单位; 图像2中对应像素点的深度为20.2352平移单位,残差为(-0.00306522, 0.184168)像素单位! 
当i等于128时:图像1中像素点的深度为13.4134平移单位,残差为(0.00270686, -0.165271)像素单位; 图像2中对应像素点的深度为13.8924平移单位,残差为(-0.0107454, 0.159372)像素单位! 
当i等于129时:图像1中像素点的深度为12.1031平移单位,残差为(0.0331762, -0.624148)像素单位; 图像2中对应像素点的深度为12.6077平移单位,残差为(-0.0639256, 0.596014)像素单位! 
当i等于130时:图像1中像素点的深度为19.5747平移单位,残差为(-0.00137856, -0.0396071)像素单位; 图像2中对应像素点的深度为19.9895平移单位,残差为(-0.00050384, 0.0389669)像素单位! 
当i等于131时:图像1中像素点的深度为12.6941平移单位,残差为(-3.13282e-06, -0.000110095)像素单位; 图像2中对应像素点的深度为13.122平移单位,残差为(-1.13322e-05, 0.000106947)像素单位! 
当i等于132时:图像1中像素点的深度为13.0731平移单位,残差为(0.000778727, -0.263168)像素单位; 图像2中对应像素点的深度为13.5985平移单位,残差为(-0.0134505, 0.253049)像素单位! 
当i等于133时:图像1中像素点的深度为10.8945平移单位,残差为(-0.021205, 0.499022)像素单位; 图像2中对应像素点的深度为11.2105平移单位,残差为(0.0463234, -0.482923)像素单位! 
当i等于134时:图像1中像素点的深度为8.95984平移单位,残差为(0.0576495, -0.456128)像素单位; 图像2中对应像素点的深度为9.31756平移单位,残差为(-0.0805482, 0.432913)像素单位! 
当i等于135时:图像1中像素点的深度为9.26812平移单位,残差为(-0.110324, 0.877903)像素单位; 图像2中对应像素点的深度为9.63292平移单位,残差为(0.15496, -0.832848)像素单位! 
当i等于136时:图像1中像素点的深度为9.60079平移单位,残差为(0.13415, -1.04913)像素单位; 图像2中对应像素点的深度为9.9541平移单位,残差为(-0.187118, 0.999067)像素单位! 
当i等于137时:图像1中像素点的深度为12.8406平移单位,残差为(-0.00655126, 0.826285)像素单位; 图像2中对应像素点的深度为13.2691平移单位,残差为(0.0468967, -0.799521)像素单位! 
当i等于138时:图像1中像素点的深度为11.0428平移单位,残差为(-0.00925543, 0.217068)像素单位; 图像2中对应像素点的深度为11.3614平移单位,残差为(0.0201452, -0.210104)像素单位! 
当i等于139时:图像1中像素点的深度为14.2057平移单位,残差为(-0.0155743, 0.857369)像素单位; 图像2中对应像素点的深度为14.686平移单位,残差为(0.0572327, -0.828298)像素单位! 
当i等于140时:图像1中像素点的深度为12.9232平移单位,残差为(-0.00270645, 0.612495)像素单位; 图像2中对应像素点的深度为13.4477平移单位,残差为(0.0319278, -0.58879)像素单位! 
当i等于141时:图像1中像素点的深度为9.207平移单位,残差为(0.0175498, -0.142364)像素单位; 图像2中对应像素点的深度为9.56092平移单位,残差为(-0.024752, 0.13533)像素单位! 
当i等于142时:图像1中像素点的深度为8.8934平移单位,残差为(0.186077, -1.49366)像素单位; 图像2中对应像素点的深度为9.26261平移单位,残差为(-0.260049, 1.41692)像素单位! 
当i等于143时:图像1中像素点的深度为11.933平移单位,残差为(-0.0323595, 0.397645)像素单位; 图像2中对应像素点的深度为12.4335平移单位,残差为(0.0518541, -0.378412)像素单位! 
当i等于144时:图像1中像素点的深度为13.3079平移单位,残差为(-0.00751206, 0.22511)像素单位; 图像2中对应像素点的深度为13.7829平移单位,残差为(0.0185268, -0.216685)像素单位! 
当i等于145时:图像1中像素点的深度为9.89412平移单位,残差为(-0.127601, 0.998066)像素单位; 图像2中对应像素点的深度为10.2477平移单位,残差为(0.179103, -0.94983)像素单位! 
当i等于146时:图像1中像素点的深度为22.4342平移单位,残差为(0.0302642, 0.736546)像素单位; 图像2中对应像素点的深度为22.8133平移单位,残差为(0.00511022, -0.72833)像素单位! 
当i等于147时:图像1中像素点的深度为12.5731平移单位,残差为(0.0104896, -0.193192)像素单位; 图像2中对应像素点的深度为13.0814平移单位,残差为(-0.0199664, 0.184684)像素单位! 
当i等于148时:图像1中像素点的深度为13.5208平移单位,残差为(0.00767206, -0.262936)像素单位; 图像2中对应像素点的深度为14.1104平移单位,残差为(-0.0204326, 0.251277)像素单位! 
当i等于149时:图像1中像素点的深度为13.893平移单位,残差为(-0.000962531, 0.0385417)像素单位; 图像2中对应像素点的深度为14.3345平移单位,残差为(0.00285027, -0.0372738)像素单位! 
当i等于150时:图像1中像素点的深度为10.1377平移单位,残差为(-0.0863178, 0.971584)像素单位; 图像2中对应像素点的深度为10.52平移单位,残差为(0.135242, -0.927203)像素单位! 
当i等于151时:图像1中像素点的深度为13.0766平移单位,残差为(0.00739197, -0.216572)像素单位; 图像2中对应像素点的深度为13.6474平移单位,残差为(-0.0178933, 0.206853)像素单位! 
当i等于152时:图像1中像素点的深度为11.6151平移单位,残差为(0.00811243, -1.22332)像素单位; 图像2中对应像素点的深度为12.0466平移单位,残差为(-0.0666249, 1.17906)像素单位! 
当i等于153时:图像1中像素点的深度为12.9259平移单位,残差为(-0.000181369, 0.0564322)像素单位; 图像2中对应像素点的深度为13.4497平移单位,残差为(0.00288986, -0.054259)像素单位! 
当i等于154时:图像1中像素点的深度为16.3804平移单位,残差为(5.11753e-06, 0.000497036)像素单位; 图像2中对应像素点的深度为16.966平移单位,残差为(9.41102e-06, -0.00048325)像素单位! 
当i等于155时:图像1中像素点的深度为22.4734平移单位,残差为(0.00982691, 0.241978)像素单位; 图像2中对应像素点的深度为22.8519平移单位,残差为(0.00170212, -0.239217)像素单位! 
当i等于156时:图像1中像素点的深度为12.934平移单位,残差为(0.0152591, -0.850657)像素单位; 图像2中对应像素点的深度为13.4089平移单位,残差为(-0.0566798, 0.819277)像素单位! 
当i等于157时:图像1中像素点的深度为9.8415平移单位,残差为(-0.176484, 1.40174)像素单位; 图像2中对应像素点的深度为10.2005平移单位,残差为(0.248739, -1.33289)像素单位! 
当i等于158时:图像1中像素点的深度为13.9433平移单位,残差为(-0.0190404, 1.01242)像素单位; 图像2中对应像素点的深度为14.4354平移单位,残差为(0.0679988, -0.976664)像素单位! 
当i等于159时:图像1中像素点的深度为9.26866平移单位,残差为(0.00535963, -0.0415914)像素单位; 图像2中对应像素点的深度为9.62599平移单位,残差为(-0.0074584, 0.039507)像素单位! 
当i等于160时:图像1中像素点的深度为8.92899平移单位,残差为(0.0175213, -0.168015)像素单位; 图像2中对应像素点的深度为9.30768平移单位,残差为(-0.0258503, 0.159431)像素单位! 
当i等于161时:图像1中像素点的深度为8.91869平移单位,残差为(0.00974808, -0.115178)像素单位; 图像2中对应像素点的深度为9.25332平移单位,残差为(-0.0154822, 0.110058)像素单位! 
当i等于162时:图像1中像素点的深度为10.5974平移单位,残差为(-0.122162, 1.63356)像素单位; 图像2中对应像素点的深度为11.0205平移单位,残差为(0.202879, -1.55804)像素单位! 
当i等于163时:图像1中像素点的深度为9.11063平移单位,残差为(-0.0911151, 0.725351)像素单位; 图像2中对应像素点的深度为9.46741平移单位,残差为(0.128033, -0.688337)像素单位! 
当i等于164时:图像1中像素点的深度为8.91746平移单位,残差为(-0.0659675, 0.520828)像素单位; 图像2中对应像素点的深度为9.28184平移单位,残差为(0.0922609, -0.493474)像素单位! 
当i等于165时:图像1中像素点的深度为8.75934平移单位,残差为(-0.0795976, 0.77365)像素单位; 图像2中对应像素点的深度为9.13946平移单位,残差为(0.118106, -0.733143)像素单位! 
当i等于166时:图像1中像素点的深度为11.3843平移单位,残差为(-0.0153742, 0.189132)像素单位; 图像2中对应像素点的深度为11.8815平移单位,残差为(0.0246264, -0.179702)像素单位! 
当i等于167时:图像1中像素点的深度为21.8329平移单位,残差为(-0.0546779, -1.28751)像素单位; 图像2中对应像素点的深度为22.2165平移单位,残差为(-0.00472456, 1.2711)像素单位! 
当i等于168时:图像1中像素点的深度为12.4055平移单位,残差为(-0.0475269, 0.888115)像素单位; 图像2中对应像素点的深度为12.914平移单位,残差为(0.0903812, -0.848617)像素单位! 
当i等于169时:图像1中像素点的深度为13.1605平移单位,残差为(-0.0170911, 0.524548)像素单位; 图像2中对应像素点的深度为13.6328平移单位,残差为(0.0426963, -0.504881)像素单位! 
当i等于170时:图像1中像素点的深度为13.7704平移单位,残差为(-0.0694098, 1.85203)像素单位; 图像2中对应像素点的深度为14.3479平移单位,残差为(0.155577, -1.77181)像素单位! 
当i等于171时:图像1中像素点的深度为14.1237平移单位,残差为(0.00445367, -0.186995)像素单位; 图像2中对应像素点的深度为14.568平移单位,残差为(-0.0136244, 0.18092)像素单位! 
当i等于172时:图像1中像素点的深度为13.7159平移单位,残差为(0.0244257, -1.28867)像素单位; 图像2中对应像素点的深度为14.1494平移单位,残差为(-0.0870818, 1.24714)像素单位! 
当i等于173时:图像1中像素点的深度为13.2774平移单位,残差为(-0.0619, 2.00734)像素单位; 图像2中对应像素点的深度为13.8632平移单位,残差为(0.154159, -1.91804)像素单位! 
当i等于174时:图像1中像素点的深度为14.5006平移单位,残差为(0.000761846, -0.0418554)像素单位; 图像2中对应像素点的深度为14.9799平移单位,残差为(-0.00280858, 0.0404565)像素单位! 
当i等于175时:图像1中像素点的深度为12.3345平移单位,残差为(0.000428954, -0.0895545)像素单位; 图像2中对应像素点的深度为12.7671平移单位,残差为(-0.00474535, 0.0865309)像素单位! 
当i等于176时:图像1中像素点的深度为13.0951平移单位,残差为(2.62387e-05, -0.899209)像素单位; 图像2中对应像素点的深度为13.6217平移单位,残差为(-0.043609, 0.864697)像素单位! 
当i等于177时:图像1中像素点的深度为14.0908平移单位,残差为(0.0225323, -1.41334)像素单位; 图像2中对应像素点的深度为14.5848平移单位,残差为(-0.0918569, 1.36351)像素单位! 
当i等于178时:图像1中像素点的深度为9.83554平移单位,残差为(0.0568222, -0.65934)像素单位; 图像2中对应像素点的深度为10.16平移单位,残差为(-0.0897104, 0.632831)像素单位! 
当i等于179时:图像1中像素点的深度为10.5974平移单位,残差为(-0.122162, 1.63356)像素单位; 图像2中对应像素点的深度为11.0205平移单位,残差为(0.202879, -1.55804)像素单位! 
执行程序所花费的时间为:1.79758秒!

在这里插入图片描述
在这里插入图片描述注:越红代表离得越远!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YMWM_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值