连铸拼接的一些要点

2023-10-28 03:30
文章标签 拼接 要点 连铸

本文主要是介绍连铸拼接的一些要点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个项目已经过去有很长时间了,近期因网友提问,我重新整理了一下发布出来,供大家参考.

一、拼接的基本过程

     

    一般意义上来说,全景拼接可以划分为图1所示的6个部分。

    1、输入图像,就是获得全部的待拼接的图像;

    2、图像几何校正,就是校正因为镜头固有缺陷、拍摄方法造成的图像失真;

    3、图像预处理,就是对输入的图像进行去噪、白平衡等降维操作;

    4、图像配准,就是识别计算图像本身的纹理特征,并将图像按照真实的位置排列起来;

    5、图像融合,在配准之后的边界位置,会出现比较明显的缝隙,需要专门的算法进行融合;

    6、获得全景图像;

    对于连铸项目具体来说,还应该包括第7个部分,就是对应“点”的寻找。

二、连铸项目的拼接实现

       结合连铸项目的具体实现,(主要以上表面需要校直的这种情况,其他情况都相对要简单)来具体分析这7个步骤。

    1、输入图像。(略)

    2、图像几何校正。采用手工标定的透视变换对输入图像进行电子校正。

   

   

3、图像预处理。主要考虑到原始图像上面有高曝区域,采用色彩平衡算法进行处理,并突出表面问题里区域。

4、图像配准。首先通过“自适应canny算法”,最大程度强化各图片表面纹理区域,而后采用“符合模板匹配算法”,进行模板识别并配准,这步完成后得到图像如下。算法的简单介绍参看“难点重点”章节

5、图像融合。采用《基于Halcon的图像拼接算法研究_谭杰.pdf》中提出的线性融合算法进行图像融合。

    6、获得全景图像;(略)

三、难点重点

       由于拍摄条件的限制,连铸项目在实现过程中遇到了一些阻力。为了更好地解决问题,我提出并实现了一些新的思路和算法。

    1、提高模板识别的成功率;

越是纹理清晰的图像越是容易匹配成功。在实际项目中,有利于匹配的点是有很多个的,那么如果有预处理模型就能够在这个时候取得较好的结果。

    比较这两幅图像(里面外面):

可以看到,外面的图像相对来说,纹理不清楚,比较平淡;但是里面的来说纹理比较复杂。那么如果直接来sobel是否可以有比较好的结果了?

通过简单的canny,就可以看出纹理清楚的图像具有更丰富的细节。

    opencv里面提供的模板匹配算法一共有5类,一般来说是使用所用的方法,找到最好的效果。

   我认为,在代码中间遍历所有的算法,不是一个好的思路,因为模板匹配是最消耗时间的。在项目的初期,就根据样本实验,选择合适的算法,并且建立测试的模型。这个时候就应该把算法定下来。这里主要研究的是各个算法的值。

   首先从自己需找自己的模板开始。

在另一个图片上寻找

差距非常明显,但是更要命的是max都是1min都是0

都而对于halcon,它提供的结果是467.453636.408,应该说那个都不一样。而一般认为halcon是比较准确的。为了验证,我这里换一个图像:

这个结果应该说是更令人迷惑,6个中有4个给出了接近的x,而三个给出了接近的y,max值依然是没有价值的。halcon的差距也是非常大。

必须考虑到,halcon最后给的是图片中心,而oopencv最后给的是左上角。那么结论就是opencv的模板匹配距离实际的差距还很大,非常要命。

我准备模仿halcon的方法,首先找出纹理,然后进行匹配。采用同样的图片进行。

结果为

 有大量的值为统一的,那么这是真实的值吗?

结果非常好!再测试一个例子,并且加上自适应的canny代码

       2、引入先验模型

    在现有的模型下面,模板匹配的本质决定了它只能提供这个程度的识别效率。如何在可能的情况下极高识别的成功率?如何去验证这个成功的拼接?这是核心问题。

图像识别还是做项目,每一个项目有不同的图片源和要求。连铸这个项目,考虑到他们下一步要做得,所以对于特征的要求肯定很高。如果采用单路匹配的方法,对结果进行统计分析。现在看来这个效果不是太好,主要是因为特征明显的区域不一定都位于图像中心。

现在采取三条匹配,尽可能包含可能的特征区域;

降低带识别区域大小,提高识别准确效率的方法。

简单地说就是优化识别方法,提高识别效率。

<学习opencv>里面就提到对于5种算法要灵活运用。我采用重复使用。不仅是算法的重复,而且是对于效果不佳的区域的重复。这个时间可以通过对识别区域的预测来抵消。

比较好的识别

质量一般的识别

质量很差的识别

四、备注

    系统平台:winxp(或更高版本)

       引用类库:opencv2.8(或更高版本)

       编译平台:vs2010(或更高版本)

    性能指标:<=1.5s/

来自为知笔记(Wiz)

附件列表

    这篇关于连铸拼接的一些要点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/290390

    相关文章

    AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

    AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

    系统优化要点

    这是常用的系统优化要考虑的点,在系统设计和代码评审以及代码优化时加以考虑,最大限度提高系统性能:  1. 优化算法,选择合适高效算法,降低不必要递归,循环,多层循环嵌套,避免循环内初始化等。  2. 避免申请过多不必要的内存  3. 及时释放资源,降低资源使用时间,包括内存,IO,网络,数据库等。  4. 使用缓存:缓存常用的,不易变化的。  5. 慎用数据库锁。确

    c语言要点!

    其他合法的输入:     1.    3空格 空格4空格 空格 空格5 空格 回车     2.    3回车4空格5回车     3.    3(tab键)4回车5回车     例子2     #include<stdio.h>     #include<stdlib.h>     int main()     {     int a,b,c;     s

    js操作Dom节点拼接表单及ajax提交表单

    有时候我们不希望html(jsp、vm)中有创建太多的标签(dom节点),所以这些任务都由js来做,下面提供套完整的表单提交流程,只需要在html中添加两个div其余的都由js来做吧。下面原生代码只需略微修改就能达到你想要的效果。 1、需要创建表单的点击事件 <a href="javascript:void(0);"onclick="changeSettleMoney('$!doctor.do

    互联网开发要点

    垂直扩展 横向扩展 业务分拆 数据读写分离 缓存读写 异步处理(消息队列)

    20151214 要点摘录2

    算法: 四火的数据库算法10题 http://www.raychase.net/2810 leetCode解题报告 http://bookshadow.com/leetcode/ 学习算法之路(转) http://blog.csdn.net/sunboy_2050/article/details/5656823 10分钟没有思路的就找例子 http://blog.csdn

    20151214 要点摘录1

    eclipse用法 --- 涉及到的eclipse的使用 在接口名上按F4 可以看继承关系    按ctrl+T可以找实现类 ctrl+shift+r查找文件 MyBatis的设计主要是把对数据库的增删改查的sql语句和JavaWeb工程的POJO做绑定 1 配置sql语句的映射文件 2 在conf.xml中配置数据库连接并关联sql语句的映射文件 3 在dao中编写代码,加载con

    【语句】如何将列表拼接成字符串并截取20个字符后面的

    base_info = "".join(tree.xpath('/html/head/script[4]/text()'))[20:] 以下是对这个语句的详细讲解: tree.xpath('/html/head/script[4]/text()')部分: tree:通常是一个已经构建好的 HTML 文档树对象,它是通过相关的 HTML 解析库(比如 lxml)对 HTML 文档进行解

    2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

    ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

    【Go - 拼接字符串】

    在 Go 中,可以使用多种方式拼接字符串。以下是一些常见的方法: 使用 + 操作符 这是最简单的方式,适用于少量字符串的拼接。 str := "Hello, " + "world!" 使用 fmt.Sprintf 适用于需要格式化字符串的场景。 str := fmt.Sprintf("Hello, %s!", "world") 使用 strings.Builder 适用于需要高