这个源码的主要目的就是输入无序的图像,输出全景图。

                                       注:学习过程参照GXY学长整理的文档和网络博客。

     1. 输入图像

          这一部分肯定是最简单的了,我们可以先读取出所有的图片名,将名字存在vector中以备后续使用。(vector <string> img_names)

          并且在这个时候要检测一下图片的数量是否大于2张。

 

     2. 设定图像大小,提取特征点

           判断选择是surf还是orb特征点检测(默认是surf)以及对图像进行预处理(尺寸缩放),然后计算每幅图形的特征点,以及特征点描述子

          下面是Mat数据结构和ImageFeatures

         ①Mat数据结构

         OpenCV中最基本的数据结构,是Matrix的简称,Header和Pointer。

         Header中主要包含矩阵的大小,存储方式,存储地址等信息;Pointer中存储指向像素值的指针。  

         Mat数据结构不会自动销毁内存,在结束时候,需要自己把内存释放掉。

 http://blog.csdn.net/xiahouzuoxin/article/details/38298165    

         ②ImageFeatures数据结构

 

      以下的图像大小调整以及 特征点提取

         这里的features[i] 保存的是第i副图像(img)的ImageFatures。

         然后再把full_img按照seam_scale的参数转换成img,方便后面的缝合缝的寻找。

         然后把img的信息存入images。用clone函数在复制之后两者之间没有牵连。

     3. 特征点匹配,去除非全景图像,找到全景图像集

         MatchesInfo数据结构:

       这个数据结构的作用就是保存了任意两幅图片匹配的结果 根据两幅图中最近邻和次紧邻来保存结果,并得出这两幅图片的关联程度(置信度)

 这里设计到 H矩阵的求解,来看一下H矩阵的求解过程是怎样的。

在BestOf2NearestMatcher matcher(try_gpu, match_conf); 这句话中对一些参数进行初始化

其中会初始化is_thread_safe_这个参数为 false。

在matcher(features, pairwise_matches);中

会调用重载运算符

void FeaturesMatcher::operator ()(const vector<ImageFeatures> &features, vector<MatchesInfo> &pairwise_matches,const Mat &mask)

代码如下:

很明显,代码主要功能就是选取了那些可以匹配的对出来。

然后执行body(Range(0, static_cast<int>(near_pairs.size())));(is_thread_safe_ = false)

 

上面的代码 大部分是在处理H矩阵。解释加注释里

主要是matcher(features[from], features[to], pairwise_matches[pair_idx]); 这一行是求H的过程

从下面这段代码 我们定义到函数 match

大部分都是数学公式。。看不懂了。。

这样H大致以及求完

 

下面这一步就是把所有相关联的图片放入一个集合里面。用的方法应该是并查集。(数据结构当中的。ACM-ICPC中接触比较多)

 

 

opencv-stitching_detailed源码剖析(2)

4. 根据特征点匹配关系,估计每幅图像的相机参数(投影矩阵K,旋转矩阵R)    矩阵K与矩阵R都是3×3的矩阵。 ...

阅读全文

3 条评论

  1. 你好,我最近也在学习OpenCV中的Stitcher类及stitching_detailed源码,非常感谢你的分享。
    可否给出”GXY学长整理的文档和网络博客”的链接呢?非常感谢。

    1. 那个文档是学长自己整理的,没有上传到网上的。
      我学习的那个博客链接:http://blog.csdn.net/skeeee/article/details/19480693

  2. 想请教一个问题:
    stitching_detailed.cpp 第84、85行说 match_conf 默认值是0.65,而第146行是0.3。
    这里是不是源码的bug?

欢迎留言

*