OpenCV的图像配准融合(一)
由于实习的工作在做手机双摄的算法,其中光学变焦的算法涉及到了广角和长焦图片的配准融合。由于两个镜头的焦距和光圈大小不同,导致了拍摄出来的两幅图片无论在色彩还是内容上都会有所不同,而模拟的光学变焦则是通过想办法将即保留广角信息也能加入长焦信息,获得画质的提升,有兴趣的可以看这个:
广角+长焦双摄方案
看了Corephotonics、ArcSoft这些厂家的专利还有一些论文后,大致对手机双摄的光学变焦有了些理解。在自己动手写Demo的过程中在网上也学到了不少东西,自己收获了很多,所以整理并记录下来不仅方便自己以后复习,还希望可以给入门的人提供点踩坑经验…
特征点选取
如我们所知,一幅图像包含很多纹理,色彩等。正是这些东西使得我们人可以很容易的知道图像的内容是什么。然而对计算机而言,这些并不能让计算机很好的理解这幅图像,因为对计算机,最容易理解的就是数字。所以我们通过对图像的特征进行提取,并将这些特征描述成数字,向量等形式给计算机,这样才算让计算机真正的理解了这幅图像。基于特征的图像配准算法的核心步骤为:特征提取、特征匹配、图像变换。
那么,什么是图像的特征呢?有些是可以直观地感受到,如亮度、边缘、纹理和色彩等,有些则是需要通过一些数学变换才能得到的,如矩、直方图以及主成份等。通常特征点提取的方法有:SIFT、SURF、ORB等,三种特征检测的优缺点可以看这位兄弟的博客:
SIFT\SURF\ORB对比
我在项目中使用的SURF(Speeded Up Robust Features),这是一种稳健的特征点检测和描述算法。最初由Herbert Bay发表在2006年的欧洲计算机视觉国际会议(Europen Conference on Computer Vision,ECCV)上,并在2008年正式发表在Computer Vision and Image Understanding期刊上。SURF也可以称作是SIFT的“升级版”,SIFT采用的是DOG图像,而SURF采用的是Hessian矩阵行列式近似值图像。选择SURF的原因是它可以很好的解决空间尺度不一致的问题,因为长焦和广角图片得到的结果具有尺度的不一致性。这里详细可以看这位老哥的博客:
SURF特征
好,原理懂了,那么怎么使用OpenCV去实现图片的特征点检测呢?OpenCV中自带了SURF算法的接口,这里直接使用就可以。但是由于lz使用的是OpencCV3.1的版本,这个版本中已经删掉了这个算法,所以要想使用,就要先去下载一个OpenCV-contrib。具体可以参见:
基本步骤:
下载安装OpenCv-contrib
由于lz的电脑里安装了CUDA,所以导致安装包时出现了一些坑,当时查了好久才知道可以把WITH_CUDA 取消勾选(0.0)。最后用了大半天的时间才把这些坑给填上= =…这里lz贴上一些我遇到坑时找的一些解决方法:
踩坑1
踩坑2
最后终于可以正常使用了,下面开始看看代码要怎么写吧。