图像拼接|OpenCV3.4 stitching源码分析(一)

  • 前言
    • 特征点检测
      • 源码
      • 应用

前言

图像拼接|——OpenCV3.4 stitching模块分析(一)特征点检测
参考opencv_赵春江的专栏_zhaocj-CSDN博客

特征点检测

OpenCV3.4中实现了surf、orb、sift等特征检测算法,默认的是surf。
特征检测算法的实现主要包含在 “opencv2/stitching/detail/matchers.hpp” 中。

源码

首先定义了一个ImageFeatures结构体用于存放特征信息,包括图片序号、尺寸、特征点信息及描述子矩阵:

struct CV_EXPORTS ImageFeatures
{int img_idx;Size img_size;std::vector<KeyPoint> keypoints;UMat descriptors;
};

定义FeaturesFinder基类,其中的成员函数find()是用来寻找特征信息:

class CV_EXPORTS FeaturesFinder
{public:virtual ~FeaturesFinder() {}//重载void operator ()(InputArray image, ImageFeatures &features);//寻找给定图像特征void operator ()(InputArray image, ImageFeatures &features, const std::vector<cv::Rect> &rois);//并行寻找给定图像特征void operator ()(InputArrayOfArrays images, std::vector<ImageFeatures> &features,const std::vector<std::vector<cv::Rect> > &rois);//重载void operator ()(InputArrayOfArrays images, std::vector<ImageFeatures> &features);//释放内存virtual void collectGarbage() {}protected://纯虚函数,根据用户所选取的特征类别,调用不同子类的find函数virtual void find(InputArray image, ImageFeatures &features) = 0;//判断是否可以并行bool isThreadSafe() const;
};

FeaturesFinder基类派生出SurfFeaturesFinder、SiftFeaturesFinder、OrbFeaturesFinder等派生类。
SurfFeaturesFinder派生类定义:

class CV_EXPORTS SurfFeaturesFinder : public FeaturesFinder
{public:SurfFeaturesFinder(double hess_thresh = 300., int num_octaves = 3, int num_layers = 4,int num_octaves_descr = /*4*/3, int num_layers_descr = /*2*/4);private:void find(InputArray image, ImageFeatures &features) CV_OVERRIDE;Ptr<FeatureDetector> detector_;Ptr<DescriptorExtractor> extractor_;Ptr<Feature2D> surf;
};

SiftFeaturesFinder派生类定义:

class CV_EXPORTS SiftFeaturesFinder : public FeaturesFinder
{public:SiftFeaturesFinder();private:void find(InputArray image, ImageFeatures &features) CV_OVERRIDE;Ptr<Feature2D> sift;
};

OrbFeaturesFinder派生类定义:

class CV_EXPORTS OrbFeaturesFinder : public FeaturesFinder
{public:OrbFeaturesFinder(Size _grid_size = Size(3,1), int nfeatures=1500, float scaleFactor=1.3f, int nlevels=5);private:void find(InputArray image, ImageFeatures &features) CV_OVERRIDE;Ptr<ORB> orb;Size grid_size;
};

关于各个特征检测算法的具体实现,就不具体展开了,一般只要知道怎样调用高级API即可。

应用

#include <iostream>
#include "opencv2/highgui.hpp"
#include "opencv2/stitching/detail/matchers.hpp"using namespace std;
using namespace cv;
using namespace cv::detail;int main()
{Mat img = imread("4.jpg");Ptr<FeaturesFinder> finder1, finder2, finder3;finder1 = makePtr<SurfFeaturesFinder>();finder2 = makePtr<OrbFeaturesFinder>();finder3 = makePtr<SiftFeaturesFinder>();ImageFeatures features1, features2, features3;(*finder1)(img, features1);(*finder2)(img, features2);(*finder3)(img, features3);Mat output_img1, output_img2, output_img3;//调用drawKeypoints函数绘制特征drawKeypoints(img, features1.keypoints, output_img1, Scalar(255, 0, 0));drawKeypoints(img, features2.keypoints, output_img2, Scalar(255, 0, 0));drawKeypoints(img, features3.keypoints, output_img3, Scalar(255, 0, 0));cout << "Number of surf keypoints: " << features1.keypoints.size() << endl;cout << "Number of orb keypoints: " << features2.keypoints.size() << endl;cout << "Number of sift keypoints: " << features3.keypoints.size() << endl;namedWindow("surf");imshow("surf", output_img1);namedWindow("orb");imshow("orb", output_img2);namedWindow("sift");imshow("sift", output_img3);waitKey(0);return 0;
}

运行结果:

surf orb sift

Number of surf keypoints: 1403
Number of orb keypoints: 1346
Number of sift keypoints: 1287
主观视觉上还是SIFT更稳健一些,不过stitching默认使用的是surf。

图像拼接|OpenCV3.4 stitching源码分析(一)相关推荐

  1. 图像拼接|OpenCV3.4 stitching源码分析(一)续

    图像拼接|OpenCV3.4 stitching源码分析(一)续 前言 OpenCV与VLFeat的SIFT实现之对比 opencv vlfeat 参考 前言 图像拼接|--OpenCV3.4 sti ...

  2. RobHess的SIFT源码分析:综述

    最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. Stitcher类使用方法请查Op ...

  3. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  5. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  6. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  7. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  8. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  9. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

最新文章

  1. 声波配网:通过特定的声波序列将wifi密码发到无屏幕的设备上
  2. scrapy 6023 telnet查看爬虫引擎相关状态
  3. 【荐】说说CSS Hack 和向后兼容
  4. ASP.NET 2.0中实现模板中的数据绑定
  5. 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.2 设计验证和确认...
  6. Linux常用的几个监控系统性能的命令
  7. 【分享】学长的安利来了~~O(∩_∩)O
  8. API功能测试如何实施(转载自测试之道 微信公众号)
  9. 生成微信二维码,微信扫码登录网站
  10. Photoshop插件-增加细节-脚本开发-PS插件
  11. HI3559A,Hi3519A,Hi3556A芯片产品参数介绍资料
  12. asic面试题目 英伟达_英伟达笔试题目ASIC|英伟达笔试题
  13. 微信小程序--加载动画【水波涟漪效果】
  14. 360度反馈调查表中的问题示范
  15. 【SDOI2015】星际战争 网络流
  16. 三无电子烟与即将到来的监管时代
  17. CS231n公开课系列1_视频+课件+作业下载+GitHub批量下载工具
  18. python学习需要多长时间
  19. Excel 对表格的某一列数据进行名次排序
  20. Windows使用命令关闭一键关闭所有程序

热门文章

  1. 从零单排,使用 Netty 构建 IM 聊天室~
  2. VM安装系统 出现nor find File.gho
  3. 习题宝典Android版App展示及源码
  4. 安装完CentOS 7 后必做的七件事
  5. Dockerfile 简单例子
  6. 如何用arduino+ethernet shield(W5100)与yeelink结合5分钟实现传感器数据web上传
  7. 深耕县域共享单车的大佬松果出行 官网竟是个杂米域名?
  8. 【技法操作】PS制作音乐图标,UI设计教程
  9. php通过qq邮箱发送邮件,PHP 利用QQ邮箱发送邮件「PHPMailer」
  10. CodeForces - 1303 A Erasing Zeroes B National Project