0

OpenCV を使用して記述子の辞書を作成しようとしています。BOWKmeansTrainer のメソッド .cluster() を使用すると、アプリケーションが未処理の例外をスローします

OpenCV エラー: アサーションが失敗しました (data.dims <= 2 && type == CV_32F && K > 0) 不明な関数、ファイル ......\src\opencv\modules\core\src\matrix.cpp、行2485 不明な例外

なぜそれが起こるのか理解できません。パラメータを変更しようとしましたが、役に立ちませんでした。

この問題を解決する方法を教えてください。

int main(int argc, char* argv[]) {

const int countClusters = 2;

vector<string> fileList;

GetFilesInFolder(folder_one, fileList);

vector<bool> trainMask(fileList.size());
InitRandomBoolVector(trainMask, 0.1);

Ptr<FeatureDetector> keypointsDetector = FeatureDetector::create("HARRIS");

Ptr<DescriptorExtractor> descriptorsExtractor = DescriptorExtractor::create("BRIEF");

Mat descriptors;
Mat voc;

TermCriteria tc(TermCriteria::COUNT + TermCriteria::EPS, 10, 0.001);
BOWKMeansTrainer bowTrainer(vocSize,tc);
for(int i = 0;i < filesList.size();i++)
{
    if(is_voc.at(i))
    {
        vector<KeyPoint> keypoints;
        Mat image = imread(filesList.at(i));

        keypointsDetector->detect(image,keypoints);
        descriptorsExtractor->compute(image,keypoints,descriptors);
        bowTrainer.add(descriptors);
    }
}
try
{
    voc = bowTrainer.cluster();
}
catch(std::exception ex)
{
    printf(ex.what());
}


return 0;

}

4

1 に答える 1

0

BOWKMeansTrainer に入力しているキーポイントと記述子が有効であることを確認しましたか? これは始めるのに良い場所かもしれないと思います。

SIFT を使用して記述子を BOWKMeansTrainer にフィードできましたが、これを HARRIS/BRIEF で使用するかどうかはわかりません。SIFT メソッドのコードは次のとおりです。

    Mat allDescriptors;
    SiftDescriptorExtractor detector;
    for (int i = 1; i <= 10; i++) {
        // get keypoints
        vector<KeyPoint> keypoints;
        // assuming you have a function intToString that converts your iterator to a string,
        // this line creates a file path, e.g. /home/ubuntu/1.jpg to /home.ubuntu/10.jpg
        string imagePath = "<put path to your image here>" + "/" + intToString(i) + ".jpg";
        Mat imageToUse = imread(imagePath, CV_LOAD_IMAGE_GRAYSCALE); //Load as grayscale
        detector.detect(imageToUse, keypoints);
        // get descriptors
        Mat descriptors;
        detector.compute(imageToUse, keypoints,descriptors);
        // load descriptors into your descriptor array
        allDescriptors.push_back(descriptors);
    }

このコードは、キー ポイントの検出と記述子の抽出の両方に SiftDescriptorExtractor を使用します。キー ポイントと記述子をファイルに保存すると、それらが次元 128*n の Mat であることがわかります。ディスクリプタをファイルに保存して、期待するサイズになっていることを確認してください。

これでない場合は、トレーナーに使用しているパラメーターである可能性があります。

幸運を。BOWKMeans のセットアップは非常に困難です。

于 2014-02-13T20:05:08.160 に答える