- 博客(37)
- 收藏
- 关注
原创 OpenVINS IMU Propagation Derivations 学习小记
这里面比较难看懂的就是姿态的误差状态传递,文档公式推导省略了很多公式特性,我在 github issue 里找到了一个更详细的。OpenVINS 文档链接:https://docs.openvins.com/propagation.html。
2023-05-28 21:18:13
280
原创 CUDA profiler 配置
变量如果不设置,可能会报 “No CMAKE_CUDA_COMPILER could be found” 的错误。不过这两个变量与具体编译环境相关,所以不建议直接在比较规范的 CMakeLists.txt 里面硬编码。这个编译选项是为了让 cuda 编译器生成源码信息,这样 Nsight Compute 才能找到并显示 C++ 源码,否则只能显示汇编代码。变量如果不设置,可能会报 “Failed to detect a default CUDA architecture” 的错误;
2023-05-10 20:07:53
970
原创 GDB 简略手册
杂项命令用法说明h[elp]help显示可用帮助文档h CMD显示关于指定命令的帮助apr[opos]apr REGEXP使用正则表达式搜索命令i[nfo]info显示可展示的信息ENTER无命令回车重复执行上一次命令断点命令用法说明info breaki b显示全部断点和检查点信息info watchi wat显示全部检查点信息b[reak]break在当前位置添加断点b N
2022-05-15 15:35:06
393
原创 【C++】头文件声明变量总结
类外变量// 1. 直接声明定义// 如果被多个 cpp 包含,则链接报错 (multiple definition)// int a = 0;// 2. static// 内部链接 (internal linkage),即每个包含本头文件的翻译单元都有一个单独的实例,互不影响static int a_static { 0 };// 3. const// 内部链接,并且无法修改const int a_const { 0 };// 4. extern// 外
2022-04-22 17:12:46
1982
原创 【C++】emplace_back vs push_back
C++11 引入了 vector::emplace_back(),此前 vector 只能调用 push_back 来添加元素。一个简单的示例来对比两者区别:#include <iostream>#include <vector>using namespace std;struct A { A() { cout << "Default constructor: " << val << endl; } A(int v) :
2022-03-29 19:49:48
1135
原创 【C++】如何强制指定函数的优化等级
在比较大的 C++ 工程中,为了提高程序执行效率,往往会使用 O2 或 O3 优化等级进行编译。同时为了调试程序,可以加入 “-g” 选项来保留 debug 符号。不过很多时候 O2/O3 优化会导致编译结果与源代码的结构差异很大,比如循环展开和指令集优化可能导致循环消失,函数内联导致无法跳转等,给 debug 过程带来很多麻烦。为此可以强制指定被调试的函数优化等级为 O0,不对整体程序性能产生太大影响的同时,使调试更加方便。对于 GCC 而言,有三种方法能指定函数优化等级:预处理器#pragma
2022-02-17 12:42:09
1362
原创 四元数乘法
四元数定义:q=qw+qxi+qyj+qzk=[qwqxqyqz]\bold{q} = q_w+q_xi+q_yj+q_zk =\begin{bmatrix}q_w\\ q_x\\ q_y\\ q_z\end{bmatrix}q=qw+qxi+qyj+qzk=⎣⎢⎢⎡qwqxqyqz⎦⎥⎥⎤在 Hamilton 表示法中:i2=j2=k2=ijk=−1ij=−ji=k, jk=−kj=i, ki=−ik=ji^2=j^2=k^2=ijk=-1 \\
2021-12-23 19:14:58
3394
原创 【踩坑】Win11 WSL2 中 meld 无法正常使用问题修复
Win11 中已经默认使用 wslg 来显示 WSL2 中的 GUI,不再需要额外开启 Xserver,这个确实是很方便实用的功能,但目前(2021.12)似乎还不是特别完美。我在体验的过程中就遇到了一个比较蛋疼的问题:meld 比较文件时出现异常。meld 是一个开源的用于比较文件/文件夹的工具,类似 Beyond Compare。它可以设置为 git merge.tool,从而用于解决 git 合并时的冲突。之前 Win10+WSL2+Xserver 环境中用 meld 一直都没遇到任何问题,但在 W
2021-12-15 16:06:10
1585
原创 LaTeX配置与使用
1. 安装软件包需要的软件包(archlinux/manjaro):texlive-core # Tex Live 核心发行版texlive-bin # Tex Live 应用程序texlive-langchinese # 中文支持texlive-latexextra # multirow 支持texlive-science # algorithm、algorithmic 支持安装命令:sudo pacman -S texlive-core texlive-bin texlive-lang
2021-09-22 16:44:31
1132
原创 【学习一下】HF-Net 训练
HF-Net 可以提取图像描述子(global_descriptors)和图像中的特征点(keypoints)及其描述子(local_descriptors),前者用于图像检索,后者配合 SuperGlue/NN 等特征匹配算法可用于相机位姿计算。因此 HF-Net 的应用场景就是 SLAM 中的地图定位与位姿恢复。虽然官方仓库已有完善的训练脚本和详细的使用说明,但有些细节还是需要注意的,在此记录一下。预先提醒:HF-Net 训练会产生 1.4TB 的中间数据,请确保数据盘有 1.5TB~2TB 的可用空
2021-08-24 16:02:06
3537
19
原创 【踩坑】Docker 部署 TensorFlow1.15.0 C++开发运行环境
最近在搞 HF-Net,无奈它发布的时间比较老(2019年),使用 TensorFlow 版本是 1.12(1.15.0 也能用)。为了在 C++ 上跑 HF-Net,需要搭建 docker 环境。docker 相对于物理机的好处有:目前物理机 cuda 版本往往比较高(10.1 以上),而低版本 tf 需要低版本的 cuda+cudnn。使用 docker 的话,对物理机只有显卡驱动的要求弄好了 docker 环境,能够很方便地分享给其他人,而不需要每个人都编译一次 tf,另外也方便部署到服务器上
2021-08-20 16:42:14
771
原创 【踩坑】docker 中使用 Nvidia GPU
OS: Manjaro 21.1.0 PahvoKernel: x86_64 Linux 5.10.56-1-MANJARO安装 Docker参考 How To Install Docker CE on Manjaro Linuxsudo pacman -S docker # 安装 docker-cesudo systemctl start docker.service # 开启 docker 服务sudo systemctl enable docker.service # 开机自启动 dock
2021-08-16 15:20:27
4292
原创 PyTorch模型C++部署
在生产环境中 PyTorch 模型经常需要部署在 C++ 程序中,目前我找的方法有三种:LibTorch: PyTorch 官方 C++ 库ONNX RuntimeOpenCV: DNN 模块示例网络本文以 PyTorch 官方教程中的 SuperResolution 模型为例,介绍模型在 C++ 中如何部署。模型结构如下:# Super Resolution model definition in PyTorchimport torch.nn as nnimport torch.nn.
2021-07-30 15:53:36
6034
6
原创 带默认模板实参的类模板与模板模板形参的匹配
首先解释一下这个看起来很奇怪的标题。“带默认模板参数的类模板”是指 Class template with default template-argument,即一个类模板的部分或全部模板参数有默认类型,比如:template<typename T1, typename T2 = int>struct Foo { };有个很典型的例子是 std::vector,它其实有两个模板参数:template<class T, class Allocator = std::allocat
2021-07-27 11:01:12
1858
原创 为什么 SIFT 算法在 OctaveLayers 为 1 时消耗更多的时间
本文是本人在 StackOverflow 上提的一个问题和回答,参见:Why SIFT costs more time with fewer octave layers?SIFT 算法原理有很多不错的资料都解释地很详细了,比如:SIFT特征提取分析 - Rachel-ZhangSIFT特征点提取 - 粼粼淇前段时间在使用 OpenCV SIFT 时,遇到一个有点反直觉的问题,特此记录。问题描述众所周知,SIFT 计算速度慢一直都是制约其应用的重要缺点。为了降低其计算时耗,我首先想到的是.
2021-07-22 15:05:16
545
1
原创 非参数化相机畸变模型简介
最近在看相机畸变模型相关的论文,其中有个叫非参数化模型的比较有意思:Schöps, Thomas, Viktor Larsson, Marc Pollefeys, and Torsten Sattler. “Why Having 10,000 Parameters in Your Camera Model Is Better Than Twelve.” ArXiv:1912.02908 [Cs], June 23, 2020. http://arxiv.org/abs/1912.02908.该论文还
2021-07-16 15:39:03
1253
1
原创 相机标定:关键点法 vs 直接法
相机标定中最常见的方法是关键点法,比如 OpenCV 和 MatLab 中使用棋盘格、圆阵列等二维图案进行标定,这上面的棋盘格角点和圆心就是所谓的关键点。虽然关键点法有很多优点,但在某些情况下容易遇到标定数据不够的情况,因此便有了基于光度误差的直接法相机标定。本文介绍了关键点法和直接法的大致原理和优缺点。关键点法原理关键点法计算相机参数的原理简单来说就是最小化重投影误差。相机成像过程可以表示为:u=π(T(x))\bold{u} = \pi\bigl(T(\bold{x})\bigr)u=π(T
2021-07-15 17:05:42
890
原创 Matlab标定板角点检测原理
角点检测是相机标定(棋盘格)中很重要的一个环节,很多人认为用 Matlab 标定相机比 OpenCV 更稳定,主要的原因之一便在于其角点检测方法。为此,我阅读了 Matlab 中角点检测相关源码(可以在“安装路径/toolbox/vision/vision/+vision/+internal/+calibration/+checkerboard”文件夹中找到),大致总结一下其原理。算法流程不管是什么角点检测方法(FAST,GFTT,…),都有一个类似的流程:角点响应计算:也就是计算每个像素点的“得分
2021-07-08 16:30:06
3518
原创 OpenCV使用 GenericIndex 进行 KNN 搜索
以前不了解 OpenCV 的 flann 模块,做 K-nearest-neighbour 搜索一直用的是 Github 上的一个很简单的实现:kd-tree。这个 KD tree 实现很简洁,仅有一个头文件,方便加入自己的工程,而且使用也特别方便。不过据说 cv::flann 实现的 KNN 速度更快,而且功能更加强大,所以大概看了一下怎么用。鉴于目前网上相关资料很少,而且基本上能找到的都是关于已经被弃用的 cv::flann::Index,OpenCV 官方文档也缺乏相关说明,我在这里记录一下自己所了
2021-06-29 17:55:09
811
2
原创 【OpenCV】使用 FileStorage 读写 Eigen 向量
在自己的 cpp 中加入以下代码:namespace cv {template <typename _Scalar, int _Dim>class DataType<Eigen::Matrix<_Scalar, _Dim, 1>> {public: typedef Eigen::Matrix<_Scalar, _Dim, 1> value_type; typedef Eigen::Matrix<typename DataType&
2021-06-16 10:51:58
238
原创 【Git】忽略已被仓库管理的文件的修改
问题描述我们知道 .gitignore 能够用来忽略未被 Git 仓库管理的文件/文件夹 (untracked files),也就是说,如果一个文件还没被加入到 Git 仓库中,而它的名字出现在 .gitignore 文件中,那么 git status 和 git add 等命令会自动忽略这个文件,就好像这个文件不存在一样。这一功能通常被用来排除一些不想加入到仓库中的临时文件,比如构建目录(build 文件夹)及 IDE 自动生成的文件/文件夹等。不过,还有一种情况是:有的文件我们希望加入到仓库中,但又
2021-06-02 15:05:59
1031
原创 圆整 round 的一点点小细节
圆整就是获得一个浮点数最接近的整数,所谓的“四舍五入”便是指的圆整。C++ 中可以调用 std::round 来实现。看起来很简单的操作是吧,其实里面有一些小细节的。std::round 不能在编译期间计算编译期(compile-time)计算和运行期(run-time)计算的概念想必大家都懂,如果一个函数能够在编译期间就计算得到结果(这样的函数叫做常量表达式函数 constexpr funciton),那就能够节省运行期的计算时间。某些情况下必须要求在编译期计算,比如模板参数:template &l
2021-03-31 20:48:47
1645
原创 稀疏 Harris 响应的 C++ 实现及 SSE 加速
前言Harris 响应值可以判断图像上的点是否“像一个角点”,通常用于角点检测,有时候也会在特征提取/匹配/跟踪算法中用于评估特征点质量的好坏,因为角点响应值大的点往往更适合特征匹配或者特征跟踪,OpenCV 的 ORB 检测器就是这样的。具体原理就不细说了,可以参见:Harris角点Harris响应的一点认识归结到公式就是:cov(x,y)=∑(u,v)∈W(x,y)w(u,v)[Iu2IuIvIuIvIv2]R=det(cov)−k∗trace(cov)cov(x,y)=\sum_{(
2021-03-09 22:08:46
500
原创 C++ 函数中获取输入的静态数组长度
假设有这么一种情况:程序中定义了一个静态数组,然后将这个数组作为参数传递给某个函数,如何在该函数中确定数组长度呢?int arr[] = { 1, 2, 3, 4, 5 };f(arr); // 如何在函数 f() 中确定 arr 的长度?C 语言中遇到这种情况,一般是直接将数组长度作为参数传递给 f():void f(int *arr, int n) {}int arr[] = { 1, 2, 3, 4, 5 };f(arr, 5);如果 arr 是动态数组,在 C++ 中确实也只能这
2021-03-02 20:59:48
698
原创 CMake 用户包注册 (User Package Registry)
CMake 工程中经常会调用 find_package 来使用外部包,通常为了让 CMake 能够直接找到一些常用的包,我们会将它们安装到系统路径,比如 /usr/local,但这么做往往在卸载的时候很难清理。如果我们不想将包安装到系统路径,又要在别的工程中调用这些包,该怎么办呢?(以下假设包名为 MyPackage,其配置文件 MyPackageConfig.cmake 所在路径为 /path/to/MyPackage,使用该包的工程为 MyProject)最直接同时也很常见的方法是:在 MyProj
2021-02-25 17:46:22
1507
1
原创 AUR 软件包依赖项更新问题解决
Arch Linux / Manjaro 系统的包管理系统有两个特点:1. 滚动更新,软件总是紧跟最新发布版本,更新频率高;2. 用户软件仓库(Arch User Repository,AUR)提供大量额外软件包。这两个特点是我喜欢 Arch/Manjaro 的重要原因,不过有事也会带来一些苦恼,其中之一便是依赖项更新导致的 AUR 包失效问题。由于 AUR 包是通过下载源码后本地编译安装的,如果其依赖项被更新,就会出现找不到依赖项的问题。比如 ros-noetic-desktop-full 包本身非常庞
2021-01-06 14:57:01
2624
原创 Learning CMake - 实例阐述如何构建 CMake 工程
目录前言CMake 工程目录结构前言CMake 是什么以及它的重要性无需多言,现在可以说大部分开源 C++ 工程都是用 CMake 来组织的。随着版本的不断更新,CMake 功能变得越来越丰富、严谨,同时也变得更加复杂。由于 3.1 版本后添加了大量新特性,很多原先常见的做法变成不推荐(比如include_directories),甚至诞生了 “Modern CMake” 的概念,倡导全面使用新的、更加优雅的方法代替之前老旧的用法。看到这篇文章的人想必早就不是那个只会 mkdir build; cd
2020-12-21 00:08:34
836
原创 SSE学习-一个小栗子
指令集优化在高性能计算中至关重要,所以用 C/C++ 到后面感觉难免要用上指令集。虽然指令集学习和使用都不太容易,但想一想能够在不增加 CPU 占用的情况下提升数倍计算速度,确实挺诱人的。具体指令集是啥就不多介绍了,几个名词:SIMD: 单指令多数据,即指令集加速技术SSE: Streaming SIMD Extensions, 使用128位寄存器的指令集(Intel)AVX: Advanced Vector Extensions, 使用256位寄存器的指令集(Intel)Neon: ARM 上
2020-10-16 12:28:42
964
原创 利用 CPU 流水线加快数据处理
最近看 OpenCV 源码时注意到一个有意思的地方:template<typename T, size_t BinsOnStack = 0u>static double getThreshVal_Otsu( const Mat& _src, const Size& size){ const int N = std::numeric_limits<T>::max() + 1; int i, j; #if CV_ENABLE_UNROLLED
2020-09-24 18:10:44
781
翻译 你自己的 error_code
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言问题前言最近我在用std::error_code给自己的应用实现“错误状态分类”功能,这里分享一下我的一些经验和见解。C++11 提供了一个非常精妙的错误状态分类机制,你也许已经见过一些相关的名词,比如“error code”、“error condition”、“e
2020-09-15 22:20:47
4680
2
原创 使用MinGW(MSYS2)在Windows上部署Linux C++程序
目录前言MinGW 是什么前言很多人都觉得 Linux 相比于 Windows 而言更适合开发,但由于 Windows 在 PC 上占有量巨大,一些程序即使原本在 Linux 上开发的,最终往往需要部署到 Windows 环境。面对这样的跨平台需求,比较常见的操作是用宏来控制程序的编译:#if defined(_MSC_VER) || defined(_WIN32) || defined(_WIN64)#define DLL_EXPORT __declspec(dllexport)#else#d
2020-09-09 21:58:48
4191
原创 C++判断一个类是否继承自另一个类
文章目录前言std::is_base_of基类带模板的情况前言派生类会继承基类的接口,所以我们经常会把一个基类派生出的多个派生类当作同一个类别。在某些函数或者类中,我们可能希望只支持某一类别的输入,即只支持某个类型或者这个类型的派生类,此时就需要判断输入类型是否继承自目标类型。考虑这样一种情形:线条(Line)由一系列点构成,而“点”可以有多种类型:圆点(Dot)、星点(Star)…,另外还有一种类型“平面”(Plane)则不是一种“点”,它们定义如下:class Point { };class
2020-09-03 16:14:33
8890
原创 STL容器初始化可以更快
文章目录前言一、容器初始化做了什么?二、取消元素初始化时间消耗1. 将基础数据类型封装成类2. 自定义 allocator总结前言用 C++ 的同学对 STL 容器(vector, map, …)一定不陌生,但很少有人会关注容器初始化的效率。最近在读《并行程序设计 - 概念与实践》1,里面提到当容器元素非常多时,其初始化的时间消耗其实不容小视。一、容器初始化做了什么?std::vector<uint64_t> lst(total);以 vector 为例,上面这行代码定义了一个元素
2020-08-26 19:54:53
593
原创 三维坐标变换——旋转矩阵与旋转向量
用 opencv 进行过双目相机标定的同学都知道,单目标定 calibrateCamera() 函数能够对每一张标定图像计算出一对 rvec 和 tvec,即旋转平移向量,代表世界坐标系到相机坐标系的转换关系。而 stereoCalibrate() 函数则可以计算出旋转矩阵 R 和平移向量 T,代表左右相机坐标系之间的转换关系。同样是坐标变换,平移倒总是向量,但旋转怎么有时是向量,有时又是矩阵呢?...
2018-02-24 23:25:17
74849
15
转载 shell学习:从ini文件中读取参数
打算编写一个shell脚本来自动备份网站,需要从配置文件中读取一些参数,比如数据库名称、用户名和密码等。我分析了一下wdcp自带的数据库备份脚本mysqlbackup.sh,里面仅仅从文件mrpw.conf中读取了数据库密码,只用到了cat而已:mrpw=`cat /www/wdlinux/wdcp/conf/mrpw.conf`这个方法虽然简易,但总不能每一个参数都用一个文件来保存吧
2018-01-21 18:21:21
9498
1
原创 标准椭圆方程推导
初衷用opencv拟合椭圆后,想评估一下拟合的质量,即被拟合点与拟合结果的接近程度。我首先想到的办法是将被拟合点带入椭圆方程 f(x,y)=Ax2+Bxy+Cy2+Dx+Ey+Ff(x,y)=Ax2+Bxy+Cy2+Dx+Ey+Ff(x, y) =Ax^2+Bxy+Cy^2+Dx+Ey+F,如果一个点正好在椭圆上,那么 f(x,y)=0f(x,y)=0f(x, y) =0,而一个点偏离椭圆越多...
2018-01-21 18:10:49
11715
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人