#CV,SLAM学习笔记(给自己看的)

CV,SLAM学习笔记(给自己看的)

Homograph求解

①在Homograph求解中,有两种方法:
第一种方法就是将H33设为1,去求剩下的八个元素,转载图片:
第二种方法就是直接求9个元素,同时满足约束:||H|| = 1,展开第二种方法继续写:
图片来自网络图片来自网络
图片来自网络转载于:
https://blog.csdn.net/lyhbkz/article/details/82254893

c++实现:

	/*
    |x2| |H11 H12 H13|   |x1|
    |y2|=|H21 H22 H23| * |y1|
    |1 | |H31 H32 H33|   |1 | 
    */
    int PicturePoints = board_size.height * board_size.width;  //54
    int PointVec_xy = 2*PicturePoints;//54*2 =108
    vector<Mat> Aall; //装了每幅图像的a

    for(int i = 0; i < image_count; i++)
    {
        Mat a = Mat(PointVec_xy,9,CV_32FC1,Scalar::all(1)); 
    /*     |a1|  1
           |a2|  2
    a =    |...|  ..
           |a1|  107
           |a2|  108 
    */
        for(int j = 0; j < PicturePoints; j++)
        {
            /*
            -H11x1-H12y1-H13+H31x1x2+H32x2y2+H33x2
            -H21x1-H22y1-H23+H31y2x1+H32y2y1+H33y2           
            a * h = 0           
            h =  (H11, H12, H13, H21, H22, H23,  H31, H32, H33)T
            a1 = (-x1, -y1,  -1,   0,   0,   0, x1x2, x2y1, x2)
            a2 = (  0,   0,   0, -x1,  -y1, -1, y2x1, y2y1, y2)
            */

            Mat a1 = Mat(1,9,CV_32FC1,Scalar::all(1)); //a1 
            Mat a2 = Mat(1,9,CV_32FC1,Scalar::all(1)); //a2

            a1.at<float>(0,0) = -xy1[i][j].x;
            a1.at<float>(0,1) = -xy1[i][j].y;
            a1.at<float>(0,2) = -1;
            a1.at<float>(0,3) = 0;
            a1.at<float>(0,4) = 0;
            a1.at<float>(0,5) = 0;
            a1.at<float>(0,6) = xy1[i][j].x*uv1[i][j].x;
            a1.at<float>(0,7) = uv1[i][j].x*xy1[i][j].y;
            a1.at<float>(0,8) = uv1[i][j].x;

            a2.at<float>(0,0) = 0;
            a2.at<float>(0,1) = 0;
            a2.at<float>(0,2) = 0;
            a2.at<float>(0,3) = -xy1[i][j].x;
            a2.at<float>(0,4) = -xy1[i][j].y;
            a2.at<float>(0,5) = -1;
            a2.at<float>(0,6) = uv1[i][j].y*xy1[i][j].x;
            a2.at<float>(0,7) = uv1[i][j].y*xy1[i][j].y;
            a2.at<float>(0,8) = uv1[i][j].y;
            
            //第j个点的a_x,a_y放进a中
            a1.copyTo(a.row(j));                // a的第0行、第1行、第2行
            a2.copyTo(a.row(PointVec_xy-1-j));  //108-0-1 a的第107行、第106行、第105行

        }
        Aall.push_back(a);//每幅图片中的a都放到Aall这个大容器里
    }

    //求解H矩陣 : a * H = 0
    for(int i = 0; i < image_count; i++)
    {
        Mat H_col = Mat(9,1,CV_32FC1,Scalar::all(0));
        Mat H3x3  = Mat(3,3,CV_32FC1,Scalar::all(0));
        
        SVD::solveZ(Aall[i],H_col); //奇异值分解
        H3x3.at<float>(0,0) = H_col.at<float>(0,0);
        H3x3.at<float>(0,1) = H_col.at<float>(1,0);
        H3x3.at<float>(0,2) = H_col.at<float>(2,0);
        H3x3.at<float>(1,0) = H_col.at<float>(3,0);
        H3x3.at<float>(1,1) = H_col.at<float>(4,0);
        H3x3.at<float>(1,2) = H_col.at<float>(5,0);
        H3x3.at<float>(2,0) = H_col.at<float>(6,0);
        H3x3.at<float>(2,1) = H_col.at<float>(7,0);
        H3x3.at<float>(2,2) = H_col.at<float>(8,0);
        
        H.push_back(H3x3);

程序实现转载于:
https://blog.csdn.net/weixin_38907150/article/details/86622175

②矩阵二范数实现:

float value = (double) norm(m2,NORM_L2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值