1

私は現在、OpenCV を使用した個人プロジェクトに取り組んでおり、プログラムの実行中にいくつかの問題があります。AKAZE + BOW レコグナイザー (私の問題には十分に機能していないようでした) を実装した後、SIFT (そして最終的には SURF) の実装を試してみたいと思いました。

私のプロジェクトでは、githubで見つかったこのプロジェクトに従っており、Windows 10 で VS2015 (コミュニティ) と OpenCV 2.4.13 を使用しています。

タイトルに記載されているように、私が抱えている問題は、実行中に無効なパラメーターを取得する ucrtbase.dll にあります (他のスレッドを正しく読み取れば、dll は Windows 10 の OS ライブラリである必要があります)。for cicle が 2 番目の反復に移動するとき (別名、BOW トレーニング用に別の画像の特徴を取得することになっているとき) に問題が発生します。これは、実行が停止し、タイトルのエラーが表示されるときです。

さまざまなことを試しました(たとえば、検出器/抽出器に異なるコンストラクターを使用したり、コードのコメント部分にコメントを付けたり)、デバッグセッション中に、検出機能が原因でエラーが発生したようですが、理由はわかりません(また、述べたように以下のコードで、検出関数とそれに続く関数をコメントすると、問題が修正されます)。

drawKeypoints 関数 (別のテストで使用) は、キーポイントを正しく描画しているようです (これは、検出関数が正しく機能していることを意味するはずです)。

以下に、エラーが発生しているスニペットを示します。

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

    const int nimages = 4;
    const int nclusters = 2;

    const char *datapath = "./database";

    SiftFeatureDetector detector(400);
    SiftDescriptorExtractor extractor;
    Ptr<BOWTrainer> bow_train = makePtr<BOWKMeansTrainer>(nclusters);

    for (int i = 0; i<nimages; i++)
    {

        Mat im, feat;
        std::vector<KeyPoint> kp;

        // read an image from the database
        im = cv::imread(format("%s/%d.png", datapath, i + 1), 1);

        // detect keypoints
        detector.detect(im, kp); // commenting from here avoids the error

        // extract features
        extractor.compute(im, kp, feat);

        // add features for bow training
        bow_train->add(feat);

    }

    /* more stuff here */
}

問題を理解するために他に知っておくべきことがあれば教えてください。

あなたが私に与えることができる助け/アドバイスを前もって感謝します.

編集1:

cicles のすべてを削除しようとしましたが、プログラムはすべての関数を正しく実行して最後に到達することができましたが、メインから戻るときにまだ ucrtbase.dll エラーが発生しています。VS デバッグ中に気付いたもう 1 つのことは、cicles 中またはプログラムの最後に (その dll を使用して) メモリの割り当てを解除する必要がある場合に、デバッガーが例外を生成することです。

ここのデバッガーには解決策があると思いますが、そのdllの何が問題なのかはわかりません。時間があれば、助けていただければ幸いです。

編集2:

数日間のテストの後、エラーは以下の割り当て解除から来ているようです:

std::vector< cv::KeyPoint >

KeyPoint ベクトルがインスタンス化され、プログラムの終了時にのみ破棄される場合、計算は正常に機能し、最後に dll エラーが発生します (これは面倒ですが、簡単なテストでは対処できます)。

問題は、これらのベクトルを引数として渡すことなく使用する関数を作成したいということです。割り当て解除が問題のように思われるので、上記の関数を呼び出すたびにプログラムをクラッシュさせずにそれを行うことはできません。また、ベクターで clear() と swap() を使用しようとしましたが、どちらも機能しませんでした。

私はコーディングを続けながらこれを理解しようとし続けますが、どんな助けや洞察も本当に感謝しています.

4

2 に答える 2

4

ベクトルの割り当て解除でクラッシュするこの問題は、間違ったバージョンの OpenCV ライブラリに対してリンクすることに関係しているようです。デバッグでビルドしている場合は、opencv_world320d.lib (または opencv_world310.lib または使用している OpenCV のバージョンのライブラリ) に対してリンクする必要があります。バージョン番号の後の "d" は重要です。リリース構成の場合は、opencv_worldXXX.lib を使用してリンクします。

「無効なパラメーターが考慮される関数に渡されました...」というメッセージが表示される場合、これは同じ問題の症状です。

于 2017-06-14T09:00:55.453 に答える
1

しばらくして、私はこれを理解したと思います。

問題は VS2015 コンパイラにあったようです: OpenCV 2.4.13 にはそのバージョンの VS にいくつかの問題があり、おそらく VS2015 で動作するはずの vc14 ではなく vc12 フォルダーしかないためです (基本的に、互換性は完全には保証されていません)。

OpenCV3.1 ビルド (追加のモジュールを含む) に移行した後、プログラムは例外をスローすることなく実行されています。

于 2016-11-10T16:48:41.113 に答える