2012-08-24 6 views
9

現在、私は画像処理プロジェクトを開発中で、javacvを使って画像処理コンポーネントを開発しています。私は画像の興味深い部分を抽出することができましたが、今はそれらのオブジェクトのx座標とy座標を読み取る必要があります。 これは私がjavacvで抽出されたオブジェクトのx、y座標を取得する方法は?

enter image description here

をhaveextractedそして、私はそれらのオブジェクトを識別し、それらのオブジェクトの周囲に四角形を描画する必要があるイメージです。私はいくつかのチュートリアルを見て、次のコードを使ってオブジェクトを識別しようとしました。

IplImage img="sourceimage"; 
    CvSize sz = cvSize(img.width(), img.height()); 
    IplImage gry=cvCreateImage(sz, img.depth(), 1); 
    cvCvtColor(img, gry, CV_BGR2GRAY); 
    cvThreshold(gry, gry, 200, 250, CV_THRESH_BINARY); 


    CvMemStorage mem = CvMemStorage.create(); 
    CvSeq contours = new CvSeq(); 
    CvSeq ptr = new CvSeq(); 
    cvFindContours(gry, mem, contours, Loader.sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 

    CvRect boundbox; 

    for (ptr = contours; ptr != null; ptr = ptr.h_next()) { 
     boundbox = cvBoundingRect(ptr, 0); 
     if(boundbox.height()>10||boundbox.height()>10){ 
      cvRectangle(gry, cvPoint(boundbox.x(), boundbox.y()), cvPoint(boundbox.x() + boundbox.width(), boundbox.y() + boundbox.height()),CvScalar.BLUE, 0, 0, 0); 
      System.out.println(boundbox.x()+", "+boundbox.y()); 
     } 
    } 
    cvShowImage("contures", gry); 
    cvWaitKey(0); 

しかし、オブジェクトの周りに矩形として描画されません。これらのオブジェクトを識別するためにcvFindContoursメソッドを使用できるかどうかを知りたいですか? javacv/opencvを使って自分の目的をアーカイブする方法を説明できる人はいますか?

+0

あなたはこれらの矩形を描画するとき、どのように彼らはあなたが持っているオブジェクトに対して相対的? – MahdeTo

+0

あなたの質問に対する回答を無視するのはなぜですか? – ArtemStorozhuk

+0

@Mahde私はこれらのオブジェクトの周りに長方形を描く方法を知る必要があります。 –

答えて

11

次のコードを試してみると、あなたの質問に対する回答が得られます。

IplImage img=cvLoadImage("pathtosourceimage"); 
    CvSize cvSize = cvSize(img.width(), img.height()); 
    IplImage gry=cvCreateImage(cvSize, img.depth(), 1); 
    cvCvtColor(img, gry, CV_BGR2GRAY); 
    cvThreshold(gry, gry, 200, 255, CV_THRESH_BINARY); 
    cvAdaptiveThreshold(gry, gry, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 11, 5); 

    CvMemStorage storage = CvMemStorage.create(); 
    CvSeq contours = new CvContour(null); 

    int noOfContors = cvFindContours(gry, storage, contours, Loader.sizeof(CvContour.class), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, new CvPoint(0,0)); 

    CvSeq ptr = new CvSeq(); 

    int count =1; 
    CvPoint p1 = new CvPoint(0,0),p2 = new CvPoint(0,0); 

    for (ptr = contours; ptr != null; ptr = ptr.h_next()) { 

     CvScalar color = CvScalar.BLUE; 
     CvRect sq = cvBoundingRect(ptr, 0); 

      System.out.println("Contour No ="+count); 
      System.out.println("X ="+ sq.x()+" Y="+ sq.y()); 
      System.out.println("Height ="+sq.height()+" Width ="+sq.width()); 
      System.out.println(""); 

      p1.x(sq.x()); 
      p2.x(sq.x()+sq.width()); 
      p1.y(sq.y()); 
      p2.y(sq.y()+sq.height()); 
      cvRectangle(img, p1,p2, CV_RGB(255, 0, 0), 2, 8, 0); 
      cvDrawContours(img, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0)); 
      count++; 

    } 

    cvShowImage("contures",img); 
    cvWaitKey(0); 

これは、指定した画像に対して得られた出力です。

enter image description here

4

cvFindContoursは、問題の正しい解決策です。
これはあなたの画像で動作することを確認しました。
Here is my experiment

内部にSystem.out.printlnがありますが、出力は何ですか?

cvFindContoursは使いにくく、more general C++ functionにラップしています。またclass called vBlobを使用してオブジェクト cvFindContoursが検出します。私はあなたのJavaコードから見たものから、JavaバージョンAPIはC/C++バージョンに非常に似ています。だから、それを書き直すことは難しくありません。

ps。 Astorは正しい答えを出しました。

4

あなたはfindContours機能が背景に白い輪郭を見つけることを知っていますか?

画像にbitwise_not(またはJavaCVのアナログ)を入力してください。その後、findContoursが適用されます。これは実際にあなたの問題に修正されています。

4

サードパーティのライブラリは不要です!あなたが探していることはbounding boxとして知られている技術を使用してOpenCVの中で達成することができます:

enter image description here

トリックは、結果を改善するために、輪郭、その後cvApproxPoly()を取得するためにcvFindContours()を使用することです。 cvNot()を使用して入力画像の色を反転させる必要があることに注意してください。cvFindContours()の白いの輪郭を検索するためです。

  • this postに輪郭の紹介があります。
  • 車番号プレートを検出するためのバウンディングボックスのバージョンを実装するJava demoがあります。

ところでcvMinEnclosingCircle()は、CvPoint2D32fとして円の中心を返します。

+0

質問からコードを読んだのですか?彼はすでにバウンディングボックスを見つける方法を知っています。そして、 'approxPoly'はどのようにこの状況を改善しますか?問題は、topicstarterが、代わりに1つの四角形を得る理由を理解していないということです。 – ArtemStorozhuk

+1

@Astor、より良い理由でないなら、あなたはkarlphillipと、少なくとも礼儀正しく論争すべきではありません。ご存じのとおり、あなたはいつもあなたの長老を尊敬すべきです。そして彼はopencvタグでここの先輩です;)それはJon Skeetにコードがコンパイルされていないと言っているようです – Sam

2

私はC++ APIを使用していますが、javacvのdrawContoursまたはcvDrawContoursという名前の関数でfindContoursの出力を使用する関数もあるはずです。

+0

しかし、findContoursの出力は全体像です。 – ArtemStorozhuk

関連する問題