任务 了解齐次坐标在三维空间的优势,以及在计算机图形学中的应用后,进行实战练习:利用键盘读取方向输入,控制矩形平移,其中矩形的坐标以齐次坐标形式表达. 齐次坐标 优势 便于表达某点是否在直线上 表达直线和直线交点,平面和平面交线 区分向量和点 能表示无穷远 欧式变换中的旋转和平移:由加法到乘法 注意问题 旋转和平移先后顺序有区别 经过了坐标变换之后: 缩放变换不改变坐标轴的走向,也不改变原点的位置,所以两个坐标系仍然重合。 旋转变换改变坐标轴的走向,但不改变原点的位置,所以两个坐标系坐标轴不再处于相同走向。 平移变换不改变坐标轴走向,但改变原点位置,两个坐标系原点不再重合。 坐标变换的顺序必须是: 缩放->旋转->平移 实际演练 完整代码 实现效果 参考文章 从零开始一起学习SLAM | 为什么要用齐次坐标? 齐次坐标的理解 2D Translation in Computer Graphics | Definition | Examples Eigen学习(六)高级初始化 【OpenCv】cvWaitKey获取键盘值 OpenCV doc of waitKey()
Tag: slam
SLAM学习-C++新特性
任务 请使用C++新特性改写以下函数。该函数功能:将一组无序的坐标按照“Z”字形排序,并输出。 本程序学习目标:熟悉C++新特性(简化循环、自动类型推导、列表初始化、lambda函数) 题目来源: 从零开始一起学习SLAM | C++新特性要不要学? sort()函数 定义在 algorithm 头文件中的函数模板 sort() 默认会将元素段排成升序 对[first,second)之间的元素进行排序,需要能提供随机访问迭代器的容器如vector,array, deque等.如果提供comp比较器函数,便可根据该函数的要求排序. comp/cmp 可以直接通过<algorithm>中提供的equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>库函数实现不同方式 的排序. 也可以通过自定义cmp()实现非基本数据类型的比较方式定义,如下面例子所示,实现: 首先比较第一位大小,小者在前 若第一位相同,再比较第二位 完整代码 结果展示 优化 参考博文C++排序函数中cmp()比较函数详解 思考:int 和const int&有什么区别呢?原来:作为函数参数:int这种写法是值传递,const int&则是引用传递。“值传递”——由于函数将自动产生临时变量用于复制该参数,效率较低。“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。效率较高。tips:“引用传递”有可能改变参数,const修饰可以解决这个问题。 可以在cmp()的定义处采用引用传递,即: 参考文章 C++ sort(STL sort)排序算法详解 sort-C++ reference c++sort函数的使用总结 C++排序函数中cmp()比较函数详解
SLAM学习——eigen库实现四元数与旋转矩阵的转换
编程实现:
输出四元数对应的旋转矩阵、旋转矩阵的转置,旋转矩阵的逆矩阵,旋转矩阵乘以自身的转置,验证旋转矩阵的正交性。
SLAM学习-文件按序批量重命名
任务 我们知道SLAM是处理序列图像的,有时候需要格式化的图像名字用作输入。前面提到的TUM的RGB-D数据集中图像是根据时间命名的,请从下面链接下载数据集fr1/desk https://vision.in.tum.de/data/datasets/rgbd-dataset/download# 并解压。请编程实现将文件夹/rgb下以时间命名的序列图片重新命名为0000-9999的格式。 题目来源:从零开始一起学习SLAM | 学习SLAM到底需要学什么?-计算机视觉life Linux下C++实现文件批量重命名 获取所有文件名findFileNames 虽然给出DIR为__dirstream的别名,但在本地的头文件中寻找不到后者的定义,是不透明的数据类型.dirent结构体: 首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。1 当使用readdir(pDir)时,pDir中指向文件指针后移,通过rewinddir(pDir)可以复位.3 c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同.(其实它指向的是string对象内部真正的char缓冲区),所以返回const,以防止用户的修改。这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。2对于strcmp()函数,需要const char*类型的输入,因此可以通过c_str()将string类型变量得到该类型内容 此外,可以通过递归访问一个路径下包括子目录在内的所有文件,如注释所示. 批量重命名bulkRename 由于题目要求修改的数字需要补零,因此封装函数fillNum()完成工作.5 ‘setw’ is not a member of ‘std’ 需要引入头文件iomanip 使用iterator遍历所有文件名 可以通过sort()函数将vector容器中的文件名排序,需要头文件<algorithm>6 通过函数rename()将系统文件重命名,需要头文件<cstdlib>4 效果展示 完整代码 参考 [1] Linux下DIR,dirent,stat等结构体详解 [2] c++ string.c_str()小结 [3] C语言readdir()函数:读取目录函数 [4] C++修改文件名 [5] 字符串前面自动补零? [6] C++ 中vector的使用方法