Previous topic

Features2D + Homography to find a known object

Next topic

AKAZE local features matching

Detection of planar objectsΒΆ

The goal of this tutorial is to learn how to use features2d and calib3d modules for detecting known planar objects in scenes.

Test data: use images in your data folder, for instance, box.png and box_in_scene.png.

  1. Create a new console project. Read two input images.

    Mat img1 = imread(argv[1], IMREAD_GRAYSCALE);
    Mat img2 = imread(argv[2], IMREAD_GRAYSCALE);
    
  2. Detect keypoints in both images and compute descriptors for each of the keypoints.

    // 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
    
  3. Now, find the closest matches between descriptors from the first image to the second:

    // matching descriptors
    BruteForceMatcher<L2<float> > matcher;
    vector<DMatch> matches;
    matcher.match(descriptors1, descriptors2, matches);
    
  4. Visualize the results:

    // drawing the results
    namedWindow("matches", 1);
    Mat img_matches;
    drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
    imshow("matches", img_matches);
    waitKey(0);
    
  5. Find the homography transformation between two sets of points:

    vector<Point2f> points1, points2;
    // fill the arrays with the points
    ....
    Mat H = findHomography(Mat(points1), Mat(points2), RANSAC, ransacReprojThreshold);
    
  6. Create a set of inlier matches and draw them. Use perspectiveTransform function to map points with homography:

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

  7. Use drawMatches for drawing inliers.