2012-12-20 9 views
13

OpenCVで提供されているユーティリティを使用して訓練したOpenCVの車両を検出するために、MIT cars datasetからトレーニングされたHaarカスケード分類器を使用しています。デバッグモードでコンパイルするとうまく動作しますが、リリースモードでコンパイルすると、カスケードは検出をまったく行いません。下のテストイメージで次のコードを実行すると、デバッグモードでは検出されますが、リリースモードでは何も検出されません(この動作はデータシーケンス内のすべてのイメージに適用されます)。リリース/デバッグモード時にHaarカスケードを使用した結果が異なります

これがなぜ発生するのか、さらに重要なことは、リリースモードで実行しているときに検出を行うためにできることを提案できますか?:

Cascade File

コード

cv::Mat testImage = cv::imread("testImage.png",0); 
cv::equalizeHist(testImage, testImage); 

cv::CascadeClassifier vehicleCascade; 
vehicleCascade.load("cars3.xml"); 

// Detect vehicles 
std::vector<cv::Rect> cars; 
vehicleCascade.detectMultiScale(
    testImage,     // Input image 
    cars,     // Output bounding boxes 
    1.1,     // scale factor - how much image size is reduced at each scale 
    5,      // min neighbours - how many neighbours required to maintain rect 
    0|CV_HAAR_SCALE_IMAGE, // Not used 
    cv::Size(30,30),  // Min poss object size 
    cv::Size()    // Max poss object size 
    ); 

std::cout << "Found " << cars.size() << " objects.\n"; 

for (int i=0; i<cars.size(); ++i) 
    cv::rectangle(testImage, cars.at(i), CV_RGB(255,0,0), 3); 

cv::namedWindow("Haar cascade"); 
cv::imshow("Haar cascade", testImage); 
cv::waitKey(0); 
cv::imwrite("output.png", testImage); 

TestImage

testImage

+0

イメージとカスケードファイルは正常にロードされますが、実際のコードでは完全なディレクトリパスが使用されます。私が知る限り、どちらのモードでもエラーはなく、唯一の違いはdetectMultiScaleが返すオブジェクトの数です。 – Chris

+0

Ok:/ pngについての部分が関係していないので、最初のコメントを削除しました。 –

+0

これは、多くの場合、UBを持ち、特定の動作(コードまたはライブラリのいずれか)に依存しているか、または異なる特別に生成されたコードに依存していることの兆候です(リリースモードでレジスタに滞留することによる浮動小数点精度など)。あなたがここで行うことができる最も良いことは、関係するすべての計算を両方のモードで段階的に比較し、どこから逸脱し始めるのかを把握することです。 – PlasmaHH

答えて

3
  1. これは変ですが、私にとっては両方のモードでコードが正常に動作しています。私はWindows 7の32ビットでVisual Studio 2010を使用しています。私のプロジェクトはhttps://www.dropbox.com/s/5kubn5tlu7k6ziy/opencvhw.rarなので、実行ファイル(リリースとデバッグのディレクトリ)をチェックすることができます。 Visual Studioを使用していて、それを自分でビルドする場合は、ライブラリへのパスを変更し、両方のモードのディレクトリをインクルードする必要があります(ディレクトリパスは同じですが、ライブラリディレクトリのパスは異なります)。 (プロジェクト - > ...プロパティ - >構成プロパティ - > vC++ディレクトリ)

  2. 一般的に私は本当にプロジェクトの設定を慎重に確認することをお勧めします。非常に奇妙な行動を引き起こす可能性のある小さなミスをするのは本当に簡単です。場合によっては、すべてを最初からもう一度設定することが最善の方法です。

  3. OpenCVは非常に奇妙なバグを持っています。例えば、私はデバッグ中にいくつかのコーデックを使うことができません - 私はデバッグモードでプログラムを実行しても、ファイルから読み込まれた各フレームは空です(しかしそのサイズは正しい)。 ちょっと似たようなことが起こった可能性があります。イメージを別のフォーマットに変換しようとしてください(私はbmpがテストのための最良の選択だと思っています。

  4. また、名前を変更して自分で変換する必要があったので、このファイルの何かが変更されたため、正確に同じファイルでコードをテストしていない可能性があります。私はそれをテストすることができますので、Dropboxのファイル。

+0

私のためにこれを調べてくれてありがとう。残念ながら私は現時点でDropboxにアクセスできないので、プロジェクトをテストしたりファイルをアップロードしたりすることはできませんが、私は同じ問題が残っていることは間違いありません。私はプロジェクトを生成するためにCMakeを使用しているので、おそらくそこにオプションがありません。現時点で私のプロジェクトからHaarカスケードを省いて、後でこれを調べるために戻ってきます。 – Chris

2

このpostを参照してください。このタイプのエラーは、リリースモードでopencvのデバッグライブラリにリンクすることによって発生する可能性があります。

+0

私はそれを読んだことがありますが、xmlファイルの読み込みやコードの実行に問題はありません。これは単なる出力です。また、正しいOpenCV dllがロードされています - デバッグ用のデバッグ、リリース用のリリース。 – Chris

関連する問題