私は現在、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() を使用しようとしましたが、どちらも機能しませんでした。
私はコーディングを続けながらこれを理解しようとし続けますが、どんな助けや洞察も本当に感謝しています.