OpenCV系列(二):基本数据结构

常用的OpenCV数据结构像Mat,Point等我们并不陌生,但最近仔细阅读OpenCV手册后发现有些数据结构的一些便捷操作以及一些新加入的功能自己并没有掌握,这里做个记录算是学习笔记。

众多的类模板

我们平时常用的数据结构像Point,Rect其实是类模板某一数据类型的实例。比如Point对应Point_<int>Rect对应Rect_<int>。 这里就简单罗列一下Point对应的定义:

1
2
3
4
typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;

而且,Point也重载了加减乘除等操作运算符,比如:

1
2
3
4
5
6
7
Point pt1,pt2,pt3;
int a;
pt1 = pt2 + pt3, pt1 = pt2 - pt3;
pt1 = pt2 * a, pt1 = a * pt2;
pt1 += pt2, pt1 -= pt2, pt1 *= a;
double value = norm(pt); // L2 norm
pt1 == pt2, pt1 != pt2;

Read More

OpenCV系列(一):简介

一直都想系统全面地学习一下OpenCV,但却迟迟懒于行动,虽然平时也用OpenCV的一些东西,但毕竟没有对其没有一个全面的把握。这次借此机会打算参考OpenCV手册系统地整理一下自己的学习心得。

OpenCV主要模块

OpenCV主要包括core,imgproc,video,cliab3d,feature2d,objdetect,highgui,gpu等几个模块,其中

  • core 主要是图像的一些基本数据结构如Mat,Point,Rect等及其相应的操作;
  • imgproc 主要包括一些针对图像的基本处理,像线性或非线性的图像滤波,几何形变操作(如尺寸变化,仿射变换等);
  • video 主要包括运动估计,背景差分法跟踪,以及一些其他目标跟踪算法;
  • calib3d 主要是多视角几何,单目相机和双目相机的参数标定,目标姿态估计,立体匹配和三维重建方面的算法;
  • feature2d 主要包括基于特征点的检测器,特征点的提取和匹配。objdetect主要包括检测目标或是特定的目标(像人脸,行人等);
  • highgui 包括视频和图像的读写,以及一些简单的UI功能;
  • gpu 主要是一些视觉算法基于GPU加速的实现。

    Read More

一个关于visual tracking的benchmark

自从工作后,就很少接触visual tracking这个领域了。最近下班没事,浏览博客看到几篇CVPR2013关于visual tracking的paper,其中有一篇名为Online Object Tracking: A Benchmark的paper对目前该领域几乎大部分优秀算法做了一个分析和评估,提出了更为严谨合理的评估方法。作者是University of California at Merced的一个博士后,以前好像是自动化所的一个博士。他针对29个算法,测试了50个视频,并且标记了所有视频的groundtruth,其耐心和毅力值得敬佩。

分析算法特性

当然,作者不是简单的罗列出所有的算法,而是针对目前的存在的算法,总结出四个模块:Representation Scheme,Search Mechanism,Model Update,Context and Fusion of Trackers。个人觉得前三个模块的确是visual tracking最重要的部分,Representation Scheme方面,算法的提出相对热闹些:基于图像原始像素值(如Lucas and Kanade稀疏点的光流法),直方图(如color histograms, histograms of oriented gradients (HOG)等),Harr-like特征,binary feature,基于sparse representation等等。Search Mechanism方面,可以用的方法相对就会比较单一。对于跟踪算法是基于最优化函数框架的算法,跟踪物体的位置通过local optimum search确定位置。而对于算法是基于binary classifier的,方法主要有两种:particle filter和dense sampling search。Model Update方面,对于binary classifier就是训练样本的更新。对于subspace-based tracking就是物体外观图像块的update。

Read More

几种生成随机数的方法

随机数在很多程序中经常被用到,但每次用到的时候,由于没有系统的总结,总是得重新查阅,所以这次打算系统的介绍一下c/c++中如何产生随机数,以备以后查阅。随机数服从的分布常用的有均匀分布和高斯分布,所以这里仅介绍这两种。

均匀分布

这里介绍三种生成服从均匀分布随机数的方法:线性同余法,梅森旋转算法和Multiply-With-Carry算法。

线性同余法

线性同余法是一个很古老的随机数生成算法,它的数学形式如下:

\[X\_{n+1} = (aX\_n + c)(\mod{m})\] 其中,\[m>0,0<a<m, 0<c<m\]

Read More

TexMacs札记(IV) ——插入链接、图片、目录等内容

距上一次写关于TexMacs的博客已经有一段时间了,因为毕业的原因,自己在家休整了一段时间,最近终于空闲下时间继续TexMacs手册的撰写。这篇博客主要讲解如何插入链接,图片,目录,参考文献等内容。

插入标签、参考

这里标签、参考是指论文写作的时候常用的公式索引啊,或者章节索引之类的应用。像LaTex中一样,在公式或者章节处插入标签label,然后在索引的地方插入reference。注意这里标签的插入只能是在标题、公式、表格或者图片等处插入,而正文下插入label是不起作用的。具体插入方式:

  • 插入label:使用菜单栏Insert->Link->Label;也可以通过工具栏进行插入,或者直接输入\label按回车。最后按回车激活该操作。如下图所示,|后面的section1是label的名称,以便后面ref参考使用。 

  • 插入reference:使用菜单栏Insert->Link->Reference;也可以通过工具栏进行插入,或者直接输入\ref按回车。最后按回车激活该操作。如下图所示,|后面输入要引用的label名称

Read More