2011-12-15 13 views
1

2枚の画像を一致させるプログラムを作成しました。 これがコードです。しかし、私がBruteForceMatcher>(flannではなく)を使用すると動作します。私はプログラムOpenCV flann.hアサーションエラー

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 

を実行した後に取得しています

#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; 
} 

そして、このエラーは、誰もが私が間違っているのものを私に言うことはできますか?

+0

このエラーの原因となる正確な行を特定しましたか? – karlphillip

答えて

2

あなたのコードはOpenCV 2.3.1aのLinuxでうまく動作します。

私はWindows用のC++ OpenCVのインターフェイスにいくつかの問題がありました。私はWindowsを使用する必要があるとき、私はCインターフェイスを使用します。

+0

ありがとう、私はしようとしますが、私は[公式サイト](http://opencv.itseez.com/doc/user_guide/ug_features2d.html#the-code)でそれを見つけたので、このコードはうまくいくはずです私のコードの間で(公式コードではBrutForceMatcher > matcherを使用しますが、FlannBasedMatcher matcherを使用しようとしています)、 "brute"が動作している間に "flann"が動作しない理由を知りたいと思います。とにかく私の質問にあなたの注意のためにありがとう:) – haykart

+0

これは、OpenCV 2.2.xでLinux上で正常に動作します。 – Unapiedra

+0

**このコードはLinux **上で動作します。私はコピーして貼り付け、コンパイルして実行しました。それは良いです!なぜWindows上で動作しないのかは謎です。私はあなたのOpenCVライブラリを最新のものに更新してやり直すことをお勧めします。それでも動作しない場合は、Windows用のC++インターフェイスにバグがあります。この場合、私は驚くことはありません。 Linux上で動作する場合は、Windowsでも動作します。 – karlphillip

1

あなたはFluteではなくBruteForceMatcherで動作すると言っています。私は最小限の例を作りました。あなたはこれを実行して、あなたがあなたの質問に持っているのと同じエラーを得るかどうか教えてください。

問題をピン止めしようとしています。

#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; 
} 
+0

私はそれを試してみますが、20時間後(申し訳ありませんが、それは私の設定とプログラムが私の職場にあるからです) – haykart

+1

とにかく助けてくれてありがとう – haykart

関連する問題