您的位置:首页 > Web前端

OpenCV: Features2D Features FrameWork 图像二维特征检测、描述以及匹配框架的层次解析

2014-04-24 20:18 691 查看
刚开始学OpenCV的时候,总是看别人写的例子,很快拷贝下来运行之,看看效果,然后看看每一个函数是怎么调用的,各个功能函数是怎么组织在代码中的。这样虽然上手快,但是给人一种如在云里雾里的感觉,虽然看了很多例程,但是自己写的时候却脑袋空白,剪不断,理还乱。这是因为对OpenCV算法库的整个架构的认识还没有达到清澈见底的境界。所以要想把算法库内化为自己的血肉,随心所欲的运用,就必须要自己去分析整个算法库的逻辑结构,理清脉络,澄清这一潭浑水。

接下来将要系统分析一下OpenCV 2.4.5中Features2D : Features FrameWork 模块中关于图像特征检测、描述以及图像匹配的实现框架和接口。通过这篇博文,你可以了解OpenCV中这一模块的架构,比如有几个类,各个类之间的层次关系等。总之,你将会有一种站在高处向下看的感觉。

假如现在要你自己去写关于特征检测,描述,匹配的算法库,该如何下手呢?

首先,这一模块应该包括三个基本功能:

特征检测(Feature Detecting)、特征描述(Feature Describing)、特征匹配(Feature Matching)

上面提到的每一个功能都会有很多不同种类的算法,该如何处理这种情况才能使算法库结构清晰呢?如果我们将算法看成是一个类,根据面向对象的编程思想,要首先定义一个基类型:Algorithm,把这些不同算法的共同部分写在里面,申明一些共同的函数,而不提供实现细节。然后我们让每一个特定的算法继承这个基类,在特定类中实现父类定义的(虚)函数或者覆盖父类的某些函数,然后在该特定类中加入自己独有的变量和函数。这样设计算法库不但可以保证算法库的结构清晰,并且使得算法库易于扩充。如果以后出现了新的算法,我们可以轻易地将它加入进去,和库中的已有算法并列存在,不会和其他已有算法混在一起,打乱部署。

其次,要实现上面的三个功能,首当其冲的是“图像的特征”该怎么描述。只有将“特征”描述成程序语言,才能对其进行各种操作。这就是“先有概念,后有逻辑”的道理,因为逻辑是对概念的演绎和操作。

我们这里所指图像的特征主要为几何特征,即图像中的“点,线,面”。用程序语言来表达“点、线、面”的任务其实就是选择合适的数据结构来描述点,线,面这些元素。

对于“点”特征,其最重要的参数就是坐标,以及关于坐标的操作了。另外图像中的特征点不止一个,所以应该用一个数组来容纳检测到的一系列“点”的特征参数。对于“线”特征,我们可以用两个点来描述它,或者用一个点以及它的斜率。对于规则的“面”特征(如圆区域),可以用它的参数描述;对于较为复杂的“面”特征,我们可以定义用一系列点来逼近它的轮廓,然后用轮廓上的点计算区域的特征(面积、重心等)。

通过上面的分析,对于如何设计开发图像特征检测,描述和匹配的算法库,我们已经有了大致的构思。现在我们来看看OpenCV的设计到底是个怎样的图景吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: