Java 结合 OpenCV:精准截取两张图片黄色圈并计算图片偏移百分比
要使用 OpenCV(在 Java 中)截取两张图片中的黄色圆圈,并计算偏移百分比,您可以按照以下大致步骤进行操作: 1. 读取图片:使用 OpenCV 的 `imread` 方法读取两张图片。 2. 颜色空间转换:将图片从 BGR(默认的 OpenCV 颜色空间)转换到 HSV 颜色空间,以便更方便地检测黄色。 3. 黄色阈值设定:根据 HSV 中黄色的范围设定阈值,来提取黄色区域。 4. 形态学操作:可能需要进行一些形态学操作,如膨胀、腐蚀,来优化提取的黄色区域。 5. 轮廓检测:找到黄色区域的轮廓。 6. 确定圆形轮廓:通过一些算法判断哪个轮廓是圆形的(例如计算轮廓的周长和面积,根据圆形的特性来判断)。 7. 计算圆心坐标:对于检测到的圆形轮廓,计算其圆心坐标。 8. 计算偏移:比较两张图片中圆形的圆心坐标,计算偏移量。 9. 计算偏移百分比:根据图片的尺寸和偏移量计算偏移百分比。 以下是一个简单的示例代码框架,仅包含了一些关键步骤的示意,实际应用中还需要根据具体情况进行调整和完善: ```java import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class ImageComparison { static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String[] args) { // 读取图片 Mat image1 = Imgcodecs.imread("image1.jpg"); Mat image2 = Imgcodecs.imread("image2.jpg"); // 转换到 HSV 颜色空间 Mat hsvImage1 = new Mat(); Mat hsvImage2 = new Mat(); Imgproc.cvtColor(image1, hsvImage1, Imgproc.COLOR_BGR2HSV); Imgproc.cvtColor(image2, hsvImage2, Imgproc.COLOR_BGR2HSV); // 设定黄色阈值 Scalar lowerYellow = new Scalar(20, 100, 100); Scalar upperYellow = new Scalar(30, 255, 255); // 提取黄色区域 Mat yellowMask1 = new Mat(); Mat yellowMask2 = new Mat(); Core.inRange(hsvImage1, lowerYellow, upperYellow, yellowMask1); Core.inRange(hsvImage2, lowerYellow, upperYellow, yellowMask2); // 形态学操作 Mat dilatedMask1 = new Mat(); Mat dilatedMask2 = new Mat(); Imgproc.dilate(yellowMask1, dilatedMask1, new Mat()); Imgproc.dilate(yellowMask2, dilatedMask2, new Mat()); // 轮廓检测 Mat hierarchy1 = new Mat(); Mat hierarchy2 = new Mat(); List<MatOfPoint> contours1 = new ArrayList<>(); List<MatOfPoint> contours2 = new ArrayList<>(); Imgproc.findContours(dilatedMask1, contours1, hierarchy1, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); Imgproc.findContours(dilatedMask2, contours2, hierarchy2, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); // 确定圆形轮廓并计算圆心 Point center1 = findCenterOfCircle(contours1); Point center2 = findCenterOfCircle(contours2); // 计算偏移和偏移百分比 double offsetX = center2.x - center1.x; double offsetY = center2.y - center1.y; double percentageX = (offsetX / image1.width()) * 100; double percentageY = (offsetY / image1.height()) * 100; System.out.println("X 方向偏移百分比: " + percentageX + "%"); System.out.println("Y 方向偏移百分比: " + percentageY + "%"); } public static Point findCenterOfCircle(List<MatOfPoint> contours) { for (MatOfPoint contour : contours) { double area = Imgproc.contourArea(contour); double perimeter = Imgproc.arcLength(contour, true); double circularity = 4 * Math.PI * area / (perimeter * perimeter); if (circularity > 0.8) { // 大致判断为圆形 Moments moments = Imgproc.moments(contour); int x = (int) (moments.m10 / moments.m00); int y = (int) (moments.m01 / moments.m00); return new Point(x, y); } } return null; } } ``` 这只是一个简单的示例,实际的图像处理可能会更加复杂,需要根据图片的质量、黄色区域的特征和准确性要求进行更多的优化和调整。 ######[AI写代码神器 | 1248点数解答 | 2024-08-10 10:15:40]
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)429
- Python程序模拟公安车牌识别预警:精准锁定嫌疑人车辆( | 458点数解答 | 2024-05-05 18:31:11)330
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)330
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1218
- 数字化制图综合平台:助力企业转型,推动烟草物流图纸智能化设计 (字节豆包 | 490点数解答 | 2024-10-30 20:30:29)158
- 数字化制图综合平台:引领烟草物流及多领域设计革新 在企业数字化转型的时代浪潮中,数字化制图技术创新应用成为产业升级与提升竞争力的关键。企业对高效、精准、智能化设计解决方案需求迫切,构建集二维到三维正逆向工程快捷化、干涉检测可视化、设备明细数据提取自动化以及设备模块模型库于一体的综合平台意义重大。 此平台集成先进数字化制图工具与智能算法,可实现二维设计到三维建模的无缝转换,大大缩短设计周期。正逆向工程能快速切换,满足不同场景设计需求。内置干涉检测功能可实时监测设计潜在冲突,保障设计方案可行与安全。设备明细数据自动提取提高设计准确性与效率。设备模块模型库为设计师提供丰富资源,支持设计标准化与模块化,加速项目推进。 整体来看,该综合平台的应用极大促进了烟草物流行业及更广泛领域的技术创新与效率提升。在烟草物流方案图纸智能化设计中,它提升了图纸设计效率与质量,使设计工作更加高效、精准。对于企业而言,这一平台带来显著竞争优势,能帮助企业在数字化转型中脱颖而出,在激烈的市场竞争中占据有利地位,推动整个行业向更高效、更智能的方向发展。 (阿里通义 | 216点数解答 | 2024-10-30 20:30:51)188
- VBA 代码:双击特定单元格为数据区内容按条件标色及注意事项(字节豆包 | 942点数解答 | 2024-12-07 18:07:56)333
- 揭秘百分比常见缩写:“%”成各领域宠儿!(字节豆包 | 66点数解答 | 2025-07-30 13:26:19)93
- ECharts 饼图显示数字+百分比:代码示例与开发注意事项(字节豆包 | 533点数解答 | 2026-01-08 20:49:36)31
- OpenCV.js 轻松实现图片识别:详细步骤全解析 ( | 824点数解答 | 2024-03-22 16:22:16)204
- OpenCV.js 实战:轻松识别图片中电梯轮廓( | 1193点数解答 | 2024-03-22 16:23:32)219
- 用 C++ 和 OpenCV 生成带随机偏移的圆周上的点:代码剖析(字节豆包 | 29点数解答 | 2024-11-06 23:40:42)271