Ask Your Question
0

Module nonfree - Features2D + Homography to find a known object - OpenCV 3.1

asked 2016-04-14 17:31:56 -0500

pmejiaz gravatar image

Hi. Im learning opencv so im trying to run the oficial example Features2D + Homography to find a known object. http://docs.opencv.org/2.4/doc/tutori...

I already install opencv_contri. however, I get an error in the nonfree module.

Before that, i could run the example "Creating Bounding boxes and circles for contours " but now i cant run the actual example.

Please, Help me with that!

Thk

image description

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.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_object = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
  Mat img_scene = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );

  if( !img_object.data || !img_scene.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_object, keypoints_scene;

  detector.detect( img_object, keypoints_object );
  detector.detect( img_scene, keypoints_scene );

  //-- Step 2: Calculate descriptors (feature vectors)
  SurfDescriptorExtractor extractor;

  Mat descriptors_object, descriptors_scene;

  extractor.compute( img_object, keypoints_object, descriptors_object );
  extractor.compute( img_scene, keypoints_scene, descriptors_scene );

  //-- Step 3: Matching descriptor vectors using FLANN matcher
  FlannBasedMatcher matcher;
  std::vector< DMatch > matches;
  matcher.match( descriptors_object, descriptors_scene, matches );

  double max_dist = 0; double min_dist = 100;

  //-- Quick calculation of max and min distances between keypoints
  for( int i = 0; i < descriptors_object.rows; i++ )
  { double dist = matches[i].distance;
    if( dist < min_dist ) min_dist = dist;
    if( dist > max_dist ) max_dist = dist;
  }

  printf("-- Max dist : %f \n", max_dist );
  printf("-- Min dist : %f \n", min_dist );

  //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
  std::vector< DMatch > good_matches;

  for( int i = 0; i < descriptors_object.rows; i++ )
  { if( matches[i].distance < 3*min_dist )
     { good_matches.push_back( matches[i]); }
  }

  Mat img_matches;
  drawMatches( img_object, keypoints_object, img_scene, keypoints_scene,
               good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
               vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

  //-- Localize the object
  std::vector<Point2f> obj;
  std::vector<Point2f> scene;

  for( int i = 0; i < good_matches.size(); i++ )
  {
    //-- Get the keypoints from the good matches
    obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );
    scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );
  }

  Mat H = findHomography( obj, scene, CV_RANSAC );

  //-- Get the corners from the image_1 ( the object to be "detected" )
  std::vector<Point2f> obj_corners(4);
  obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( img_object.cols, 0 );
  obj_corners[2] = cvPoint( img_object.cols, img_object.rows ); obj_corners[3] = cvPoint( 0, img_object.rows );
  std::vector<Point2f> scene_corners(4);

  perspectiveTransform( obj_corners, scene_corners, H);

  //-- Draw lines between the corners (the mapped object in the scene - image_2 )
  line( img_matches, scene_corners[0] + Point2f( img_object.cols, 0), scene_corners[1] + Point2f( img_object.cols, 0), Scalar(0, 255, 0), 4 );
  line( img_matches, scene_corners[1] + Point2f( img_object.cols, 0), scene_corners[2] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
  line( img_matches, scene_corners[2] + Point2f( img_object.cols, 0), scene_corners[3] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
  line( img_matches, scene_corners[3] + Point2f( img_object.cols, 0), scene_corners[0] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );

  //-- Show detected matches ...
(more)
edit retag flag offensive close merge delete

Comments

please show us the error msg. (as text, screenshots are useless)

you should use opencv3 docs and tutorials , not the 2.4 version

berak gravatar imageberak ( 2016-04-14 23:38:58 -0500 )edit

1 answer

Sort by ยป oldest newest most voted
1

answered 2016-04-15 02:54:31 -0500

strann gravatar image

updated 2016-04-15 02:55:28 -0500

Starting from OpenCV 3.0 features2d module has been reorganized (some feature detectors has been moved to opencv_contrib/xfeatures2d module) and nonfree module has been removed. So to use SURF you should include opencv2/xfeatures2d.hpp instead of opencv2/nonfree/nonfree.hpp. Please refer to example http://docs.opencv.org/ref/master/tut...

edit flag offensive delete link more

Comments

Thanks stann, your answer is so perfect for me. I had not found the information that you posted for me. It's true, the module nonfree is now in xfeatures2d.

Now I dont have any error at the code, however when I compiled dont appeared me the result. This is the message

        'Opencv_Contrib1.exe' (Win32): Loaded 'C:\Users\PAOLA\Documents\Visual Studio 2015\Projects\Opencv_Contrib1\x64\Debug\Opencv_Contrib1.exe'. Symbols loaded.
    'Opencv_Contrib1.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. Cannot find or open the PDB file.
    'Opencv_Contrib1.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. Cannot find or open the PDB file.
    ....
***** VIDEOINPUT LIBRARY - 0.1995 - TFW07 *****
The program '[12524] Opencv_Contrib1.exe' has exited with code
pmejiaz gravatar imagepmejiaz ( 2016-04-15 07:16:01 -0500 )edit

What code the program has exited with? Cannot find or open the PDB fileare just warnings which have no influence in the execution of your application. PDB files are the symbols that you can use to debug in the IDE. See http://answers.opencv.org/question/12...

strann gravatar imagestrann ( 2016-04-15 10:19:43 -0500 )edit

Sorry! The program '[3700] Opencv_Contrib3.exe' has exited with code -1 (0xffffffff).

The problem is that I when compiled the code, the console open but the final product (the image with the correlation) dont open.

pmejiaz gravatar imagepmejiaz ( 2016-04-15 15:26:08 -0500 )edit
Login/Signup to Answer

Question Tools

1 follower

Stats

Asked: 2016-04-14 17:31:56 -0500

Seen: 455 times

Last updated: Apr 15 '16