根据4.0.0-pre的文档。
函数
template Ptr cv::makePtr()
返回 一个Ptr
SurfFeaturesFinder 为类名,继承自cv::detail::FeaturesFinder类。FeaturesFinder类定义了find( )函数并重载了( )运算符,( )运算符将调用find( )。
FeaturesFinder对象的collectGarbage()方法将主动清理内部存储。
上述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元素用作用户自行定义图像文件的索引。
在初期处理每个输入图像并提取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( )方法。
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。
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的定义在文档中是
cv::detail::AffineBestOf2NearestMatcher和cv::detail::BestOf2NearestRangeMatcher两个子类对上述构造函数根据自身功能进行了扩展。
FeaturesMatcher类定义了collectGarbage()用于释放临时内部存储。
stitching_details.cpp使用了下术方法对初始的匹配进行过滤。
vector indices = leaveBiggestComponent(
features, pairwise_matches, conf_thresh);
结果是过滤后的索引值。
cv::detail::Estimator类是各种求解rotation的基类,以下是它的派生类:
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类型。
如上所述BundleAdjusterBase类也是从cv::detail::Estimator类派生而来,其描述在文档上是这样的
Base class for all camera parameters refinement methods.
它的子类包括:
BundleAdjusterBase类提供了setConfThresh( )方法设定置信度的下限。
进行bundle adjustment前,需要通过setRefinementMask( )方法设定需要进行估计的对象,共有五个对象。这些对象在stitching_details.cpp中的描述是:
注意setRefinementMask( )接受一个Mat作为参数,该参数的维度为3x3。
该部分内容参考
https://stackoverflow.com/questions/38359046/how-to-use-opencv-bundle-adjustment
waveCorrect( )函数的文档描述是
Tries to make panorama more horizontal (or vertical).
cv::WarperCreator是各类warp图像方法的工厂类。
cv::detail::RotationWarper的文档描述是
Rotation-only model image warper interface.
提供warp( )接口。
cv::detail::ExposureCompensato 是曝光补偿的基类。
使用了cv::detail::SeamFinder类。
使用了cv::detail::Blender拼接图像。