OpenCV stitching_detailed.cpp 笔记

OpenCV stitching_detailed.cpp 笔记

根据4.0.0-pre的文档。

 

1.

函数 

template Ptr cv::makePtr()

返回 一个Ptr类型的对象。

 

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 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 aspect

double focal

double ppx

double ppy

Mat R

Mat 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中的描述是:

  • :焦距
  • :扭曲变形
  • :传感器中心点x
  • :长宽比
  • :传感器中心点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,c++)