2016-10-16 424 views
0

現在、私はOpenCVを使用した個人用プロジェクトに取り組んでおり、プログラムの実行中にいくつか問題があります。 AKAZE + BOWレコグナイザを実装した後(私の問題ではうまく機能していなかったようです)、私はSIFT(とSURF)実装を試してみたかったのです。私のプロジェクトのためにucrtbase.dll:無効なパラメータが無効なパラメータを致命的と見なす関数に渡されました。

私はgithubで見つかったこの1を次のようだし、タイトルに記載されているように私は、

私がいる問題の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 */ 
} 

を教えてください:あなたは、エラーを与えているスニペットを見ることができます

お手数ですが事前にお問い合わせいただきありがとうございます。

EDIT 1:

私はciclesのためのすべてを削除しようとしたプログラムが正しく、すべての機能を実行するエンドに到達するために管理しますが、メインからの復帰時には、まだucrtbase.dllエラーを与えています。私がVSのデバッグ中に気づいたもう一つの事は、デバッガがメモリを(そのdllを使って)解放しなければならないときに例外を生成するということです。

ここではデバッガには解決策があると思いますが、そのDLLの問題は実際には分かりません。スペアに時間があれば、本当に助けになるでしょう。テストの数日後に、それはエラーがの解除から来ているようだ

EDIT 2キーポイントベクトルがインスタンス化され、プログラムが終了したときにのみ破棄された場合

std::vector< cv::KeyPoint >

、計算ちょうどうまく動作し、最後にdllエラーがあります(これは迷惑ですが、対処できる迅速なテストのためです)。

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

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

答えて

0

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

OpenCV 2.4.13の問題はVS2015コンパイラで問題だったようですが、OpenCV 2.4.13ではVSのバージョンに問題があります。これはVS2015で動作するはずのvc14ではなくvc12フォルダしかないためです完全に保証されています)。

OpenCV3.1ビルド(追加のモジュールを使用)に移動した後、プログラムは例外をスローせずに実行されています。

1

この問題は、OpenCVライブラリの間違ったバージョンとリンクすることと関係があると思われます。あなたがデバッグでビルドしている場合は、opencv_world320d.lib(またはopencv_world310.libまたは使用しているOpenCVのバージョンのライブラリ)にリンクする必要があります。バージョン番号の後の「d」は重要です。リリース構成では、opencv_worldXXX.libを使用してリンクします。

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

関連する問題