OpenCV stitching_detailed.cpp 笔记
OpenCV stitching_detailed.cpp 笔记
根据4.0.0-pre的文档。
1.
函数
template<typename T> Ptr<T> cv::makePtr()
返回 一个Ptr<T>类型的对象。
2.
SurfFeaturesFinder 为类名,继承自cv::detail::FeaturesFinder类。FeaturesFinder类定义了find( )函数并重载了( )运算符,( )运算符将调用find( )。
FeaturesFinder对象的collectGarbage()方法将主动清理内部存储。
3.
上述FeaturesFinder类的对象的find( )方法将结果保存在一个 cv::detail::ImageFeatures struct中。ImageFeatures 结构具有4个元素,分别是
UMat descriptors;int img_idx;Size img_size;std::vector< KeyPoint > keypoints;
其中UMat可以理解成给予OpenCL进行自动加速的Mat类型。参考https://jeanvitor.com/opencv-opencl-umat-performance/
KeyPoint是存储特征点的通用类。img_idx元素用作用户自行定义图像文件的索引。
4.
在初期处理每个输入图像并提取feature时,使用Mat.clone( )方法进行数据复制。Mat的clone( )方法和copyTo( )方法都可进行Mat的deep copy,但是他们有不同行为。clone( )函数总是会修改被赋值的目标对象的地址,而copyTo( )会尝试复用目标对象的存储空间(尤其是源和目标的数据类型与数量完全一致时)。参考 https://stackoverflow.com/questions/15672600/whats-the-difference-between-matclone-and-matcopyto上yangjie的回答。
用到Mat的release( )方法。
5.
MatchesInfo类用于描述图像之间的匹配关系。其中,
Mat H;
为两幅图像之间的转换矩阵。
std::vector< DMatch > matches;
中,DMatch类用于描述特征点的匹配情况,定义有distance和descriptor index。其中descriptor index是对两幅图上相匹配特征点的descriptor 的索引。关于trainIdx和queryIdx的定义,可以参考
https://stackoverflow.com/questions/10765066/what-is-query-and-train-in-opencv-features2d
其中queryIdx表示待匹配的基准,trainIdx表示用于与基准进行匹配的second image。
6.
FeaturesMatcher类为特征匹配相关类的基类。在4.0.0-pre中,cv::detail::BestOf2NearestMatcher继承于FeaturesMatcher。之后cv::detail::BestOf2NearestMatcher被cv::detail::AffineBestOf2NearestMatcher和cv::detail::BestOf2NearestRangeMatcher两个子类继承。
FeaturesMatcher定义了 ( ) 方法进行特征匹配。stitching_details.cpp使用了它的下术接口。
void operator() (const std::vector< ImageFeatures > &features, std::vector< MatchesInfo > &pairwise_matches, const cv::UMat &mask=cv::UMat())
void operator() ( const std::vector< ImageFeatures > &features, std::vector< MatchesInfo > &pairwise_matches, const cv::UMat &mask=cv::UMat() )
对于所有搜索到的匹配,都将以MatchesInfo类型存储。
匹配结果可使用
String cv::detail::matchesGraphAsString ( std::vector< String > & pathes, std::vector< MatchesInfo > & pairwise_matches, float conf_threshold )
转化为字符串。
BestOf2NearestMatcher方法的构造函数需要4个关键参数,
cv::detail::BestOf2NearestMatcher::BestOf2NearestMatcher( bool try_use_gpu = false, float match_conf = 0.3f, int num_matches_thresh1 = 6, int num_matches_thresh2 = 6 )
分别是gpu使用、匹配置信度,匹配阈值1和2。num_matches_thresh1和num_matches_thresh2的定义在文档中是
- num_matches_thresh1: Minimum number of matches required for the 2D projective transform estimation used in the inliers classification step
- num_matches_thresh2: Minimum number of matches required for the 2D projective transform re-estimation on inliers
cv::detail::AffineBestOf2NearestMatcher和cv::detail::BestOf2NearestRangeMatcher两个子类对上述构造函数根据自身功能进行了扩展。
FeaturesMatcher类定义了collectGarbage()用于释放临时内部存储。
7.
stitching_details.cpp使用了下术方法对初始的匹配进行过滤。
vector<int> indices = leaveBiggestComponent( features, pairwise_matches, conf_thresh);
结果是过滤后的索引值。
8.
cv::detail::Estimator类是各种求解rotation的基类,以下是它的派生类:
- cv::detail::AffineBasedEstimator
- cv::detail::BundleAdjusterBase
- cv::detail::HomographyBasedEstimator
cv::detail::Estimator定义了estimate()方法,该方法讲结果保存至cv::detail::CameraParams类中。CameraParams类定义有共有成员变量如下:
double aspectdouble focaldouble ppxdouble ppyMat RMat t
CameraParams定义有K( )方法,应该是用于返回内参矩阵的,还没有测试。另外CameraParams重载了=运算符。对于t,文档的描述是这样的:
Translation is assumed to be zero during the whole stitching pipeline.
还未确认这个的正确性。
stitching_details.cpp中使用Mat的convertTo( )函数将CameraParams对象的R成员变量转化为了CV_32F类型。
9.
如上所述BundleAdjusterBase类也是从cv::detail::Estimator类派生而来,其描述在文档上是这样的
Base class for all camera parameters refinement methods.
它的子类包括:
- cv::detail::BundleAdjusterAffine
- cv::detail::BundleAdjusterAffinePartial
- cv::detail::BundleAdjusterRay
- cv::detail::BundleAdjusterReproj
- cv::detail::NoBundleAdjuster
BundleAdjusterBase类提供了setConfThresh( )方法设定置信度的下限。
进行bundle adjustment前,需要通过setRefinementMask( )方法设定需要进行估计的对象,共有五个对象。这些对象在stitching_details.cpp中的描述是:
- <fx>:焦距
- <skew>:扭曲变形
- <ppx>:传感器中心点x
- <aspect>:长宽比
- <ppy>:传感器中心点y
注意setRefinementMask( )接受一个Mat作为参数,该参数的维度为3x3。
该部分内容参考
https://stackoverflow.com/questions/38359046/how-to-use-opencv-bundle-adjustment
10.
waveCorrect( )函数的文档描述是
Tries to make panorama more horizontal (or vertical).
11.
cv::WarperCreator是各类warp图像方法的工厂类。
cv::detail::RotationWarper的文档描述是
Rotation-only model image warper interface.
提供warp( )接口。
12.
cv::detail::ExposureCompensato 是曝光补偿的基类。
13.
使用了cv::detail::SeamFinder类。
14.
使用了cv::detail::Blender拼接图像。
OpenCV stitching_detailed.cpp 笔记相关推荐
- OpenCV API使用笔记 —— 4. 如何保存视频文件
文章目录 写入图片帧信息 C/CPP示例 Python示例 在<OpenCV API使用笔记 -- 1. 如何打开摄像头或视频文件> 介绍过使用「VideoCapture」类,可以打开摄像 ...
- stitching_detailed.cpp : throw_no_cuda
1. 问题点 opencv-4图像拼接官方示例代码,opencv-4.5.5/samples/cpp/stitching_detailed.cpp 打开--try_cuda yes开关后运行测试, o ...
- opencv进阶学习笔记3:像素运算和图像亮度对比度调节
基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版目录: python+opencv进阶版学习笔记目录(适合有一定基础) 像素运算 要求两张图大小,以及格式(np ...
- 【计算机视觉】opencv入门学习笔记Part.1
[计算机视觉]opencv入门学习笔记Part.1 1 前言 1.1 opencv概述(摘取自百度百科) 1.2 图像概念引入 1.3 安装opencv库 2 图像基本操作 2.1 图像的读取 2.2 ...
- opencv cuda使用笔记
目录 cuda拷贝 cuda+opencv yolov4 颜色转换: cv::cuda::split 查看10*10像素 down_load用法 特别全的学习资料: 我想将OpenCV::cuda:: ...
- opencv进阶学习笔记10:图像金字塔和图像梯度
基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 图像金字塔 变小 变大 原理 ...
- 【OpenCV入门学习笔记2】:Mat对象
b站:https://www.bilibili.com/video/BV1uW411d7Wf?p=5 我在b站的学习笔记和实验代码的整理如下: 示例代码: Matdemo //------------ ...
- 【OpenCV入门学习笔记1】:Mat对象的指针操作和掩膜操作
b站:https://www.bilibili.com/video/BV1uW411d7Wf?p=5 下面是我在b站上看视频学习的笔记和操作的示例代码 实例代码 #include<opencv2 ...
- opencv进阶学习笔记14:分水岭算法 实现图像分割
基础版学习笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 分水岭算法原理 分水岭算法 ...
最新文章
- Weex第一天:手势
- 基于强化学习的自动化剪枝模型
- canvas-js贝塞尔曲线代码在线生成工具
- Delphi中流对象 TStream
- ansible的安装和ansible的模板
- 突破C++瓶颈,在此一举!
- PHP 全局变量global详解
- 如何使用分析模型 — 1. 关联图,从乱麻中里出头绪
- 网络工程师职业发展路线规划三步走
- 4核a5中断linux,Cortex A5 MPcore寄存器TPIDRPRW复位值不为零,造成Linux Kernel不能启动的问题...
- Java 排序算法:折半插入排序
- 迷你世界勒索病毒,你的文件被删了吗?
- ad20中如何在pcb里查找器件,AD中原理图如何查找相应的元件?
- Hadoop单机版安装
- plist图片列表分割拆分器(修复输出图片错误的BUG)
- background-color:transparent
- R:员工离职预测实战
- plantcare的html打开空白,PlantCARE, a plant cis-acting regulatory element database
- Centos打开3306端口
- opencv-python图像孔洞填充