'SurfFeatureDescriptor' giving linker errors

asked 2012-09-19 13:07:06 -0500

gaurav_kl gravatar image

updated 2012-10-02 05:32:59 -0500

V.G. gravatar image

Hi I am new to openCV and am trying to do some object detection in 2 images . I am trying out the sample code in this link for object detection. http://docs.opencv.org/trunk/doc/tutorials/features2d/feature_homography/feature_homography.html#explanation I have also included the "nonfree" module as per the change in 2.4 so I am not getting compiler error but am getting errors while running the code.Please suggest what might be wrong. This is the error and the code is below the error Error-

  "cv::DescriptorMatcher::match(cv::Mat const&, cv::Mat const&, __gnu_debug_def::vector<cv::DMatch, std::allocator<cv::DMatch> >&, cv::Mat const&) const", referenced from:

  "cv::FeatureDetector::detect(cv::Mat const&, __gnu_debug_def::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&, cv::Mat const&) const", referenced from:
_main in main.o
  "cv::drawMatches(cv::Mat const&, __gnu_debug_def::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> > const&, cv::Mat const&, __gnu_debug_def::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> > const&, __gnu_debug_def::vector<cv::DMatch, std::allocator<cv::DMatch> > const&, cv::Mat&, cv::Scalar_<double> const&, cv::Scalar_<double> const&, __gnu_debug_def::vector<char, std::allocator<char> > const&, int)", referenced from:

  "cv::DescriptorExtractor::compute(cv::Mat const&, __gnu_debug_def::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&, cv::Mat&) const", referenced from:

symbols not found

Here is the code

/**
 * @file SURF_Homography
 * @brief SURF detector + descriptor + FLANN Matcher + FindHomography
 * @author A. Huaman
 */

#include <stdio.h>
#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
void readme();

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

    cv::Mat img_object = cv::imread( "/user/gaurav_kl/Desktop/sample/p1.tif", CV_LOAD_IMAGE_GRAYSCALE );
    cv::Mat img_scene = cv::imread( "/user/gaurav_kl/Desktop/sample/p2.tif", 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 from img_1 in img_2 
    std ...
(more)
edit retag flag offensive close merge delete

Comments

Are you sure you've added opencv_nonfree242d.lib (in version 2.4.2 )or to linker additional dependencies? (make sure you've added all the libraries)

Perator gravatar imagePerator ( 2012-10-03 09:58:01 -0500 )edit