9

opencvパッケージを使用してコンポーネントを識別するためにjavaを使用してプロジェクトを開発していますが、javacvは初めてで、特定のソース画像で長方形を識別する方法を知りたいだけです。経験のある人がこのタスクをアーカイブするための基本的なガイドラインを教えてください。ここでテンプレート マッチングを使用しようとしましたが、正確なサイズの四角形しか識別できません。しかし、私の場合、可変長の長方形を識別する必要がありますか?

import java.util.Arrays;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class TestingTemplate {
public static void main(String[] args) {
//Original Image
IplImage src = cvLoadImage("src\\lena.jpg",0);
//Template Image
IplImage tmp = cvLoadImage("src\\those_eyes.jpg",0);
//The Correlation Image Result
IplImage result = cvCreateImage(cvSize(src.width()-tmp.width()+1, src.height()-tmp.height()+1), IPL_DEPTH_32F, 1);
//Init our new Image
cvZero(result);
cvMatchTemplate(src, tmp, result, CV_TM_CCORR_NORMED);

double[] min_val = new double[2];
double[] max_val = new double[2];

//Where are located our max and min correlation points
CvPoint minLoc = new CvPoint();
CvPoint maxLoc = new CvPoint();
cvMinMaxLoc(result, min_val, max_val, minLoc, maxLoc, null); //the las null it's for
 optional mask mat()

System.out.println(Arrays.toString(min_val)); //Min Score
System.out.println(Arrays.toString(max_val)); //Max Score

CvPoint point = new CvPoint();
point.x(maxLoc.x()+tmp.width());
point.y(maxLoc.y()+tmp.height());
cvRectangle(src, maxLoc, point, CvScalar.WHITE, 2, 8, 0); //Draw the rectangule result in original img.
cvShowImage("Lena Image", src);
cvWaitKey(0);
//Release
cvReleaseImage(src);
cvReleaseImage(tmp);
cvReleaseImage(result);
}
}

これを達成するために誰か助けてください

4

1 に答える 1

10

(つまり、正方形として固定されています。)

正方形を検出するために、OpenCVにはこのためのサンプルがいくつか付属しています。コードはC++、C、Pythonです。これをJavaCVに移植できることを願っています。

C ++コードPythonコード

それがどのように機能するかを説明します。

1-まず、画像をR、G、B平面に分割します。

2-次に、各平面に対してエッジ検出を実行し、それに加えて、50、100、...などのさまざまな値のしきい値を実行します。

3-そして、これらすべてのバイナリ画像で輪郭を見つけます(多くの画像を処理していることを忘れないでください。少し遅くなる可能性があります。必要がない場合は、いくつかのしきい値を削除できます)。

4-輪郭を見つけたら、面積に応じてフィルタリングすることにより、いくつかの小さな不要なノイズを削除します。

5-次に、輪郭を近似します。(輪郭近似の詳細)。

6-長方形の場合、4つの角が表示されます。その他の場合は、対応するコーナーが表示されます。

したがって、これらの輪郭を、角の数と同じ4である近似輪郭の要素の数に関してフィルタリングします。長方形の最初のプロパティ。

7-次に、四隅はあるが長方形はない形状があるかもしれません。したがって、長方形の2番目のプロパティを使用します。つまり、すべての内角は90度です。したがって、以下の関係を使用して、すべてのコーナーで角度を見つけます。

ここに画像の説明を入力してください

そして、cos(シータ)<0.1、つまりシータ> 84度の場合、それは長方形です。

8-では、正方形はどうですか?すべての辺が等しいというプロパティを使用します。

上記の関係により、2点間の距離を求めることができます。それらがすべて等しいかどうかを確認すると、その長方形は正方形になります。

これがコードの仕組みです。

以下は、上記のコードを画像に適用して得た出力です。

ここに画像の説明を入力してください

編集 :

境界で検出された長方形を削除する方法を尋ねられました。これは、opencvが黒い背景に白いオブジェクトを検出し、境界線も検出するためです。cv2.bitwise_not()関数を使用して画像を反転するだけで、問題が解決します。以下のような結果が得られます。

ここに画像の説明を入力してください

輪郭の詳細については、こちらをご覧ください:輪郭-1:はじめに

于 2012-06-19T15:15:49.050 に答える