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 笔记相关推荐

  1. OpenCV API使用笔记 —— 4. 如何保存视频文件

    文章目录 写入图片帧信息 C/CPP示例 Python示例 在<OpenCV API使用笔记 -- 1. 如何打开摄像头或视频文件> 介绍过使用「VideoCapture」类,可以打开摄像 ...

  2. stitching_detailed.cpp : throw_no_cuda

    1. 问题点 opencv-4图像拼接官方示例代码,opencv-4.5.5/samples/cpp/stitching_detailed.cpp 打开--try_cuda yes开关后运行测试, o ...

  3. opencv进阶学习笔记3:像素运算和图像亮度对比度调节

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版目录: python+opencv进阶版学习笔记目录(适合有一定基础) 像素运算 要求两张图大小,以及格式(np ...

  4. 【计算机视觉】opencv入门学习笔记Part.1

    [计算机视觉]opencv入门学习笔记Part.1 1 前言 1.1 opencv概述(摘取自百度百科) 1.2 图像概念引入 1.3 安装opencv库 2 图像基本操作 2.1 图像的读取 2.2 ...

  5. opencv cuda使用笔记

    目录 cuda拷贝 cuda+opencv yolov4 颜色转换: cv::cuda::split 查看10*10像素 down_load用法 特别全的学习资料: 我想将OpenCV::cuda:: ...

  6. opencv进阶学习笔记10:图像金字塔和图像梯度

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 图像金字塔 变小 变大 原理 ...

  7. 【OpenCV入门学习笔记2】:Mat对象

    b站:https://www.bilibili.com/video/BV1uW411d7Wf?p=5 我在b站的学习笔记和实验代码的整理如下: 示例代码: Matdemo //------------ ...

  8. 【OpenCV入门学习笔记1】:Mat对象的指针操作和掩膜操作

    b站:https://www.bilibili.com/video/BV1uW411d7Wf?p=5 下面是我在b站上看视频学习的笔记和操作的示例代码 实例代码 #include<opencv2 ...

  9. opencv进阶学习笔记14:分水岭算法 实现图像分割

    基础版学习笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 分水岭算法原理 分水岭算法 ...

最新文章

  1. Weex第一天:手势
  2. 基于强化学习的自动化剪枝模型
  3. canvas-js贝塞尔曲线代码在线生成工具
  4. Delphi中流对象 TStream
  5. ansible的安装和ansible的模板
  6. 突破C++瓶颈,在此一举!
  7. PHP 全局变量global详解
  8. 如何使用分析模型 — 1. 关联图,从乱麻中里出头绪
  9. 网络工程师职业发展路线规划三步走
  10. 4核a5中断linux,Cortex A5 MPcore寄存器TPIDRPRW复位值不为零,造成Linux Kernel不能启动的问题...
  11. Java 排序算法:折半插入排序
  12. 迷你世界勒索病毒,你的文件被删了吗?
  13. ad20中如何在pcb里查找器件,AD中原理图如何查找相应的元件?
  14. Hadoop单机版安装
  15. plist图片列表分割拆分器(修复输出图片错误的BUG)
  16. background-color:transparent
  17. R:员工离职预测实战
  18. plantcare的html打开空白,PlantCARE, a plant cis-acting regulatory element database
  19. Centos打开3306端口
  20. opencv-python图像孔洞填充

热门文章

  1. Mysql 内存管理及优化
  2. scal 解析json字符串
  3. 创维4k电视测试软件,创维4色4K真牛 国产硬件最强电视评测!
  4. 机器学习入门难?说说我是如何快速开始机器学习入门的!
  5. 抖音视频怎样伪原创 视频剪辑md5值
  6. ISP算法----基本DPC算法实现代码
  7. 记一次Windows勒索病毒应急响应实战
  8. 基于Arduino实现简单人体红外感应灯(人体红外传感器+LED)
  9. 没时间学 Vue (7) —— 渲染(二):条件渲染 v-if
  10. 传说这才是真正的程序猿,你是吗?