线检测|使用Java进行角度检测

时间:2012-07-12 22:56:15

标签: java image image-processing artificial-intelligence

我正在处理一些我的UGV(Unmanned Ground Vehichle)捕获的图像,以使其在一条线上移动。

我想根据地平线得到该线的角度。我将尝试用几个例子来解释:

90 degrees image

上面的图像会使我的UGV保持笔直向前,角度约为90度。 但是下面会让它向左转,因为角度与地平线相比约为120。

120 degrees image

我可以使用otsu成功地将这些图像转换为下面的图像进行阈值处理:

thresholded image

并且还使用边缘检测算法来实现:

laplacian filter

但我现在卡住了,试图找到一个能够检测那些边缘/线和输出的算法 - 或者帮我输出 - 这样的线的角度..

1 个答案:

答案 0 :(得分: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. 从我们的粒子中获取角度。
  6. 以下是分析图像时图像的示例:

    Oval Image Oval Image 2

    注意:代码未经测试。我刚刚将Visual ImageJ中的内容转换为Java。