热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

基于OpenCV进行图像拼接原理解析和编码实现(提纲代码和具体内容在课件中)

一、背景1.1概念定义我们这里想要实现的图像拼接,既不是如题图1和2这样的“图片艺术拼接”,也不是如图3这样的“显示拼接”,而是实现类似“BaiDU全景”这样的全部的或者部分的实际场景的重新回放。对于

);
    Mat img_result = img_1.clone();
    for(int i=0;i<img_result.rows;i++)
    {        for(int j=0;j<img_result.cols;j++)
        {     
            img_result.at<Vec3b>(i,j)=0;
        }
    }
    int W = img_1.cols;
    int H = img_1.rows;
    float r = W/(2*tan(PI/6));
    float k = 0;
    float fx=0;
    float fy=0;
    for(int i=0;i<img_1.rows;i++)
    {        for(int j=0;j<img_1.cols;j++)
        {     
            k = sqrt((float)(r*r+(W/2-j)*(W/2-j)));
            fx = r*sin(PI/6)+r*sin(atan((j -W/2 )/r));
            fy = H/2 +r*(i-H/2)/k;
            int ix = (int)fx;
            int iy = (int)fy;
            if (ix<W&&ix>=0&&iy<H&&iy>=0)
            {
                img_result.at<Vec3b>(iy,ix)= img_1.at<Vec3b>(i,j);
            }
 
        }
    }
    
    imshow( "桶状投影", img_1 );
    imshow("img_result",img_result);
    waitKey(0);
    return 0;
}

2.1.4 难道就没有其他模型了吗

在论文中和实际的项目中,看到最多的就是柱状模型,容易让人认为:全景拼接只适合柱状模型,甚至以为图像拼接只适合柱状模型

实际上,只要采集的图像中的信息包含了原始全景图片的信息,那么就应该能够有办法将其复原。之所以采用柱状模型是因为最容易实现,再说一遍:之所以采用柱状模型是因为最容易实现。事实上,针对不同的应用场景,可能会有很多其他的模型:

1) 步进电机控制的精密采集设备;

2) 消费类,手机拍摄形成蜂窝状图片拼接;

类似的情况还可能会有许多,但是如果能够理解第二章整个的流程、掌握配套的代码编写,就能够灵活运用于不同的模型上面。后面在代码程序设计的时候,我会将一些其它方面的考虑一起放出来。

光是采集方法就说了好多,再一次说明了图像拼接的复杂。选用什么样的采集方法就决定了以后图像投影变换的细节,间接地决定了最后拼接结果的质量。


2.2投影变换

二维平面运动参数模型是根据建立的数学模型,将待拼接图像转换到参考图像的坐标系中,以此来构成完整的拼接图像。

2.2.1两步成像

到了这里,就必须涉及相机模型的简单介绍。在我们正常的图像采集中,采用的是“两步成像”方法,将三维物体展现在相机二维的成像面上(比如ccd或者cmos)

我们在电子图片中,看到的是图像的像

 

 

同样可以再举一个图

 

可以明显地看到,首先物体反射光源的光,呈现在虚拟的“像平面”上,这个虚拟的“像平面”,其具体情况是由相机的物理属性决定的,此为第一步;而后在根据“小孔成像”法制显示在相机的光学设备上。这个基本情况需要了解。

2.2.2圆柱面投影算法

分清楚什么是先验知识)圆柱面投影算法 由于采集的原始图像是在绕视点一周不同角度下拍摄的,它们并不在同一投影平面上,投影存在一定的夹角。如果对图像直接进行拼接,得到的拼合图像在重叠区域会发生局部扭曲现象,并会破坏实际场景的视觉一致性,无法满足实际场景中各对象间的几何关系。比如场景中本来是直线的景物,在拼接后变成了折线,为了保证实际场景在视觉上的一致性,维持实际场景中的空间约束关系。我们必须将拍照得到的反映各自投影平面的各局部图像映射到一个标准投影即柱面投影上,以便获得从投影中心观察图像在柱面上的成像。这样一方面消除了实景图像之间可能存在的重复景物信息,同时也得到了每张实景图像上的像素点在视点空间中的位置信息。

 

提示:哪些是虚拟像平面)

 展平的过程肯定是一个非线性变换,具体来说就是三角变换。

2.2.3 二维坐标体系中的8参数模型。

 

 

 

 

 

其中,各个参数定义

   (简单推导和证明) 投影变换需要用到所有8个参数。投影变换具有更一般的形式,可以描述摄像机的平移、水平扫动、垂直扫动、旋转、镜头缩放等运动,其中刚性变换模型和仿射变换模型是投影变换模型的特例。它适用于景物平面相对于像平面有一定倾斜的情况。

 


    2.3 特征匹配

1)什么是特征点?

可以这样简单理解,所谓特征点就是能够表明物体本身特征的点。也就是说,这种特征提取的方法具有独特的算法,使得即使你处理在不同的拍摄条件下拍摄同一物体,都能够得到同样的特征值。(所谓尺度不变性”).

这种特性对于图像拼接来说具有重要意义,因为目前计算机无法识别出图片中的物体,但是如果有一种统一的计算方法,能够告诉计算机不同图片中同一物体的特征点,那么也就是得到了物体的位置和形态了。(可以看图)

 

2)常用的特征点寻找方法。

SIFT,即尺度不变特征变换(Scale-invariant feature transformSIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。该方法于1999年由David Lowe 首先发表于计算机视觉国际会议(International Conference on Computer VisionICCV),2004年再次经David Lowe整理完善后发表于International journal of computer visionIJCV)。截止20148月,该论文单篇被引次数达25000余次。

SURF(Speeded Up Robust Features)是一个稳健的图像识别和描述算法,首先于2006年发表在欧洲计算机视觉国际会议用于计算机视觉任务,如物件识别和3D重构。他部分的灵感来自于SIFT算法。SURF标准的版本比SIFT要快数倍,并且其作者声称在不同图像变换方面比SIFT更加稳健。SURF 基于近似的2D 离散小波变换响应和并且有效地利用了积分图。该算法由Herbert Bay2006年首次发表于ECCV2008年正式发表在Computer vision and image understanding期刊上,论文被引9000余次。

ORB,从它的名字中可以看出它是对FAST特征点与BREIF特征描述子的一种结合与改进,这个算法是由Ethan Rublee,Vincent Rabaud,Kurt Konolige以及Gary R.Bradski2011年一篇名为“ORBAn Efficient Alternative to SIFT or SURF”的文章中提出。就像文章题目所写一样,ORB是除了SIFTSURF外一个很好的选择,而且它有很高的效率,最重要的一点是它是免费的,SIFTSURF都是有专利的,你如果在商业软件中使用,需要购买许可。

关于SIFT/SURF/ORB,可以通过发表的论文看出之间的相互关系,特征点提取是一个复杂的话题,网络上有很多资料需要去消化吸收。在我的博客中现有调用SURF进行图像处理的一些实验的例子,可以帮助学习。关于这三者的深入解读的课程已经在筹备。

需要注意一点,即使你不懂特征提取的原理,也是可以利用其进行图像拼接的。当然要解决复杂问题,最好还是要懂原理。在实际的使用过程中,ORB速度很快,并且能够提供足够的特征点,同时相比较其他两者编译起来比较简单(因为SIFT/SURF要联编contrib库),所以本拼接教程采用ORB算法。

   特征点有没有失效的时候?怎么办?

由于在图像采集的时候设置不当,或者就是由于物体本身特征不明的情况下,找不到足够的特征点?肿么办?

 

首先想到的是采用前后的变换矩阵进行拟合,也就是估计出可能的情况。但是这里是8参数估计,所以只是在一些特殊的情况下效果较好(比如有机械臂控制的平面移动)。或者可以采用模板识别辅助获得变换的具体情况。

关于模板识别,可以参考OpenCV官方Wiki,我的博客中也有相关内容,网络上同时资料比较丰富。

3)特征提纯

采用特征匹配可能会得到很多匹配的结果。对于自然图像来说,效果一般比较好:

 但是,另外一些情况,匹配的结果很多,也有很多错误

就需要有特定的方法提纯这些特征点。主流方法为RANSAC(Random Sample Consensus),它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。同样不展开,具体看博客。《RANSAC算法在图像拼接上的应用的实现》,都是带有原理解析和代码的。

4)特征匹配最后得到一个什么结果,达到什么效果?

 即使前面做了那么多工作,最后图像对准的结果还可能是这样:

这是什么情况?就是虽然按照算法匹配上了,但是这个匹配的结果是不符合实际情况的(右半边飞掉了)。这种情况在使用OpenCV自己的Stitching.cpp拼接3图以上的时候就非常容易出现。但是我们不仅仅是要拼接3图,4图,而是要能够拼接全景的呀?这个时候,就需要对图和图之间计算出来的变换矩阵的参数进行统一处理,去除畸变点,获得统一模型。

2.4图像对准

图像配准是整个图像拼接过程的核心部分,是将不同条件下(气候、照度、摄像位置和角度等)、不同时间或不同传感器获取的同一场景的两幅或多幅图像进行最优匹配的过程。

图像变换后,往往碰到坐标值非整数的情况,为了解决这个问题,图像的插值理论(最近邻插值、双线性插值、三次样条插值) 经常会被运用到拼接算法中。

2.5 图像融合

图像在拍摄过程中可能会存在光照变换,若将配准后图像直接拼接在一起,会出现明显的拼接痕迹,使整个图像看起来光照不够自然,图像融合部分帮助我们解决这一问题。当然但是如果前面做的不好,最后的结果即使要不融合不好;要不融合后的结果和实际不相符

融合的方法,常见的为linerfeathermultiband,对于他们的单独分析和代码实现可以见我的博客《使用linerfeathermultiband对已经拼接的数据进行融合》。这里简单说明一下主流的multiband.基本思想是把待拼接的两幅图像进行金字塔分解,而后再在不同的金字塔上面进行liner融合,最后再叠加起来。这么做效果是很好的,但是消耗资源,现在掌握的代码容易溢出。上图可以看出,苹果和橘子很好地融合到了一起, 过渡 一点都不维和。

2.6 反向投影(显示结果)

    所谓反向投影这个玄乎的名字,其实想说明的就是将最后拼接的结果显示出来。最直接的就是还是显示成为一个图片(也是我们这个教程要做的),那么复杂一点,可以显示成一个flash;可以显示成一个VR的双目的效果。大家自己发挥,这里抛砖引玉。



来自为知笔记(Wiz)


推荐阅读
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文讨论了当某位排位靠前的涉众提供了一张精美的界面图片时,是否可以将其作为设计约束。同时还探讨了高质量素材和愿景之间的关系,以及老大自身的软件方法和建模技能。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • 本文研究了使用条件对抗网络进行图片到图片翻译的方法,并提出了一种通用的解决方案。通过学习输入图像到输出图像的映射和训练相应的损失函数,我们可以解决需要不同损失函数公式的问题。实验证明该方法在合成图片、重构目标和给图片着色等多个问题上都很有效。这项工作的重要发现是不再需要人为构建映射函数和损失函数,同时能够得出合理的结果。本文的研究对于图片处理、计算机图片合成和计算机视觉等领域具有重要意义。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 计算成像的原理与应用研究
    本文探讨了计算成像的原理与应用研究。首先介绍了小孔成像实验和软件方面的相关内容。随后从傅里叶光学的角度简单谈了成像的过程。成像是观测样品分布的一种方法,通过成像系统接收光的强度来呈现图像。视网膜作为接收端接收到的图像实际上是由像元组成的矩阵,每个元素代表相应位置像元接收光的强度。大脑通过对图像的分析,得出一系列信息,如识别物体、判断距离等。计算成像是一种采集记录系统,通过处理数据得到样品分布与像的对应关系,用于后续问题的分析。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 图片复制到服务器 方向变了_双服务器热备更新配置文件步骤问题及解决方法
    本文介绍了在将图片复制到服务器并进行方向变换的过程中,双服务器热备更新配置文件所出现的问题及解决方法。通过停止所有服务、更新配置、重启服务等操作,可以避免数据中断和操作不规范导致的问题。同时还提到了注意事项,如Avimet版本的差异以及配置文件和批处理文件的存放路径等。通过严格执行切换步骤,可以成功进行更新操作。 ... [详细]
  • 1.RoIPoolingRoIPooling顾名思义对Roi进行Pooling操作,主要用于目标检测任务。RoI(Regionofinterest&# ... [详细]
author-avatar
晓亮居士_264
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有