上一个教程 : 利用特征 2D + 同源性查找已知物体
下一个教程 : AKAZE 局部特征匹配
原作者 | Victor Eruhimov |
---|---|
兼容性 | OpenCV >= 3.0 |
本教程的目的是学习如何使用 features2d 和 calib3d 模块检测场景中的已知平面物体。
测试数据:使用数据文件夹中的图片,例如 box.png 和 box_in_scene.png。
- 创建一个新的控制台项目。读取两张输入图像:
Mat img1 = imread(argv[1], IMREAD_GRAYSCALE);
Mat img2 = imread(argv[2], IMREAD_GRAYSCALE);
- 检测两幅图像中的关键点,并计算每个关键点的描述符:
// 检测关键点
Ptr<Feature2D> surf = SURF::create();
vector<KeyPoint> keypoints1;
Mat descriptors1;
surf->detectAndCompute(img1, Mat(), keypoints1, descriptors1);
... // 对第二幅图像做同样的处理
- 现在,查找第一幅图像中描述符与第二幅图像中描述符最接近的匹配项: :
// 匹配的描述符
BruteForceMatcher<L2<float> > matcher;
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
- 可视化结果
// 绘制结果
namedWindow("matches", 1);
Mat img_matches;
drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
imshow("matches", img_matches);
waitKey(0);
- 查找两组点之间的同构变换: :
vector<Point2f> points1, points2;
// 用点填充数组
....
Mat H = findHomography(Mat(points1), Mat(points2), RANSAC, ransacReprojThreshold);
- 创建一组离群匹配点并绘制它们。使用 perspectiveTransform(透视变换)函数绘制具有同源性的点:
Mat points1Projected; perspectiveTransform(Mat(points1), points1Projected, H);
- 使用 drawMatches 绘制离群点。