• Java Opencv识别图片上的虫子


    最近有个需求,希望识别图片上的虫子,对于java来说,图像识别不是很好做。在网上也搜索了很多,很多的代码都是不完整,或者下载下载报错,有的写的很长看不懂。所以自己试着用java的opencv写了一段代码。发现识别的效果还不错,下面把代码贴出来。有需要的可以参考。但是这里面有一些缺陷,就是没有加入transformer和org.deeplearning4j,对于复杂的场景识别的不是很准确。后期再更新把神经网络加上去。

    一、POM.xml文件导入jar包

    1. <dependency>
    2. <groupId>org.bytedecogroupId>
    3. <artifactId>javacv-platformartifactId>
    4. <version>1.5.10version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.opencvgroupId>
    8. <artifactId>opencvartifactId>
    9. <version>4.9.0version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.deeplearning4jgroupId>
    13. <artifactId>deeplearning4j-coreartifactId>
    14. <version>1.0.0-M1.1version>
    15. dependency>
    16. <dependency>
    17. <groupId>org.nd4jgroupId>
    18. <artifactId>nd4j-nativeartifactId>
    19. <version>1.0.0-M2version>
    20. dependency>
    21. <dependency>
    22. <groupId>org.nd4jgroupId>
    23. <artifactId>nd4j-apiartifactId>
    24. <version>1.0.0-M2version>
    25. dependency>

    二、主要的处理步骤和逻辑代码

    1. 读取图片
    2. 截取区域
    3. 转换灰度
    4. 二值化
    5. 高斯
    6. 中指滤波
    7. 双边滤波
    8. 去除线框干扰
    9. 形态学操作
    10. 轮廓检测
    1. package org.example;
    2. import org.bytedeco.opencv.global.opencv_imgcodecs;
    3. import org.bytedeco.opencv.global.opencv_imgproc;
    4. import org.bytedeco.opencv.opencv_core.*;
    5. public class BugCounterTest {
    6. public static void main(String[] args) {
    7. // 读取图片文件
    8. Mat src = opencv_imgcodecs.imread("C:\\Users\\HP\\Desktop\\aaaa.png");
    9. if (src.empty()) {
    10. System.out.println("Error: Cannot read image!");
    11. return;
    12. }
    13. // 截取感兴趣区域
    14. Rect roi = new Rect(0, 180, 1300, 600);
    15. Mat croppedImage = new Mat(src, roi);
    16. // 转换为灰度图像
    17. Mat gray = new Mat();
    18. opencv_imgproc.cvtColor(croppedImage, gray, opencv_imgproc.COLOR_BGR2GRAY);
    19. // 二值化图像
    20. Mat binary = new Mat();
    21. opencv_imgproc.threshold(gray, binary, 100, 255, opencv_imgproc.THRESH_BINARY_INV);
    22. //高斯模糊处理
    23. Mat blurredImage = new Mat();
    24. opencv_imgproc.GaussianBlur(binary,blurredImage,new Size(5, 5),0);
    25. //中值滤波
    26. Mat medianFilteredImage = new Mat();
    27. opencv_imgproc.medianBlur(blurredImage, medianFilteredImage, 5);
    28. // 双边滤波
    29. Mat bilateralFilteredImage = new Mat();
    30. opencv_imgproc.bilateralFilter(medianFilteredImage, bilateralFilteredImage, 9, 75, 75);
    31. // 去除线框干扰
    32. Mat edgeImage = new Mat();
    33. opencv_imgproc.Canny(bilateralFilteredImage, edgeImage, 50, 150); // 可调整参数
    34. // 形态学操作
    35. Mat kernel = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(3, 3));
    36. opencv_imgproc.dilate(edgeImage, edgeImage, kernel);
    37. opencv_imgproc.erode(edgeImage, edgeImage, kernel);
    38. // 轮廓检测
    39. MatVector contours = new MatVector();
    40. Mat hierarchy = new Mat();
    41. opencv_imgproc.findContours(edgeImage, contours, hierarchy, opencv_imgproc.RETR_EXTERNAL, opencv_imgproc.CHAIN_APPROX_SIMPLE);
    42. int blackPointsCount = 0;
    43. // 在原始图像上绘制轮廓
    44. for (int i = 0; i < contours.size(); i++) {
    45. Rect rect = opencv_imgproc.boundingRect(contours.get(i));
    46. Scalar scalar = new Scalar(0, 255, 0, 0);
    47. opencv_imgproc.rectangle(croppedImage, rect, scalar);
    48. if (rect.width() > 1 && rect.height() > 1) {
    49. blackPointsCount++;
    50. }
    51. }
    52. // 保存标记后的图像
    53. opencv_imgcodecs.imwrite("C:\\Users\\HP\\Desktop\\output.jpg", croppedImage);
    54. System.out.println("黑点数量: " + blackPointsCount);
    55. }
    56. }

    对于复杂的图片识别有差距

  • 相关阅读:
    【luogu U142356】勇者的后缀(SA)(主席树)(二分)
    treeview形式的checkbox(wpf、c#)
    echarts的使用
    【python】算法与数据结构例题分析
    N-FX2-4 移动链表节点
    Redis中常见数据结构和数据类型
    乱写的项目
    【洛谷 B2003】输出第二个整数 题解(顺序结构+输入输出)
    云计算的两地三中心和灾备介绍
    word页脚的页码全都一样
  • 原文地址:https://blog.csdn.net/jwandbj/article/details/139594266