1

2枚の写真を一致させるプログラムを書きました。そしてこれがコードです。しかし、BruteForceMatcher> (flann ではない) を使用すると動作します。

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

using namespace cv;

void help()
{
    printf("\nThis program demonstrates using features2d detector, descriptor extractor and simple matcher\n"
    "Using the SURF desriptor:\n"
    "\n"
    "Usage:\n matcher_simple <image1> <image2>\n");
}

int main()
{

    Mat img1 = imread("C:\\Users\\Hayk\\Desktop\\source1.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    Mat img2 = imread("C:\\Users\\Hayk\\Desktop\\source2.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    if(img1.empty() || img2.empty())
    {
        printf("Can't read one of the images\n");
        return -1;
    }

    // detecting keypoints
    SurfFeatureDetector detector(6000);
    vector<KeyPoint> keypoints1, keypoints2;
    detector.detect(img1, keypoints1);
    detector.detect(img2, keypoints2);

    // computing descriptors
    SurfDescriptorExtractor extractor;
    Mat descriptors1, descriptors2;
    extractor.compute(img1, keypoints1, descriptors1);
    extractor.compute(img2, keypoints2, descriptors2);

    // matching descriptors
    FlannBasedMatcher matcher;
    vector<DMatch> matches;
    matcher.match(descriptors1, descriptors2, matches);

    // drawing the results
    namedWindow("matches", 1);
    Mat img_matches;
    drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
    imshow("matches", img_matches);
    waitKey(0);

    return 0;
} 

そして、プログラムを実行した後にこのエラーが発生します

OpenCV Error: Assertion failed (dataset.type() == CvType<T>::type()) in unknown
function, file c:\Users\vp\work\ocv\opencv\modules\features2d\..\flann\include\o
pencv2/flann/flann.hpp, line 105

私が間違っていることを誰かに教えてもらえますか?

4

2 に答える 2

2

コードは、OpenCV 2.3.1a を使用する Linux で問題なく動作します。

Windows 用の C++ OpenCV のインターフェイスでいくつかの問題が発生しました。Windows を使用する必要がある場合は、C インターフェイスを使用します。

于 2011-12-16T11:49:00.227 に答える
1

BruteForceMatcherで動作しますが、Flannでは動作しないとおっしゃいました。最小限の例を作成しました。これを実行して、質問で得たのと同じエラーが発生するかどうかを教えてください。

問題を特定しようとしているだけです。

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

using namespace cv;

int main()
{
    // Five descriptors with random values between 0 and 0.2
    Mat descriptors(5, 64, CV_32FC1);
    RNG rng;
    rng.fill(descriptors, cv::RNG::UNIFORM, 0.0, 0.2);


    // the query descriptor should yield a match in row 3 of the train descriptors
    Mat query_descriptors;
    query_descriptors.push_back(descriptors.row(3));

    // Match using Brute Force. On your machine this should work. 
    BruteForceMatcher< L2<float> > brute_matcher;
    vector<DMatch> matches;
    brute_matcher.match(query_descriptors, descriptors, matches);
    std::cout << "Brute Force Matcher: " << std::endl;
    for(int i=0; i<matches.size(); ++i)
    {
        std::cout << matches[i].queryIdx << " <--> " << matches[i].trainIdx << std::endl;
    }


    // The code should fail here because we are now going to use the FlannBasedMatcher
    std::cout << "Flann Based Matcher: " << std::endl;
    FlannBasedMatcher matcher;
    matcher.match(query_descriptors, descriptors, matches);
    for(int i=0; i<matches.size(); ++i)
    {
        std::cout << matches[i].queryIdx << " <--> " << matches[i].trainIdx << std::endl;
    }

    return 0;
} 
于 2011-12-16T12:23:42.983 に答える