线检测| 使用Java进行角度检测
我正在处理一些我的UGV(Unmanned Ground Vehichle)捕获的图像,以使其在一条线上移动。
我想根据地平线得到该线的角度。 我将尝试用几个例子来解释:
上面的图像会使我的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。
- 无论如何在JFrame中添加图片内的文字?
- Spring MVC 3 localeChangeInterceptor
- 获取HashMap值的计数
- iText / BouncyCastle ClassNotFound org.bouncycastle.asn1.DEREncodable and org.bouncycastle.tsp.TimeStampTokenInfo
- Freemarker / Velocity – 日期操作
- 编码密码看起来不像BCrypt
- WEB-INF / myproject-servlet.xml与WEB-INF / web.xml
- IllegalAccessError和IllegalAccessException之间的区别
- 在Java Map中查找重复值?