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

9
我正在处理由UGV(无人地面车辆)捕获的一些图像,以使其沿着一条直线移动。我想根据地平线获取该直线的角度。以下是一些示例:上面的图像会让我的UGV保持直行,因为角度约为90度。但是下面的图像会让它向左转,因为与地平线相比的角度约为120度。我已经成功地使用otsu进行阈值处理将这些图像转换为下面的图像,并使用了边缘检测算法得到了另一张图像。但是我现在卡在了试图找到一个检测这些边缘/线并输出或帮助我输出此类线的角度的算法上。

1
请查看Hough变换 - Maurits
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. 从我们的“颗粒”中获取角度。
下面是当我分析它时图像的示例: Oval Image Oval Image 2 注意:代码未经过测试。我只是将我的Visual ImageJ操作转换为Java代码。

太棒了!!!非常感谢!我有几个问题:1)你是如何从ImageJ生成这样的代码的?2)我将在Android上运行它,你对此有什么评论吗? - Felipe Barreiros
我有相当丰富的经验,可以将我所做的视觉内容翻译成Java代码,我也经常使用宏->记录选项。对于Android开发,您只需要确保您可以使用ImageJ库,并确保ImageJ不会尝试呈现可视化窗口即可。 - Ivan
@Ivan,你能帮忙解决这个问题吗?它与这个问题非常相似:http://stackoverflow.com/questions/25360544/line-detection-in-java - Jjang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接