任务 大创项目需要实现硬件处理图像,则前期准备工作配置环境,使用32位cpu适用的库文件。但近期的版本官网没有直接提供,需要从源码直接编译。 此前更多是在linux环境进行build from source操作,因此这也是进行一次windows环境下的尝试。期间遇到了不少问题,下面是无误操作。 过程 由于下载的开源人脸识别seetaface工程是win32的配置,我先入为主,想要完成的是win32,但现在发现win32相对与x86范围更窄: win32是指windows 32位的操作系统,顾名思义是支持32为CPU的操作系统。x86是指CPU的位,X86是指32位的CPU.x64指64位CPU,一个是指操作系统,一个是指CPU。 win32、x86的区别 不过操作过程应该只需要进行替换对应位置选项即可,后期实现进行更新。 下载 https://opencv.org/releases/ 官网下载👆所需版本的源文件(sources) https://cmake.org/download/ 官网下载👆windows平台下的cmake 编译 主要参考文章:Windows32位系统下 Vs2015 配置Opencv 相关官方文档:https://docs.opencv.org/3.4.12/d3/d52/tutorial_windows_install.html 参考文章的过程很详尽,但遗漏了最初一张步骤截图,找猫画虎会有问题: 即:重点要选择generator的platform为自己的目标平台 此后的步骤与文章一致即可 最终是能全部成功生成的,而此前总会出现的fatal error LNK1112: 模块计算机类型“x86”与目标计算机类型“x64”冲突没有出现 配置 新建项目进行测试,需要对项目的属性管理器进行相关配置:包含目录、库目录分别添加上述编译过程中产生的对应目录 动态编译链接库加入生成的**world**.dll,当然,还需要将它加入系统的环境变量中的path,否则会运行报错: 由于找不到opencv_world320d.dll, 无法继续执行代码 环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。比如path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找
Category: C/C++
SLAM学习-应用齐次坐标实现矩形平移
任务 了解齐次坐标在三维空间的优势,以及在计算机图形学中的应用后,进行实战练习:利用键盘读取方向输入,控制矩形平移,其中矩形的坐标以齐次坐标形式表达. 齐次坐标 优势 便于表达某点是否在直线上 表达直线和直线交点,平面和平面交线 区分向量和点 能表示无穷远 欧式变换中的旋转和平移:由加法到乘法 注意问题 旋转和平移先后顺序有区别 经过了坐标变换之后: 缩放变换不改变坐标轴的走向,也不改变原点的位置,所以两个坐标系仍然重合。 旋转变换改变坐标轴的走向,但不改变原点的位置,所以两个坐标系坐标轴不再处于相同走向。 平移变换不改变坐标轴走向,但改变原点位置,两个坐标系原点不再重合。 坐标变换的顺序必须是: 缩放->旋转->平移 实际演练 完整代码 实现效果 参考文章 从零开始一起学习SLAM | 为什么要用齐次坐标? 齐次坐标的理解 2D Translation in Computer Graphics | Definition | Examples Eigen学习(六)高级初始化 【OpenCv】cvWaitKey获取键盘值 OpenCV doc of waitKey()
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的使用方法