zoukankan      html  css  js  c++  java
  • 连铸拼接的一些要点

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

    一、拼接的基本过程

         

        一般意义上来说,全景拼接可以划分为图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/

     





    附件列表

    • 相关阅读:
      Shell之海量数据处理grep,cut,awk,sed
      [Linux] Migrate plugins and setting for vim
      [C++] Template
      c++ Dynamic Memory (part 2)
      Image process
      c++ Dynamic Memory (part 1)
      [Algorithm] A* Search Algorithm Basic
      [C++] Solve "No source available for main()" error when debugging on Eclipse
      [C++] Solve "Cannot run program "gdb": Unknown reason" error
      [C++] Solve "Launch Failed. Binary not found." error on Eclipse
    • 原文地址:https://www.cnblogs.com/jsxyhelu/p/14041236.html
    Copyright © 2011-2022 走看看