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

线检测|用Java进行角度检测,java,image,image-processing,artificial-intelligence,Java,Image,Image Processing,Artificial Intelligence,我正在处理我的UGV(无人地面车辆)捕捉到的一些图像,使其沿直线移动 我想得到基于地平线的那条线的角度。我将尝试用几个例子来解释: 上面的图像将使我的UGV保持直线前进,因为角度约为90度。 但是,当与地平线的夹角大约为120时,下面的曲线会使它向左转弯 我可以使用大津阈值成功地将这些图像转换为下图: 并且还使用了边缘检测算法来获得: 但我现在正试图找到一种算法来检测这些边/线和输出,或者帮助我输出这些线的角度。以下是我使用ImageJ的尝试: // Open the Image

我正在处理我的UGV(无人地面车辆)捕捉到的一些图像,使其沿直线移动

我想得到基于地平线的那条线的角度。我将尝试用几个例子来解释:

上面的图像将使我的UGV保持直线前进,因为角度约为90度。 但是,当与地平线的夹角大约为120时,下面的曲线会使它向左转弯

我可以使用大津阈值成功地将这些图像转换为下图:

并且还使用了边缘检测算法来获得:


但我现在正试图找到一种算法来检测这些边/线和输出,或者帮助我输出这些线的角度。

以下是我使用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);
//打开图像
ImagePlus图像=新的ImagePlus(文件名);
//将图像设为8位
IJ.run(图中为“8位”);
//应用阈值(0-50)
ByteProcessor tempBP=(ByteProcessor)image.getProcessor();
tempBP.setThreshold(0,50,0);
IJ.run(图为“转换为掩码”);
//分析粒子
微粒分析仪pa=新微粒分析仪(
ParticleAnalyzer.SHOW_掩码+
粒子分析仪现场演示,
1023 +
椭圆粒子分析器
,rt,0.09999999,0,0.5);
IJ.run(图像,“设置测量…”,“边界拟合重定向=无小数=3”);
分析(图像);
int k=0;
double maxSize=-1;
对于(int i=0;i
代码的工作原理:

  • 使图像灰度化
  • 对其应用阈值以仅获取黑暗区域。这假定线条始终接近黑色
  • 应用粒子分析器在图像上查找椭圆
  • 在“粒子”中循环寻找符合我们标准的粒子
  • 从我们的粒子得到角度
  • 下面是我分析图像时图像的一个示例:


    注意:代码未经测试。我刚刚将我在VisualImageJ中所做的转换为Java。

    看看.awesoommeee!!!谢谢!!!我有几个问题:1)你是如何从imageJ生成这样的代码的?2) 我将在Android上运行它,你对此有何评论?我有很多经验将我所做的可视化转换为Java,我也经常使用宏->记录选项。对于Android,您只需要确保您可以使用ImageJ库,并且确保ImageJ不会试图显示一个可视窗口。@Ivan您能帮助解决这个非常类似的问题吗?