OpenCV 3.0.0 SurfFeatureDetector und SurfDescriptorExtractor Fehler

Ich bin versucht zu implementieren, die die OpenCV-3.0.0-SURF-Feature-Beschreibung und Erkennung ist aber nach ausführen des Beispielcodes über die OpenCV Website, erhalte ich eine Last von Fehlern, die alle im Zusammenhang mit SURFEN. Irgendeine Idee, was könnte schief gehen? Danke!

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

using namespace cv;
using namespace cv::xfeatures2d;

void readme();

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

    Mat img_object = imread(argv[1], IMREAD_GRAYSCALE);
    Mat img_scene = imread(argv[2], IMREAD_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;

    Ptr<SURF> detector = SURF.create(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),
        std::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, 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
    imshow("Good Matches & Object detection", img_matches);

    waitKey(0);
    return 0;
}

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

Fehler:

1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(34): warning C4832: token '.' is illegal after UDT 'cv::xfeatures2d::SURF'
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(111) : see declaration of 'cv::xfeatures2d::SURF'
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(34): error C2275: 'cv::xfeatures2d::SURF' : illegal use of this type as an expression
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(111) : see declaration of 'cv::xfeatures2d::SURF'
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(34): error C2228: left of '.create' must have class/struct/union
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(38): error C2039: 'detect' : is not a member of 'cv::Ptr<cv::xfeatures2d::SURF>'
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(39): error C2039: 'detect' : is not a member of 'cv::Ptr<cv::xfeatures2d::SURF>'
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(42): error C2259: 'cv::xfeatures2d::SURF' : cannot instantiate abstract class
1>          due to following members:
1>          'void cv::xfeatures2d::SURF::setHessianThreshold(double)' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(127) : see declaration of 'cv::xfeatures2d::SURF::setHessianThreshold'
1>          'double cv::xfeatures2d::SURF::getHessianThreshold(void) const' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(128) : see declaration of 'cv::xfeatures2d::SURF::getHessianThreshold'
1>          'void cv::xfeatures2d::SURF::setNOctaves(int)' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(130) : see declaration of 'cv::xfeatures2d::SURF::setNOctaves'
1>          'int cv::xfeatures2d::SURF::getNOctaves(void) const' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(131) : see declaration of 'cv::xfeatures2d::SURF::getNOctaves'
1>          'void cv::xfeatures2d::SURF::setNOctaveLayers(int)' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(133) : see declaration of 'cv::xfeatures2d::SURF::setNOctaveLayers'
1>          'int cv::xfeatures2d::SURF::getNOctaveLayers(void) const' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(134) : see declaration of 'cv::xfeatures2d::SURF::getNOctaveLayers'
1>          'void cv::xfeatures2d::SURF::setExtended(bool)' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(136) : see declaration of 'cv::xfeatures2d::SURF::setExtended'
1>          'bool cv::xfeatures2d::SURF::getExtended(void) const' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(137) : see declaration of 'cv::xfeatures2d::SURF::getExtended'
1>          'void cv::xfeatures2d::SURF::setUpright(bool)' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(139) : see declaration of 'cv::xfeatures2d::SURF::setUpright'
1>          'bool cv::xfeatures2d::SURF::getUpright(void) const' : is abstract
1>          c:\users\belayachiry\documents\opencv\opencv\build\include\opencv2\nonfree\nonfree.hpp(140) : see declaration of 'cv::xfeatures2d::SURF::getUpright'
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(87): warning C4018: '<' : signed/unsigned mismatch
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(105): warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(105): error C3861: 'line': identifier not found
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(106): warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(106): error C3861: 'line': identifier not found
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(107): warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(107): error C3861: 'line': identifier not found
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(108): warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>c:\users\belayachiry\documents\visual studio 2013\projects\imagewatch\imagewatch\source.cpp(108): error C3861: 'line': identifier not found
gut, die erste Sache, die falsch ist Ptr<SURF> detector = SURF.create(minHessian); sollte Es Ptr<SURF> detector = SURF::create(minHessian); seit create ist statisch. Vielleicht andere.. korrigieren Sie dies und sehen, was passiert
Das löste einige Fehler! Danke!!!! Allerdings detector.detect(img_object, keypoints_object);, SurfDescriptorExtractor extractor;, und line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); noch Probleme verursachen, für einige Grund. Irgendwelche Ideen? @Miki

InformationsquelleAutor Rhamy Belayachi | 2015-07-13

Schreibe einen Kommentar