特征点检测和匹配
特征点检测和匹配
在OpenCV中,已经封装好了FAST算法的API,也就是FastFeatureDetector这一个类。当我们使用这个算法时,需要先通过FastFeatureDetector::create()这个方法来创建一个FAST特征检测器,其参数含义如下:
第一个参数thresh:就是算法过程中的阈值t,默认值为10;
第二个参数nonmaxSuppresiion:布尔值,默认值为true,表示是否使用非极大值抑制,如果为true则当某个中心像素点的灰度值不是其邻域中的最大值时,则将其淘汰掉,只保留在邻域中是最大值的中心像素点;如果为false则表示不使用非极大值抑制;
第三个参数DetectorType:检测邻域类型,有TYPE_5_8 、TYPE_7_12 、TYPE_9_16这几种可选类型,默认值为TYPE_9_16。
当我们创建好FAST特征检测器后,就可以通过detect()方法来对图像进行FAST特征点检测,得到一幅图像的KeyPoint类型的FAST特征点。
演示代码:
auto fast = FastFeatureDetector::create(20,true,FastFeatureDetector::DetectorType::TYPE_9_16);
Mat image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\tem.jpg");
vector<KeyPoint> keyPoints;
fast->detect(image, keyPoints, Mat());//最新写法
Mat result;
drawKeypoints(image, keyPoints, result, Scalar::all(-1), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
imshow("image", image);
imshow("result", result);
RANSAC算法在特征匹配中的应用
RANSAC原理
OpenCV中滤除误匹配对采用RANSAC算法寻找一个最佳单应性矩阵H,矩阵大小为3×3。RANSAC目的是找到最优的参数矩阵使得满足该矩阵的数据点个数最多,通常令h33=1来归一化矩阵。由于单应性矩阵有8个未知参数,至少需要8个线性方程求解,对应到点位置信息上,一组点对可以列出两个方程,则至少包含4组匹配点对。
RANSAC算法步骤:
1. 随机从数据集中随机抽出4个样本数据 (此4个样本之间不能共线),计算出变换矩阵H,记为模型M;
2. 计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集 I ;
3. 如果当前内点集 I 元素个数大于最优内点集 I_best , 则更新 I_best = I,同时更新迭代次数k ;
4. 如果迭代次数大于k,则退出 ; 否则迭代次数加1,并重复上述步骤;
注:迭代次数k在不大于最大迭代次数的情况下,是在不断更新而不是固定的