Обнаружение функции в Features2d - PullRequest
0 голосов
/ 28 марта 2012

Кто-нибудь знает, как работает функция обнаружения? например здесь:

Mat img = imread (...);    
SurfFeatureDetector detector(400); 
vector<KeyPoint> keypoints;
detector.detect(img, keypoints);

особенно, как это пишет в ключевых точках.

Мне нужно написать некоторые координаты в ключевых точках без использования

detector.detect(...);

Это не работает

keypoints.push_back(KeyPoint(i,j);

следующая задача: У меня есть функция:

void trajkovic(Mat img, vector<KeyPoint> keypoints)
{    for( int i = 0; i < img.rows-3; i++ )
        for( int j = 0; j < img.cols-3; j++ )
        {   Point2f keyPointLocation(i, j);
            keypoints.push_back(KeyPoint(keyPointLocation, 1)); } }

int main()
{   Mat img_object = imread( ".../box.png", CV_LOAD_IMAGE_GRAYSCALE );
    Mat img_scene = imread( ".../box_in_scene.png", CV_LOAD_IMAGE_GRAYSCALE );

    std::vector<KeyPoint> keypoints_object, keypoints_scene;
    trajkovic(img_object, keypoints_object);
    trajkovic(img_scene, keypoints_scene);
  • вместо (*inder.detect (img_object, keypoints_object); *)

    //-- 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::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 );
    
    cvWaitKey(0);
    return 0;
    

    }

в findHomography у меня есть ошибка: «Утверждение не удалось (npoints> = 0 && points2.Vector (2) == npoints)) в findHomography, файл /modules/calib3d/src/fundam.cpp, строка 1062»

что не так? Я думаю, что-то не так с

keypoints.push_back(KeyPoint(keyPointLocation, 1));

спасибо большое

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Если вы хотите вручную создать KeyPoint's , вот небольшой пример для начала:

vector<KeyPoint> keyPoints;
for(int i = 0; i < 10; i++)
{
    for(int j = 0; j < 10; j++)
    {
        Point2f keyPointLocation(i, j);
        float meaningfulNeighborhoodDiameter = 5.0;
        keyPoints.push_back(KeyPoint(keyPointLocation, meaningfulNeighborhoodDiameter));
    }
}

Надеюсь, это поможет!

1 голос
/ 28 марта 2012

Прежде всего, вам нужно скинуть документацию opencv . cv::KeyPoint - это структура для хранения точек, обнаруженных объектом cv::FeatureDetector. Он содержит координаты ключевой точки, диаметр значимой окрестности, ориентацию и отклик. Расчет ключевых точек зависит от определения детектора (Sift, Surf, Mser, ...)

Начало здесь !

...