9

UGV(Unmanned Ground Vehichle)がキャプチャしたいくつかの画像を処理して、ライン上を移動させています。

地平線に基づいてその線の角度を取得したいと思います。いくつかの例で説明しようと思います。

90度の画像

上の画像では、角度が約90度であるため、UGVがまっすぐ進むようになります。しかし、地平線と比較した角度が約120度になるので、次のようにすると左に曲がります。

120度の画像

しきい値処理にotsuを使用して、これらの画像を以下の画像に正常に変換できました。

しきい値処理された画像

また、これを取得するためにエッジ検出アルゴリズムを使用しました。

ラプラシアンフィルター

しかし、私は今、それらのエッジ/ラインと出力を検出するアルゴリズム、またはそのようなラインの角度を出力するのに役立つアルゴリズムを見つけようとして立ち往生しています。

4

1 に答える 1

6

これがImageJを使った私の試みです:

    // Open the Image
ImagePlus image = new ImagePlus(filename);

    // Make the Image 8 bit
IJ.run(image, "8-bit", "");

    // Apply a Threshold (0 - 50)
ByteProcessor tempBP = (ByteProcessor)image.getProcessor();
tempBP.setThreshold(0, 50, 0);
IJ.run(image, "Convert to Mask", "");

    // Analyze the Particles
ParticleAnalyzer pa = new ParticleAnalyzer(
    ParticleAnalyzer.SHOW_MASKS +
    ParticleAnalyzer.IN_SITU_SHOW,
    1023 +
    ParticleAnalyzer.ELLIPSE
    , rt, 0.0, 999999999, 0, 0.5);

IJ.run(image, "Set Measurements...", "bounding fit redirect=None decimal=3");

pa.analyze(image);

int k = 0;
double maxSize = -1;
for (int i = 0; i < rt.getCounter(); i ++) {
    // Determine creteria for best oval.
    // The major axis should be much longer than the minor axis.
    // let k = best oval
}
double bx = rt.getValue("BX", k);
double by = rt.getValue("BY", k);
double width = rt.getValue("Width", k);
double height = rt.getValue("Height", k);

// Your angle:
double angle = rt.getValue("Angle", k);
double majorAxis = rt.getValue("Major", k);
double minorAxis = rt.getValue("Minor", k);

コードの仕組み:

  1. 画像をグレースケールにします。
  2. 暗い領域のみを取得するには、しきい値を適用します。これは、線が常に黒に近いことを前提としています。
  3. パーティクルアナライザを適用して、画像上の楕円を見つけます。
  4. 「粒子」をループして、基準に一致する粒子を見つけます。
  5. パーティクルから角度を取得します。

分析したときの画像の例を次に示します。

楕円形の画像 楕円形の画像2

:コードはテストされていません。VisualImageJで行ったことをJavaに変換しました。

于 2012-07-13T00:04:11.303 に答える