Protobuf反射详解

所谓反射机制,就是能够在运行时知道任意类的所有属性和方法,能够调用任意对象的任意方法和属性。这种动态获取的信息以及动态调用对象方向的功能称为反射机制。

不像Jave等语言,C++本身没有反射机制,在使用C++版本Protobuf时,protobuf通过proto文件产生响应的message和service,protobuf可以通过proto文件提供反射机制,程序在运行时可以通过proto获取任意message和任意service的属性和方法,也可以在运行时调用message的属性和方法。

阅读更多

从旋转矩阵计算欧拉角

旋转矩阵和欧拉角之间的正向转换关系比较好推理,而逆向变换就显得不是那么容易了。这篇博客介绍由旋转矩阵计算欧拉角的方法,参考了一篇Paper:Computing Euler angles from a rotation matrix。Paper本身介绍的还是比较清楚的,这篇博客最后附了转换计算的代码,包括文章作者提供的Matlab版本和博主提供的C/C++版本,希望能有用。

阅读更多

Scikit-learn学习笔记(三)从高维度观测数据进行预测

上一篇博客我们完成了一个六行的SVM,对python中数据和估计器等概念有了认识,这篇博客将更加详细的对sklearn的训练进行解释,同时也按照官网例程运行KNN和SVM等具有代表性的demo。

这节笔记对应的官网教程为: Statistical learning: the setting and the estimator object in scikit-learn 和 Supervised learning: predicting an output variable from high-dimensional observations

–官网文档– –官网教程–

阅读更多

Scikit-learn学习笔记(二)入门例程,估计器

在上一篇博客我们搭起了环境,这篇博客将以最简介的代码快速上手sklearn。

这节笔记摘自官网Quick-Start的教程:An introduction to machine learning with scikit-learn。比起官网教程,这篇博客首先会概述基础概念,帮助快速理解和上手。话不多说,开始吧。

–官网文档– –官网教程–

阅读更多

ROS学习笔记(一)ROS环境搭建

ROS:Robot Operating System

ROS是开源的机器人次级操作系统,其设计的首要目标是在机器人研发领域提高代码复用率,是一种分布式处理框架(Nodes)。它提供类似于操作系统所提供的功能,包含硬件抽象描述、底层驱动程序管理、共用功能执行、程序间的消息传递、程序发行包管理等。

ROS提供多语言支持,利用简单的、语言无关的接口定义消息传送。ROS还利用了很多已经存在于开源项目的代码,如OpenCV中借鉴视觉算法、从OpenRAVE借鉴了规划算法等。DJI、iRobot等机器人公司都在使用ROS。

阅读更多

PCL实现SAC-IA点云初始配准

随机采样一致(ransac)算法是一种随机性的参数估计算法,利用Ransac可以实现采样一致性初始配准(SAC-IA)。采样一致性初始配准(SAC-IA)给出一个初始预估的刚性(Rigid)变换矩阵,为更精确的位姿估计算法(如ICP等)提供初始配准状态。

PCL点云库中封装了丰富的点云数据处理函数,利用PCL实现初始点云配准较为容易,于是博主就也实验了一下,效果还不错,就是时间耗费的问题,大概2000个点,迭代2000次,花了5s,实在是太慢了,代码托管在github,比较初级,欢迎指教。

阅读更多

点云滤波方法

点云滤波是点云处理的基本步骤,也是进行high level三维图像处理之前必要的预处理。其类似于信号处理中的滤波,单实现手段却和信号处理不一样,主要有以下几方面原因:

  1. 点云不是函数,无法建立横纵坐标之间的关系
  2. 点云在空间中是离散的,不像图像信号有明显的定义域
  3. 点云在空间中分布广泛,建立点与点之间的关系较为困难
  4. 点云滤波依赖于集合信息而非数值信息

    阅读更多

PCL读取点云并可视化

这篇博客提供一个PCL读取点云并可视化的最简Demo,并提供扩充学习资料的链接。其中点云读取比较简单,而可视化比较复杂。

PCL的可视化类有好几号,最强大的是PCLvisualizer,这个类是这篇博客的主要内容。如果只是简单显示点云,可以不需要PCLvisualizer类,调用CloudViewer就可以了。CloudViewer的调用过程更加简单直接,PCLvisualizer更加强大,功能更加丰富。

PCLvisualizer还可以设置鼠标键盘操作回调函数,功能之多,并且开源的PCL也在不断丰富和完善,所以在调用PCLvisualizer时,大部分编程是需要参考文档手册的。

阅读更多

八叉树OcTree

在描述三维场景的过程中常常用到一种名为八叉树的数据结构。描述三维空间的八叉树和描述二维空间的四叉树有相似之处,二维空间中正方形可以被分为四个相同形状的正方形,而三维空间中正方体可以被分为八个形状相同的正方体。

八叉树的每个结点表示一个正方体的体积元素,每一个结点有八个子节点,这种用于描述三维空间的树装结构叫做八叉树。为了便利的点云操作,八叉树OcTree被封装在PCL库中。

阅读更多

LeetCode_146: LRUCache 使用STL-list

在LeetCode的题目中,考察list操作的比较少,所以这道题也算是经典了,只有17%的通过率也足以说明问题。STL的list模板是一个环形双链表,其支持链表的基本操作,并且封装了reverse、sort、merge、splice等算法,为链表的操作提供许多遍历,这篇博客会根据在STL源码分析中的内容进行简单介绍。

阅读更多

算法导论总结(五)散列表

LeetCode刷了两百多题,再来一波总结,题目刷多了很多不做笔记就忘记了,这里也算是巩固一下。这一节主要总结散列表类型的题目。散列表、桶排序等算法最大的特点就是时间复杂度是O(1)。这对于需要考虑算法时间复杂度的题目来说提升是常常需要考虑的方法。这篇博客没有太多原理的解释,都是对着题目做的随手笔记 ,比较乱,请见谅。

阅读更多

LeetCode_210: CourseScheduleII 拓扑排序

这道题与前一版本207一样,只不过前一版本要求判断是否有环,而当前版本还要给出可行顺序,那么这个问题就自然而然的归为拓扑排序了。这篇博客将对有向图和无向图中是否存在环这一问题进行归纳,并且给出一个较为简洁的拓扑排序代码。拓扑排序,简单的说就是不断将度为0的点提取出来,提取的顺序就是拓扑排序。在算法导论中,给出了DFS和BFS解法,其中DFS采用完成时间倒序作为拓扑排序,我们需要了解拓扑排序问题的解法是多样的,这篇博客给出的代码不算唯一的。

阅读更多

算法的嵌入式移植(一)C代码优化

一般C/C++的算法代码不适合直接移植到嵌入式设备,需要做一些优化和处理。一方面是出于速度考虑,另一方面是针对嵌入式设备支持的语言特性差异进行修改,还有就是硬件上的考虑,比如就定点DSP而言,就需要将原来的浮点运算进行转化。

近期博主在整理以往笔记,就将算法嵌入式移植这部分差分成两个章节,一是C代码优化部分,二是DSP代码移植部分,第一章节是语言层面的一般而言是适合所有嵌入式设备的,第二章节是和DSP开发环境相关方面的。特此整理,谨供参考。

阅读更多

OpenCV特征点提取算法对比

除了我们熟知的SIFT、SURF、ORB等特征点提取算法,OpenCV中还提供了十余种特征点提取算法。最近在整理以往的ppt和报告,看到其中一页ppt,发现已经忘得差不多了,就再写篇博客复习下好了,这篇博客注重对比,技术方面的内容不会太过细致,希望能有帮助。当然,文章末尾会提供这些算法OpenCV调用的实例代码。
首先,引发内容的就是下面这张ppt:(不要注意Why Surf了,当时根据具体应用场景所做的选择)左边一栏是特征点的数目,右边一栏是检测的速度,数据是在博主自己的测试集(大概四五百张图片)上测试的。

阅读更多