我正在处理我的 UGV(无人地面车辆)捕获的一些图像,以使其在一条线上移动。
我想根据地平线获得那条线的角度。我将尝试用几个例子来解释:
上图会使我的 UGV 保持直线前进,因为角度约为 90 度。但接下来会使其向左转,因为与地平线比较的角度约为 120。
我可以使用 otsu 进行阈值化成功地将这些图像转换为下图:
并且还使用了边缘检测算法来得到这个:
但是我现在被困在试图找到一种算法来检测那些边缘/线和输出 - 或者帮助我输出 - 这种线的角度..
我正在处理我的 UGV(无人地面车辆)捕获的一些图像,以使其在一条线上移动。
我想根据地平线获得那条线的角度。我将尝试用几个例子来解释:
上图会使我的 UGV 保持直线前进,因为角度约为 90 度。但接下来会使其向左转,因为与地平线比较的角度约为 120。
我可以使用 otsu 进行阈值化成功地将这些图像转换为下图:
并且还使用了边缘检测算法来得到这个:
但是我现在被困在试图找到一种算法来检测那些边缘/线和输出 - 或者帮助我输出 - 这种线的角度..
这是我使用 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);
代码如何工作:
这是我分析图像时图像的示例:
注意:代码未经测试。我刚刚将我在 Visual ImageJ 中所做的转换为 Java。