当进行跟踪时,或者其他类型用到关键点及其描述符的分析时,通常需要做三件事情。第一个是根据一些关键点的定义搜索图像闭关查找图像中的所有关键点。第二个是为发现的每个关键字创建一个描述符。第三个是通过将所找到的关键点的描述符与一些现有的描述符集进行毕竟,看看是否可以找到匹配项。在跟踪应用程序中,最后一步涉及查找序列的一帧图像中的特征,并长室将其与前一帧中的特征进行匹配。在目标检测应用程序在,人们通常会在一些数据库中搜索“已知”特征的“已知”与各个目标或目标类相关联的特征。
对于这些层中的每一个,Opencv提供了一个遵循“做东西的类”模型的泛化机制。因此,对于这些阶段中的每一个,都有一个抽象基类,它为从其派生的一系列对象定义一个公共接口;每个派生类都实现一个特定的算法。
如果要找到关键点,我们将需要一些表示它们的方法。回想一些,关键点不是特征描述符,所有当我们有一个关键点时,大多数时候都需要知道它所在的位置,之后,有些关键点会有次要特征,有些则没有。这就是cv::KeyPoint的实际定义。
为了找到关键点或计算描述符,opencv提供了cv::Feature2D类。有一些叫做cv::FearureDetector和cv::DesriptorExractor的类,它们是用于单纯的特征检测或描述符提取算法的单独类,但是从Opencv3开始,他们都是cv::Feature2D的同义词。派生类添加了一些更多的方法来设置和检索各种属性,以及构造算法实例并返回智能指针的静态方法。如果它是一个单纯的关键点检测算法(如FAST),实际的实现可能只是执行cv::Feature2D::detect;如果它是一个特征描述算法(如FREAK),实际的实现可能只是cv::Feature2D::compute();在要求“完全解决”的算法情况下,如SIFT、SURF、ORB、BRISK等,实际的表现就会是cv::Feature2D::computeAndCompute,在这种情况下,detect和compute就会被显式调用。
一般来说,匹配器将是一个尝试将一个图像中的关键点与其他单个图像或称为字典的其他图像的集合进行匹配的对象。当找到匹配时,Opnecv通过生成的cvv::DMatch对象的列表(STL向量)来描述它们。
同时,使用cv::drawKeyPoint来显示关键点,使用cv::drawMatches来显式进行关键点匹配。
匹配方法:(1)使用BFMatcher类进行暴力匹配 (2)使用FlannBasedMatcher类进行快速近似最邻近方法匹配。