如何使用pkg-config工具编译链接第三方库

我们在使用第三方库(如OpenCV,Boost等)时,难免会遇到相关的库的编译连接问题,而每次重复繁杂的配置的确让人懊恼,而pkg-config1工具提供了一个相对简单的库的编译链接方法。这里就简单介绍一下pkg-config的使用方法。

我们知道,第三方库的使用主要涉及头文件的路径设置,库的路径设置以及动态库的环境变量设置。当然有的库的使用是仅仅需要头文件,例如Eigen以及大部分Boost,这样就不需要设置库路径和动态库的环境变量。pkg-config通过读取一个*.pc的文件,获取了库的头文件位置和库的路径等信息,然后告知编译器,实现库的自动使用。一般来说,*.pc文件的大体内容如下格式:

prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo
Libs: -L${libdir} -lfoo

Read More

OpenCV读取XML/YML文件的方法

在平时写一些程序的时候,需要一些配置参数的文件,最简单的方法是使用txt文件存储参数,但当参数较多时,为了让存储的参数更美观有序且方便读取,一些其他库提供的一些数据存储方法就显得很方便了,例如libconfig。当然这里并不打算着重讲解这个库,而是主要说一说OpenCV中关于数据存储的方法——读取XML/YML文件。XML是一种可扩展标记语言,YML和它类似,但是更适合人阅读。关于XML格式的文件除了OpenCV可以读写外,还有其他一些专门的库提供了读写的API,例如比较轻量级的TinyXML

XML/YML的写

文件的写的过程相对简单,类似C++中数据流的写的过程,使用<<。文件的创建是用类FileStorage,释放时调用FileStorage::release()并且关闭文件。列举一个OpenCV手册中例子如下:

Read More

Lucas-Kanade(LK)算法原理介绍及OpenCV代码实现分析

Lucas-Kanade跟踪算法是视觉跟踪中一个很经典的基于点的逐帧跟踪算法。起初这个算法是用来求解stero matching1的,后来经过Carlo Tomasi2和Jianbo Shi3等人的发展渐趋成熟。Jianbo Shi提出了一种筛选跟踪点特征的方法,使得特征的跟踪更可靠。Jean-Yves Bouguet4详细阐述了如何采用金字塔方式实现LK算法以处理两帧之间特征点位移较大的情况。

问题阐述

首先我们来看一下我们要解决的问题是什么?LK算法是基于特征点的跟踪,而这里的特征点就是每个点对应的一个小窗口图像块,LK所要解决的是求解连续两帧图像相同特征点的位移问题。这里我们假设\(I\)\(J\)为连续两帧图像,其\((x,y)\)点的灰度值分别对应\(I(x,y), J(x,y)\)。设\(\mathbf{u}=[u_x,u_y]^T\)是图像\(I\)上一点,LK算法的目标是在图像\(J\)找到一点\(\mathbf{v}= \mathbf{u} + \mathbf{d} = [u_x+d_x,u_y+d_y]^T\)使得点\(I(\mathbf{u})\)和点\(J(\mathbf{v})\)是同一个位置。为了求解这样的点,LK求解这两个点对应的小窗口内像素的相似度。设\(\omega_x\)\(\omega_y\)分别是点左右扩展的窗口范围,这样我们可以定义如下residual function为

\[\epsilon(\mathbf{d})=\epsilon(d_x,d_y)=\sum_{x=u_x-\omega_x}^{u_x+\omega_x}\sum_{y=u_y-\omega_y}^{u_y+\omega_y}(I(x,y)-J(x+d_x,y+d_y))^2\]

窗口大小为\((2\omega_x+1)\times (2\omega_y+1)\),通常情况下\(\omega_x\)\(\omega_y\)的值为2,3,4,5,6,7。

Read More

OpenCV系列(三):Mat详解

Mat类是OpenCV最基本的一个数据类型,它可以表示一个多维的多通道的数组。Mat常用来存储图像,包括单通道二维数组——灰度图,多通道二维数组——彩色图。当然也可以用来存储点云,直方图等等,对于高维的数组可以考虑存储在SparseMat中。对于一个Mat对象M,其数据布局是由M.step[]决定的,数据存放在M.data里面,假设M有d维,则数据的寻址方式为:

\[addr(M_{i_0,...,i_{d-1}}) = M.data + i_0*M.step[0] + ... + i_{d-1}*M.step[d-1] \]

例如\(Img\)是一个二维三通道矩阵,则,

\[addr(Img_{i_0,i_1}) = M.data + i_0*M.step[0] + i_1*M.step[1] \]

这里需要说明的是各个维度的步长满足如下关系:M.step[i] >= M.step[i+1]*M.size[i+1],也就是二维数组的数据的存放是一行一行的,三维数组数据存放是一面一面的。

Read More

如何在CodeBlocks和Qt Creator开发环境下使用OpenCV(Ubuntu12.04)

自从切换到ubuntu系统后,就一直在寻找合适的C++开发环境。看了网上的一些介绍,大体就这么几个选择:Eclipse, CodeBolocksQt Creator。后来自己试用了一下CodeBlocks和Qt Creator,感觉这两个开发环境还是不错,打开速度都很快。但是由于CodeBlocks的Find declaration功能针对OpenCV老是不灵,这让我很不爽,所以果断换掉去尝试Qt Creator。Qt Creator给人焕然一新的感觉,界面简洁,布局合理,常用的功能在左侧排列,不会给人杂乱的感觉。

因为要开发OpenCV项目,所以首先需要知道开发环境配置第三方库的方法。虽然最后没有选择CodeBlocks,但是毕竟也摸索过一段时间,这里以OpenCV为实例一并介绍其如何配置第三方库。

CodeBlocks下配置OpenCV

CodeBlocks的安装主要可以参考官网的教程。主要两种方式,一是下载源代码,自己编译安装;再就是安装别人编译好的,对于ubuntu系统参考这里。把这个源加入自己的系统,即执行

sudo add-apt-repository ppa:pasgui/ppa

然后执行

sudo apt-get install codeblocks 

这样 就可以CodeBlocks就安装好了。

Read More