3

opencv_traincascade次のような 6000 以上のポジティブな画像を使用して、2 ユーロ硬貨を検出するように 1 日かけて PC をトレーニングしました。

ここに画像の説明を入力

ここで、単純な OpenCV プログラムを実行して結果を確認し、ファイルをチェックしようとしましたcascade.xml。最終結果は非常に残念です。

ここに画像の説明を入力

コインには多くの点がありますが、背景にも多くの点があります。トレーニングに使用するポジティブ イメージに問題があるのでしょうか? それとも、detectMultiScale()間違ったパラメータで を使用していますか?

これが私のコードです:

#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**) {

  Mat src = imread("2c.jpg", CV_LOAD_IMAGE_COLOR); 

  Mat src_gray;

  std::vector<cv::Rect> money;

  CascadeClassifier euro2_cascade;

  cvtColor(src, src_gray, CV_BGR2GRAY );
  //equalizeHist(src_gray, src_gray);

  if ( !euro2_cascade.load( "/Users/lory/Desktop/cascade.xml" ) ) {
     printf("--(!)Error loading\n");
     return -1;
  }

  euro2_cascade.detectMultiScale( src_gray, money, 1.1, 0, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, cv::Size(10, 10),cv::Size(2000, 2000) );

  for( size_t i = 0; i < money.size(); i++ ) {
     cv::Point center( money[i].x + money[i].width*0.5, money[i].y + money[i].height*0.5 );
     ellipse( src, center, cv::Size( money[i].width*0.5, money[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
  }

  //namedWindow( "Display window", WINDOW_AUTOSIZE );
  imwrite("result.jpg",src);
}

私も隣人の数を減らそうとしましたが、効果は同じで、ポイントがはるかに少ないだけです.正の画像では、コインの周りの背景としてこれらの4つのコーナーがあるという事実は問題になるでしょうか? opencv_createsamplesコインが写っているショット動画からGimpでpng画像を生成したので、なぜその四隅を入れるのかわかりません。

4

2 に答える 2

1

ユーロ硬貨の画像を検出するには、いくつかの方法を使用できます。

1) OpenCV カスケード (HAAR または LBP) をトレーニングします。大量の偽画像を使用することを忘れないでください。また、コインの画像を拡張します (ボーダーを追加します)。

2) 元の画像の abs 勾配を使用して画像を推定します。ハフ変換を使用して円を検出します (コインは円の形をしています)。

于 2016-01-29T13:55:41.087 に答える