图像拼接|OpenCV3.4 stitching源码分析(一)
图像拼接|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源码分析(一)相关推荐
- 图像拼接|OpenCV3.4 stitching源码分析(一)续
图像拼接|OpenCV3.4 stitching源码分析(一)续 前言 OpenCV与VLFeat的SIFT实现之对比 opencv vlfeat 参考 前言 图像拼接|--OpenCV3.4 sti ...
- RobHess的SIFT源码分析:综述
最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. Stitcher类使用方法请查Op ...
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...
- SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...
- Yolov3Yolov4网络结构与源码分析
Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...
- ViewGroup的Touch事件分发(源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...
- View的Touch事件分发(二.源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...
最新文章
- 声波配网:通过特定的声波序列将wifi密码发到无屏幕的设备上
- scrapy 6023 telnet查看爬虫引擎相关状态
- 【荐】说说CSS Hack 和向后兼容
- ASP.NET 2.0中实现模板中的数据绑定
- 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.2 设计验证和确认...
- Linux常用的几个监控系统性能的命令
- 【分享】学长的安利来了~~O(∩_∩)O
- API功能测试如何实施(转载自测试之道 微信公众号)
- 生成微信二维码,微信扫码登录网站
- Photoshop插件-增加细节-脚本开发-PS插件
- HI3559A,Hi3519A,Hi3556A芯片产品参数介绍资料
- asic面试题目 英伟达_英伟达笔试题目ASIC|英伟达笔试题
- 微信小程序--加载动画【水波涟漪效果】
- 360度反馈调查表中的问题示范
- 【SDOI2015】星际战争 网络流
- 三无电子烟与即将到来的监管时代
- CS231n公开课系列1_视频+课件+作业下载+GitHub批量下载工具
- python学习需要多长时间
- Excel 对表格的某一列数据进行名次排序
- Windows使用命令关闭一键关闭所有程序
热门文章
- 从零单排,使用 Netty 构建 IM 聊天室~
- VM安装系统 出现nor find File.gho
- 习题宝典Android版App展示及源码
- 安装完CentOS 7 后必做的七件事
- Dockerfile 简单例子
- 如何用arduino+ethernet shield(W5100)与yeelink结合5分钟实现传感器数据web上传
- 深耕县域共享单车的大佬松果出行 官网竟是个杂米域名?
- 【技法操作】PS制作音乐图标,UI设计教程
- php通过qq邮箱发送邮件,PHP 利用QQ邮箱发送邮件「PHPMailer」
- CodeForces - 1303 A Erasing Zeroes B National Project