《SLAM十四讲》第四讲讲后作业

1、图像去畸变

在这里插入图片描述
结果:
Code
undistort_image.cpp

 			// start your code here 将图像像素坐标转换成相机坐标
            double x = (u -cx)/fx;
            double y = (v -cy)/fy;
            //半径r
            double r_2 = x*x+y*y;
            double x_distorted = x*(1+k1*r_2+k2*r_2*r_2);
            double y_distorted = y*(1+k1*r_2+k2*r_2*r_2);
            //将相机坐标转化为像素坐标
            u_distorted = x_distorted*fx+cx;
            v_distorted = y_distorted*fy+cy;
            // end your code here

CMakeLists.txt

cmake_minimum_required(VERSION 3.5.1)
project(undistort_image)

set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(undistort_image undistort_image.cpp)

target_link_libraries(undistort_image ${OpenCV_LIBRARIES})

在这里插入图片描述

2、双目视差的使用

在这里插入图片描述
结果:
disparity.cpp

 //start code
   unsigned int d=disparity.at<uchar>(v,u);
   //视差图disparty中(v,u)点,带有视差信息d,其视差d用像素值来表达0-255之间
   if(d ==0)
    continue;  //视差d=0表示该点没有深度不用估计
   cout<<d<<endl;
  //基线长度b=0.573  Z=fb/d  f是内参--焦距,b是基线长度,d是视差
  double z=(f*b*1000)/d;

  point[2]=z;
   point[0]=(u-cx)*z/fx;
  point[1]=(v-cy)*z/fy;
  pointcloud.push_back(point);
       
  // end your code here

CMakeLIsts.txt

cmake_minimum_required(VERSION 3.5.1)
project(disparity)

set(CMAKE_CXX_STANDARD 11)

find_package(OpenCV REQUIRED)
find_package(Pangolin REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${Pangolin_INCLUDE_DIRS})
include_directories("/usr/include/eigen3")

add_executable(disparity disparity.cpp)
target_link_libraries(disparity ${OpenCV_LIBRARIES} ${Pangolin_LIBRARIES})

结果展示
在这里插入图片描述

3、矩阵微分

在这里插入图片描述
解答:
(1)
将AX对X的每一个分量求偏导,构成一个超向量。注意该向量的每一个元素都是一个矩阵。
此处:
矩阵Y对标量x求导:
相当于每个元素求导数后转置一下,注意M×N矩阵求导后变成N×M
Y = [y(ij)] --> dY/dx = [dy(ji)/dx]
在这里插入图片描述
(2)
在这里插入图片描述

4、高斯牛顿法的曲线拟合实验

在这里插入图片描述
接答:
gaussnewton.cpp

  for (int i = 0; i < N; i++) {
            double xi = x_data[i], yi = y_data[i];  // 第i个数据点
            // start your code here
            double error = 0;   // 第i个数据点的计算误差
            //error = 0; // 填写计算error的表达式
            error=yi - (exp(ae * xi * xi + be * xi + ce));
            Vector3d J; // 雅可比矩阵
            //J[0] = 0;  // de/da
            //J[1] = 0;  // de/db
            //J[2] = 0;  // de/dc
            J[0]=-xi*xi*exp(ae * xi * xi + be * xi + ce);
            J[1]=-xi*exp(ae * xi * xi + be * xi + ce);
            J[2]=-exp(ae * xi * xi + be * xi + ce);
            cout<<"j: "<<J<<endl;
            H += J * J.transpose(); // GN近似的H
            b += -error * J;
            // end your code here

            cost += error * error;
        }

        // 求解线性方程 Hx=b,建议用ldlt
 	// start your code here
        Vector3d dx;
        cout<<"H:"<< H<<endl;
        cout<<"B:"<< b<<endl;
        dx = H.ldlt().solve(b);
	// end your code here

结果:

estimated abc = 0.890912, 2.1719, 0.943629

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值