titching模块中对特征提取的封装解析(以ORB特性为例)
    OpenCV中Stitching模块(图像拼接模块)的拼接过程可以用PipeLine来进行描述,是一个比较复杂的过程。在这个过程中,特征提取是重要的一个部分。由于OpenCV发展到了3.X以后,Stitching模块的相关函数进行了重新封装,所以对于学习研究造成了一定困难。这里通过解析代码,研究Stitching模块中的特征提取部分,并且和直接进行特征提取的相关函数进行比对。
采用的图片为 parliament2.bmp 和 parliament3.bmp
  

 
一、直接的特征提取
结果图片
可以看到很明显,右图中绘制出来了左图通过放射变换后所在的位置。目测是比较准确的。
代码:
#, CV_32F);
    ; i) ; i; i)]); 
    }
    Mat result;
    drawMatches(img1, keyImg1, img2, keyImg2, bestMatches, result);
    std; i );
    std);
    obj_corners[] ,); 
    obj_corners[]  );
    obj_corners[] ] , img1.rows );
    perspectiveTransform( obj_corners, scene_corners, H);
    );
    line( result, scene_corners[] ] , , ),  );
    line( result, scene_corners[] ] , , ),  );
    line( result, scene_corners[] ] , , ),  );
    line( result, scene_corners[] ] , , ),  );
    imshow("result", result);
    waitKey();
}
    
这段代码主要参考的是OpenCV自带的"matchmethod_orb_akaze_brisk.cpp"。需要注意的是3.X版本中ORB函数的定义和之前也是不一样的。
二、使用Stitching模块
代码:
#));
    Mat MatSub , img1.cols);
    img1.copyTo(MatSub);
    MatSub );
    ]);
    (]);
    finder.);
    std);
    obj_corners[] ,); 
    obj_corners[]  );
    obj_corners[] ] , img1.rows );
    ;i )
        {
            H );
    line( result, scene_corners[] ]  , , ),  );
    line( result, scene_corners[]  ]  , , ),  );
    line( result, scene_corners[] ]  , , ),  );
    line( result, scene_corners[]   ]  , , ),  );
    imshow("result",  result);
    imwrite("result.jpg",result);
    waitKey();
}
    
对后面这段代码重点解析。
1、首先为了能够最后方便显示,首先就是将两幅图片合成了一副图片,采用的是copyto+mask参数的方法。这种方法是我在AskOpenCV上面学到的。
 ));
    Mat MatSub , img1.cols);
    img1.copyTo(MatSub);
    MatSub *img1.cols);
    img2.copyTo(MatSub);
2、创建特征提取函数
  );
    ]);
    (]);
    finder->collectGarbage();
 
直接创建OrbFeaturesFinder的智能指针对象,调用指针函数,寻找到特征到
 
ImageFeatures的数据结构中去。
 
这里,如果进行代码跟踪,就会发现对于同一幅图方法二找到ORB特征和方法一找到的是不一样的。
方法二在这里,将特征点的寻找,和特征向量的提取计算全部集成封装,需要注意。
struct CV_EXPORTS ImageFeatures
{
    int img_idx;
    Size img_size;
    std::vector<KeyPoint> keypoints;
    UMat descriptors;
};
可以看到,ImageFeatures结构中不经包括了keypoints的vector,而且包括了UMat的descriptors,一步到位
3、特征匹配和提存
 vector.3f);
    (*matcher)(features, pairwise_matches);
    matcher->collectGarbage();
 
这里的封装应该说更多。在方法一种,在这里经过了BruteForce特征匹配,排序,Ransac
 
提纯3个步骤,那么在Stitching模块中,只是用了一个方法。如果根据函数中去,可以发
 
现其实实现步骤和方法一类似,但是也有自己不同地方
 
4、仿射变换、绘制结果
 
 );
    std);
    obj_corners[] ,); 
    obj_corners[]  );
    obj_corners[] ] , img1.rows );
    ;i )
        {
            H );
    line( result, scene_corners[] ]  , , ),  );
    line( result, scene_corners[]  ]  , , ),  );
    line( result, scene_corners[] ]  , , ),  );
    line( result, scene_corners[]   ]  , , ),  );
    imshow("result",  result);
    imwrite("result.jpg",result);
 
这里和方法一类似,需要注意的地方就是由于H等数据结构都已经集成
 
在pairwise_matches的数据结构中,所以通过一个循环找到自己需要的H。
 
小结:这里初步对Stitching模块中对特征提取的封装解析进行了分析,为下一步图像拼接的深入研究做技术准备。值得注意的是目前看上去,Stitching模块中对特征提取的封
 
装实现的结果不如原生的方法好,这里是由于我操作的原因,还是因为本身设计的原因还要继续研究。
 
 
 

Stitching模块中对特征提取的封装解析(以ORB特性为例)的更多相关文章

  1. Stitching模块中leaveBiggestComponent初步研究

    在Stitching模块中以及原始论文<Automatic Panoramic Image Stitching using Invariant Features>3.2中,都有" ...

  2. Stitching模块中focalsFromHomography初步研究

    在Stitching模块中,通过“光束法平差”的时候,有一个步骤为“通过单应矩阵估算摄像头焦距”,调用的地方为:   , ));    ] ];    d2 ] ]) ] ]);    v1 ] ]  ...

  3. nodejs中的子进程,深入解析child_process模块和cluster模块

    Node.js的进程管理   node遵循的是单线程单进程的模式,node的单线程是指js的引擎只有一个实例,且在nodejs的主线程中执行,同时node以事件驱动的方式处理IO等异步操作.node的 ...

  4. opencv笔记--stitching模块

    opencv 提供了全景图像拼接的所有实现,包括: 1)stitching 模块提供了图像拼接过程中所需要的基本元素,该模块主要依赖于 features2d 模块: 2)提供了 stitching_d ...

  5. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...

  6. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 34 角点检测的 FAST 算法 目标 • 理解 FAST 算法的基础 • 使用 OpenCV 中的 FAST 算法相关函 ...

  7. iOS中WebKit框架应用与解析

    WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大,性能也更优. 引言 在iOS8之前,在应用中嵌入网页通常需要使用UIWebView这样一个类,这个类通过UR ...

  8. MFC Wizard创建的空应用程序中各个文件内容的解析

    创建的MFC应用程序名为:wd,那么: 一.wd.h解析 // wd.h : main header file for the WD application // #if !defined(AFX_W ...

  9. 【Python中if __name__ == '__main__': 的解析】

    在很多Python代码中,在代码的最下方会看到  if __name__ == '__main__':,这段代码到底有什么用呢? 在理解这个语句的作用前,需要知道的是,一般的Python文件后缀为.p ...

随机推荐

  1. 【IIS】模块 DLL C:\Windows\System32\inetsrv\authcert.dll 未能加载。返回的数据为错误信息。

    解决方案,check  IIS --Client Certificate Mapping Authentication installed?

  2. Struts 入门(一) 搭建Struts环境

    eclipse中创建项目 搭建步骤: 1.创建web项目 2.下载导入相关jar包 3.创建并完善相关配置文件 4.创建(控制器)Action 并测试启动 1.文件--新建--动态web项目 给项目起 ...

  3. 记录初次使用tesseract的过程

    目录 简介 安装tesseract 安装成功 python应用识别图片 简介 这个谷歌的识别项目早就听说了,使用之后发现,真的很厉害.写下初次简单使用的过程吧. 安装tesseract 谷歌的开源识别 ...

  4. jQuery返回顶部实用插件YesTop

    只需一句jQuery代码实现返回顶部效果体验:http://hovertree.com/texiao/yestop/ 使用方法:只需引用jQuery库和YesTop插件(jquery.yestop.j ...

  5. Pycharm取消默认的右击运行unittest方法

    Pycharm取消默认的右击运行unittest方法:File-> Settings -> Tools -> Python Integrated Tools -> Defaul ...

  6. js Ajax 跨域请求

    一.使用jsonp的方式(只支持get请求) 二.使用cors的方式(支持HTTP的大部分请求方式) 三.apache的转发(修改服务器配置) 没有试验,暂时不详细写!

  7. 剑指Offer——把字符串转换成整数

    题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0   输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果 ...

  8. 兼容获取scrollTop和scrollLeft(被滚动条卷走的部分)

    function scroll() { //ie9+ 标准浏览器 if (window.pageYOffset != null) { return { left: window.pageXOffset ...

  9. python常见模块之random模块

    import random print(random.random()) #随机产生一个0-1之间的小数 print(random.randint(1,3)) #随机产生一个1-3之间的整数,包括1和 ...

  10. 【我的Android进阶之旅】Android 7.0报异常:java.lang.SecurityException: COLUMN_LOCAL_FILENAME is deprecated;

    之前开发的一个和第三方合作的apk,在之前公司的 Android 5.1 系统的手表上运行正常,今天在公司新开发的 Android 7.1系统的手表上运行的时候,使用 DownloadManager ...