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

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

Homograph求解

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

②矩阵二范数实现:

float value = (double) norm(m2,NORM_L2);
### 关于SLAM14讲的学习笔记与资料 #### SLAM14讲的核心内容概述 《视觉SLAM十四讲》是一本深入浅出介绍视觉SLAM系统的书籍,涵盖了从基础理论到实际应用的多个方面。该书不仅讲解了相机模型、特征提取、位姿估计等基础知识[^1],还涉及到了非线性优化、滤波方法以及如何构建一个完整的SLAM系统框架[^2]。 #### 数据结构与多线程处理的重要性 为了确保SLAM系统的稳定性和效率,《视觉SLAM十四讲》强调了合理设计数据结构的重要性,并通过引入“锁”机制来解决并发访问中的冲突问题。此外,书中提到可以通过单独开启线程的方式运行后端优化程序,从而提高整体性能。 #### 可视化工具的选择 对于初学者而言,选择合适的可视化工具能够极大地提升开发体验。Pangolin作为一个轻量级的OpenGL封装库,提供了强大的3D渲染功能和支持多种视频流输入的能力,非常适合用来展示SLAM过程中的地图点云和轨迹信息[^3]。 #### 推荐资源列表 以下是几类推荐给希望深入了解《视觉SLAM十四讲》相关内容的学生或工程师: 1. **官方配套代码** 作者高博在其GitHub仓库中公开了大部分章节对应的实现代码,这对于理解抽象概念非常有帮助。 2. **在线课程平台上的解读系列** 如B站上存在许多UP主针对每章知识点录制的教学视频,配合纸质教材观看效果更佳。 3. **社区讨论区和技术博客** 许多名字带有“SLAM”的技术论坛里经常能看到围绕本书展开的技术探讨帖,其中不乏高质量的回答可以帮助解答疑惑之处。 ```python import numpy as np from scipy.optimize import least_squares def reprojection_error(x, camera_matrix, points_3d, points_2d): """ 定义重投影误差函数作为最小二乘法的目标函数之一 参数: x (array): 待求解参数向量(包含R,t) ... 返回值: array: 所有点计算得到的残差组成的数组 """ R_vec = x[:3] t = x[3:] # 将旋转向量转换成旋转矩阵 from cv2 import Rodrigues _, R = Rodrigues(R_vec) projected_points = [] for pt in points_3d: temp = np.dot(camera_matrix, np.dot(R, pt) + t).reshape(-1,) projected_points.append(temp / temp[-1]) errors = [(p_proj - p_obs)[:2] for p_proj, p_obs in zip(projected_points, points_2d)] return np.array(errors).flatten() ``` 上述代码片段展示了基于`scipy`库完成的一个简单的重投影误差定义及其优化调用方式的例子。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值