OpenCV  4.10.0
开源计算机视觉
加载...
搜索...
无匹配项
平面目标检测

上一教程: Features2D + 仿射变换来查找已知目标
下一教程: AKAZE 局部特征匹配

原作者Victor Eruhimov
兼容性OpenCV >= 3.0

本教程的目的是学习如何使用 features2dcalib3d 模块检测场景中的已知平面目标。

测试数据:使用数据文件夹中的图像,例如 box.png 和 box_in_scene.png。

  • 创建新的控制台项目。读取两张输入图像。
    Mat img1 = imread(argv[1], IMREAD_GRAYSCALE);
    Mat img2 = imread(argv[2], IMREAD_GRAYSCALE);
    
  • 在两张图像中检测关键点,并为各个关键点计算描述符。
    // detecting keypoints
    Ptr<Feature2D> surf = SURF::create();
    vector<KeyPoint> keypoints1;
    Mat descriptors1;
    surf->detectAndCompute(img1, Mat(), keypoints1, descriptors1);
    
    ... // do the same for the second image
    
  • 现在,找到第一张图像的描述符与第二张图像最接近匹配项:
    // matching descriptors
    BruteForceMatcher<L2<float> > matcher;
    vector<DMatch> matches;
    matcher.match(descriptors1, descriptors2, matches);
    
  • 可视化结果:
    // drawing the results
    namedWindow("matches", 1);
    Mat img_matches;
    drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
    imshow("matches", img_matches);
    waitKey(0);
    
  • 找出两组点之间的单应性变换:
    vector<Point2f> points1, points2;
    // fill the arrays with the points
    ....
    Mat H = findHomography(Mat(points1), Mat(points2), RANSAC, ransacReprojThreshold);
    
  • 创建一组内点匹配并绘制它们。使用 perspectiveTransform 函数用单应性映射点

    Mat points1Projected; perspectiveTransform(Mat(points1), points1Projected, H);

  • 使用 drawMatches 绘制内点。