OpenCV实践之OpponentColorDescriptor描述子匹配

Opponent描述子简述

  之前博客更新Two Views Image Match都是基于灰度模式下的匹配,例如SIFT、SURF等一系列灰度描述子。当然,彩色空间图像能够增加图像描述的信息,提升特征点的鲁棒性。同时,色彩空间信息也提高了计算的复杂度,如何有效的进行权衡,这取决于当前应用场景更加关注鲁棒性与唯一性还是计算的实时性问题。因此,出现一批彩色描述子来提升特征点信息的鲁棒性。本文基于OpenCV提供的源码主要对OpponentColorDescriptor描述子进行实践,与当前灰度模式下的SIFT描述子进行比较,进行简单的实验论证。

  OpenCV 2.x版本提供了Opponent描述子实现源码,OpenCV 3.x却没有发现其源码。主要原因在于这部分源码的鲁棒性或者适配性不够,容易出错。关于OpponentColorDescriptor源码可以参考我的博文:OpenCV学习之OpponentColorDescriptor源码从OpenCV源码之features2d下可以看到,OpponentColorDescriptor继承基础描述子类DescriptorExtrator,我们能够声明不同的描述子提取方式,然后进行Opponent多通道描述子融合的彩色描述符。

下面我们来进行标准条件下OpponentSIFT匹配代码演示:

图1 调用OpenCV库函数实现OpponentColorDescriptor功能

  可以明确发现,上述声明OpponentSIFT描述子只需要在DescriptorExtractor类中创建声明OpponentSIFT。当然如果你是想SURF描述子,那么你可以改为OpponentSURF。从源码创建Opponent描述符可以看出,OpponentColorDescriptor类通过判断输入字符串前部分是否为Opponent + 描述方式来进行判断是否采用Opponent描述符。但是,这部分代码我直接运行会出错,主要原因是OpponentColorDescriptor类中描述子计算函数的堆栈指针作用域超出问题,系统自动回收释放。我看到源码中并没有释放内存,都是vector动态进行内存的管理,所以我就将源码单步调试定位发现确实在OpponentColorDescriptorExtractor::
computeImpl()函数中末尾swap()函数存在问题(函数源码见上述提及博客或者直接查询OpenCV源码),内部声明vector数据存储,与主函数提取的特征点集进行交换。我的修改方式如下:直接在OpponentColorDescriptor类外部声明其数据结构存储排序后的特征点作为函数参数传入。或者直接外部声明其变量,然后再computeImpl()函数内部释放其外部传入的特征点集,重新存储排序后的特征点集。
如有错误,还请指正

下面是我将OpponentColorDescriptor类源码提取出来,进行简单的修改后运行正常的OpponentSIFT图像匹配代码:

图2 拷贝与修改OpenCV源码实现OpponentColorDescriptor

  关于computeOpponentColorDescriptorImpl()函数功能只是简单修改数据结构存储关系,修复调用OpenCV库中出现的_block_type_is_valid(phead->nblockuse)这个bug,源码与OpponentColorDescriptor类中的computeImpl()函数类似,具体可参看源码或者上传GitHub的源代码(末尾链接地址)

实验结果

  实验简单采取SIFT特征点提取,描述符采取SIFT灰度描述符和OpponentSIFT描述符进行简单对比,当然特征点目前也有彩色Harris角点提取,结合OpponentSIFT描述子在理论上来说效果可能更佳。目前还没有进行实验对比,Koen提供彩色描述子库,后续将运用进行对比。好了,简单上实验效果图。
SIFT描述符匹配结果
OpponentSIFT匹配结果

图3 SIFT描述符算法耗时(上) OpponentSIFT描述符算法耗时(下)

代码下载

OpponentSIFT代码下载:

 https://github.com/SmallMunich/OpenCV_OpponentSIFT/tree/master

vfc.h/vfc.cpp代码下载:

 https://github.com/SmallMunich/HarrisAffineMatch_OpenCV

参考

 https://opencv.org/
 https://www.koen.me/research/colordescriptors/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值