欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从0开始(一)

程序员文章站 2024-01-12 12:16:46
...

从0开始(一)

这个图说明了很多问题。毕竟是知识树,把知识面都展示地很清楚,要学的东西真特么多。

先把简单的作业2贴上来吧,毕竟简单。

题目2

已知相机的位姿用四元数表示为q=[0.35,0.2,0.3,0.1],顺序为x,y,z,w,请编程实现:

输出四元数对应的旋转矩阵、旋转矩阵的转置,旋转矩阵的逆矩阵,旋转矩阵乘以自身的转置,验证旋转矩阵的正交性。

从0开始(一)

初始化顺序的是 w,x,y,z。

本程序学习目的:

熟悉cmake的使用、学习eigen的基本操作;根据实践验证旋转矩阵的约束

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Geometry>

int main(int argc, char **argv) {
    Eigen::Quaterniond quat(0.1,0.35,0.2,0.3);
    quat.normalize();
    std::cout<<quat.matrix()<<std::endl;
    Eigen::Matrix3d Rotation = quat.toRotationMatrix();
    std::cout<<Rotation<<std::endl;
    Eigen::Matrix3d RotationT = Rotation.transpose();
    std::cout<<RotationT<<std::endl;
    Eigen::Matrix3d RotationI = Rotation.inverse();
    std::cout<<RotationI<<std::endl;
    
    std::cout<<Rotation*RotationT<<std::endl;
    
    return 0;
}

补充点东西:

 

比较简单,需要注意的点:

  • 四元数的初始化
  • 四元数使用前一定要归一化
  • 引入Eigen模块 #include <Eigen/Core>

看下CMakeList.txt:

cmake_minimum_required(VERSION 2.6)
project(homework2)
include_directories("/usr/include/eigen3")
add_executable(homework2 main.cpp)


install(TARGETS homework2 RUNTIME DESTINATION bin)

要注意的点:

  • include_directories要在add_executable之前
  • Eigen仅由头文件组成,不需要链接库
  • Eigen头文件默认在 /usr/include/eigen3

题目1

我们知道SLAM是处理序列图像的,有时候需要格式化的图像名字用作输入。前面提到的TUM的RGB-D数据集中图像是根据时间命名的,请从下面链接下载数据集fr1/desk

https://vision.in.tum.de/data/datasets/rgbd-dataset/download#

并解压。请编程实现将文件夹/rgb下以时间命名的序列图片重新命名为0000-9999的格式。

 

本程序学习目的:

熟悉cmake的使用、OpenCV读写操作、C++的string操作

代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <vector>


using namespace std;
using namespace cv;

int main(int argc, char **argv) {
    cv::String path = "/home/weiyanzhi/projects/homework1/rgbd_dataset_freiburg1_desk/rgb/";//待处理图片路径
    cv::String dest = "/home/weiyanzhi/projects/homework1/rgbd_dataset_freiburg1_desk/rgb/";//保存处理后的图片路径
    cv::String savefilename;
    vector<cv::String> filenames;
    cv::Mat srcImg,dstImg;
    
    cv::glob(path,filenames);//glob将路径里面的图片读入到vector上
    //void cv::glob ( String pattern,std::vector< String > & result,bool recursive = false),原函数的声明
    
    for(int i = 0;i<filenames.size();++i)
    {
      srcImg = cv::imread(filenames[i]);
      srcImg.copyTo(dstImg);
      if(i<10)
      {
	savefilename = dest+"000"+std::to_string(i)+".png";  //cv::String的拼接
	cv::imwrite(savefilename,dstImg);  //保存路径+图片
      }
      if(i>=10&&i<99)
      {
	savefilename = dest+"00"+std::to_string(i)+".png";
	cv::imwrite(savefilename,dstImg);
      }
      if(i>=100&&i<999)
      {
	savefilename = dest + "0"+to_string(i)+".png";
	cv::imwrite(savefilename,dstImg);
      }
      if(i>=1000&&i<9999)
      {
	savefilename = dest + to_string(i)+".png";
	cv::imwrite(savefilename,dstImg);
      }
      
    }
    return 0;
}

这个有几个注意点:

  • cv::String用法和std::string差不多,初始化方式见识一下
  • cv::glob用法了解一下,这个是解决问题的关键

看下CMakeList.txt:

cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_FLAGS "-std=c++11 -O2")
project(homework1)

# 寻找OpenCV库
find_package(OpenCV REQUIRED)
# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(homework1 main.cpp)
target_link_libraries(homework1 ${OpenCV_LIBS})

install(TARGETS homework1 RUNTIME DESTINATION bin)

注意的点:

  • OpenCV 的find_package用法 find_package(OpenCV REQUIED)
  • OpenCV添加头文件 include_directories(${OpenCV_INCLUDE_DIRS})
  • OpenCV链接库文件 target_link_libraries(目标文件 ${OpenCV_LIBS})

用多了,差不多yegai记住了吧。。。

相关标签: 从零开始学习SLAM