1

Objective: match blobs by using Surf descriptors and opencv 2.4.9 library.

Algorithm: based on the following link: Steps


#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"

using namespace cv;

void readme();

/** @function main */
int main( int argc, char** argv )
{
  if( argc != 3 )
  { readme(); return -1; }

  Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
  Mat img_2 = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );

  if( !img_1.data || !img_2.data )
  { std::cout<< " --(!) Error reading images " << std::endl; return -1; }

  //-- Step 1: Detect the keypoints using SURF Detector
  int minHessian = 400;

  SurfFeatureDetector detector( minHessian );

  std::vector<KeyPoint> keypoints_1, keypoints_2;

  detector.detect( img_1, keypoints_1 );
  detector.detect( img_2, keypoints_2 );

  //-- Draw keypoints
  Mat img_keypoints_1; Mat img_keypoints_2;

  drawKeypoints( img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
  drawKeypoints( img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT );

  //-- Show detected (drawn) keypoints
  imshow("Keypoints 1", img_keypoints_1 );
  imshow("Keypoints 2", img_keypoints_2 );

  waitKey(0);

  return 0;
  }

  /** @function readme */
  void readme()
  { std::cout << " Usage: ./SURF_detector <img1> <img2>" << std::endl; }

Results for keypoints detection: In the following image the number of keypoints is very high and not many are important. How can I select the best sub-set of keypoints that best describe a blob. Is there a better way other than Surf? These Blobs are binary enter image description here

Community
  • 1
  • 1
Hani Goc
  • 2,371
  • 5
  • 45
  • 89

1 Answers1

1

A higher minHessian will yield fewer KeyPoints.

It is hard to tell from the images what are the two input images you are trying to match and what exactly is your goal (will matching the "Vo" of "Vos.." with that of "Votre..." be a success or a failure?

Rosa Gronchi
  • 1,828
  • 15
  • 25
  • at the moment i don't to mach these images. I am trying to see how can I select the best sub-set of keyPoints. The fewer keypoints do you think might give same results? I think I should test it. TY – Hani Goc Dec 03 '14 at 11:45
  • 1
    That depends on the images, but weaker keypoints are usually less reliable and fewer keypoints will make the model selection more reliable/robust. Other heuristics for lowering the number of keypoints may be dividing the image to tiles and choosing up to N keypoints per tile (and potentially the remaining K strongest keypoints from the entire image). You can also discard near identical keypoints since they usually represent textured areas and are hard to match. – Rosa Gronchi Dec 04 '14 at 12:26