Java Opencv识别图片上的虫子

news2025/1/12 23:32:11

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

一、POM.xml文件导入jar包

<dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.10</version> <!-- 根据最新版本更新 -->
        </dependency>
        <dependency>
            <groupId>org.opencv</groupId>
            <artifactId>opencv</artifactId>
            <version>4.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-core</artifactId>
            <version>1.0.0-M1.1</version>
        </dependency>
        <dependency>
            <groupId>org.nd4j</groupId>
            <artifactId>nd4j-native</artifactId>
            <version>1.0.0-M2</version>
        </dependency>
        <dependency>
            <groupId>org.nd4j</groupId>
            <artifactId>nd4j-api</artifactId>
            <version>1.0.0-M2</version>
        </dependency>

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

  1. 读取图片
  2. 截取区域
  3. 转换灰度
  4. 二值化
  5. 高斯
  6. 中指滤波
  7. 双边滤波
  8. 去除线框干扰
  9. 形态学操作
  10. 轮廓检测
package org.example;

import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.global.opencv_imgproc;
import org.bytedeco.opencv.opencv_core.*;

public class BugCounterTest {

    public static void main(String[] args) {
        // 读取图片文件
        Mat src = opencv_imgcodecs.imread("C:\\Users\\HP\\Desktop\\aaaa.png");
        if (src.empty()) {
            System.out.println("Error: Cannot read image!");
            return;
        }

        // 截取感兴趣区域
        Rect roi = new Rect(0, 180, 1300, 600);
        Mat croppedImage = new Mat(src, roi);

        // 转换为灰度图像
        Mat gray = new Mat();
        opencv_imgproc.cvtColor(croppedImage, gray, opencv_imgproc.COLOR_BGR2GRAY);

        // 二值化图像
        Mat binary = new Mat();
        opencv_imgproc.threshold(gray, binary, 100, 255, opencv_imgproc.THRESH_BINARY_INV);

        //高斯模糊处理
        Mat blurredImage = new Mat();
        opencv_imgproc.GaussianBlur(binary,blurredImage,new Size(5, 5),0);

        //中值滤波
        Mat medianFilteredImage = new Mat();
        opencv_imgproc.medianBlur(blurredImage, medianFilteredImage, 5);

        // 双边滤波
        Mat bilateralFilteredImage = new Mat();
        opencv_imgproc.bilateralFilter(medianFilteredImage, bilateralFilteredImage, 9, 75, 75);

        // 去除线框干扰
        Mat edgeImage = new Mat();
        opencv_imgproc.Canny(bilateralFilteredImage, edgeImage, 50, 150); // 可调整参数

        // 形态学操作
        Mat kernel = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(3, 3));
        opencv_imgproc.dilate(edgeImage, edgeImage, kernel);
        opencv_imgproc.erode(edgeImage, edgeImage, kernel);

        // 轮廓检测
        MatVector contours = new MatVector();
        Mat hierarchy = new Mat();
        opencv_imgproc.findContours(edgeImage, contours, hierarchy, opencv_imgproc.RETR_EXTERNAL, opencv_imgproc.CHAIN_APPROX_SIMPLE);


        int blackPointsCount = 0;
        // 在原始图像上绘制轮廓
        for (int i = 0; i < contours.size(); i++) {
            Rect rect = opencv_imgproc.boundingRect(contours.get(i));
            Scalar scalar = new Scalar(0, 255, 0, 0);
            opencv_imgproc.rectangle(croppedImage, rect, scalar);
            if (rect.width() > 1 && rect.height() > 1) {
                blackPointsCount++;
            }
        }

        // 保存标记后的图像
        opencv_imgcodecs.imwrite("C:\\Users\\HP\\Desktop\\output.jpg", croppedImage);
        System.out.println("黑点数量: " + blackPointsCount);
    }
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1810975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【渗透测试】|dvwa命令注入乱码问题

法一&#xff1a; 解决方法如下&#xff1a; 1、按住winr&#xff0c;在运行框中输入cmd弹出命令行&#xff0c;在命令行中输入“control intl.cpl” 2、这个命令是使用control命令行工具来打开"区域和语言设置"对话框 3、选中对话框中的管理选项卡 4、可以看到这里…

跨平台电商数据对比:淘宝与他者的较量

——比较分析淘宝和其他电商平台&#xff08;如京东、拼多多&#xff09;的数据&#xff0c;探索各自的优势和市场定位 在当今的电子商务领域&#xff0c;跨平台电商数据对比成为了企业制定策略和优化运营的重要工具。淘宝作为中国最大的电商平台之一&#xff0c;与京东、拼多…

HTML、HTML5一览

文章目录 HTML简介标签基本标签格式化文本链接图像块级元素列表表格框架表单实体 HTML5 此篇用于优化csdn第一篇文章 HTML 简介 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言&#xff0c;而是一种标记语言…

进口电动三通调节阀的应用-美国品牌

进口电动三通调节阀在多个工业领域中发挥着重要作用&#xff0c;通过精确的流体控制&#xff0c;提高生产效率、降低能源消耗、保证产品质量和安全。其应用主要体现在以下几个方面&#xff1a; 化工领域&#xff1a; 用于化工反应过程中的流体调控、物料输送、加热、冷却、混合…

记录22.04 安装 显卡驱动 以及一些问题

一. 前期准备 按照Ubuntu22.04 安装NVIDIA显卡驱动_ubuntu2204安装nvidia显卡驱动-CSDN博客来 1.更新软件列表和安装必要软件、依赖 sudo apt-get update #更新软件列表sudo apt-get install gsudo apt-get install gccsudo apt-get install make2.禁用nouveau (nouveau是…

弘君资本:光刻机、存储芯片概念拉升 同益股份、上海贝岭等涨停

光刻机概念11日盘中再度走强&#xff0c;到发稿&#xff0c;双乐股份、同益股份、东方嘉盛、盛剑环境等涨停&#xff0c;飞凯资料涨近10%&#xff0c;南大光电涨超7%。 存储芯片概念亦拉升&#xff0c;到发稿&#xff0c;雅创电子涨超12%&#xff0c;万润科技、上海贝岭、好上…

简易概况广告变现

广告变现是指媒体或平台通过向用户展示广告主的广告&#xff0c;从而获得收入的过程。 广告变现就像是一个店主&#xff0c;他需要一个吸引人的店面&#xff0c;提供优质的内容和服务&#xff0c;然后在店里摆放一些别人的商品或服务&#xff0c;每当有客人看了或买了这些商品或…

深圳比创达电子|EMI电磁干扰行业:挑战到突破,电子产业新未来

随着电子技术的飞速发展&#xff0c;电磁干扰&#xff08;EMI&#xff09;问题日益凸显&#xff0c;成为影响电子设备性能和稳定性的重要因素。EMI电磁干扰行业作为解决这一问题的关键领域&#xff0c;正面临着前所未有的机遇与挑战。 一、引言&#xff1a;EMI电磁干扰行业的崛…

免费!快速!干货!手把手教你如何在个人电脑上搭建你自己的大模型服务!

大模型发展如火如荼&#xff0c;虽然大模型的能力强大&#xff0c;但是大模型也是非常昂贵的&#xff01;不管是训练还是推理&#xff0c;都需要耗费大量的机器&#xff0c;而且机器的硬件资源&#xff0c;比如GPU、TPU等都有一定的要求。 因此&#xff0c;业界的同行们&#x…

远程工作岗位机会

电鸭&#xff1a;​​​​​​https://eleduck.com/?sortnew电鸭社区是具有8年历史的远程工作招聘社区&#xff0c;也是远程办公互联网工作者们的聚集地。在社区&#xff0c;我们进行有价值的话题讨论&#xff0c;也分享远程、外包、零活、兼职、驻场等非主流工作机会。「只工…

idea最新专业版安装+maven配置教程!

本教程适用于 J B 全系列产品&#xff0c;包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode 等。 &#xff08;直接复制&#xff0c;拿走不谢&#xff09; 9H1390TRAK-eyJsaWNlbnNlSWQiOiI5SDEzOTBUUkFLIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5rA5rS7I…

Invalid keystore format,获取安全码SHA1值出错

AndroidStudio版本&#xff1a;Android Studio Electric Eel | 2022.1.1 项目运行JDK版本&#xff1a;11.0.15&#xff0c;查看方法如下&#xff1a; 在Terminal 窗口中&#xff0c;获取的Java版本是&#xff1a;1.8.0&#xff0c;修改Java系统环境变量&#xff0c;改成&#…

任务3.8.1 利用RDD实现词频统计

实战&#xff1a;利用RDD实现词频统计 目标 使用Apache Spark的RDD&#xff08;弹性分布式数据集&#xff09;模块实现一个词频统计程序。 环境准备 选择实现方式 确定使用Spark RDD进行词频统计。 Spark版本与Scala版本匹配 选择Spark 3.1.3与Scala 2.12.15以匹配现有Spar…

前端JS必用工具【js-tool-big-box】学习,获取当前浏览器向上滚动还是向下滚动,获取当前距离顶部和底部的距离

这一小节&#xff0c;我们说一下 js-tool-big-box 添加的最新工具方法&#xff0c;在日常前端开发工作中&#xff0c;如果网页很长&#xff0c;我们就需要获取当前浏览器是在向上滚动&#xff0c;还是向下滚动。如果向上滚动&#xff0c;滚动到0的时候呢&#xff0c;需要做一些…

树二叉树

树 ​ 树是 n&#xff08;n≥0&#xff09;个结点的有限集。当 n 0时&#xff0c;称为空树。在任意一颗非空树中应满足&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根的结点。 &#xff08;2&#xff09;当 n > 1时&#xff0c;其余结点可分为 m&…

管理的三大关键:定目标、抓过程、拿结果

第一板斧&#xff1a;定目标 想清楚&#xff0c;写清楚&#xff0c;讲清楚&#xff0c;才能干明白 没有见过伟大&#xff0c;谈何伟大&#xff1f;很多管理者之所以定不好目标&#xff0c;是因为他们根本不知道也没见过好目标是什么样的&#xff0c;谈何定出好目标&#xff…

无源晶振振荡电路失效问题分析与解决策略

无源晶振&#xff08;晶体谐振器&#xff09;在电子设备中扮演着至关重要的角色&#xff0c;为数字电路提供稳定的时钟信号。然而&#xff0c;振荡电路一旦失效&#xff0c;可能会导致整个系统运行不正常。晶发电子将从三个主要方面分析无源晶振振荡电路失效的问题&#xff0c;…

测试开发面经分享,面试七天速成

1. get、post、put、delete的区别 a. get请求&#xff1a; i. 用于从服务器获取资源。请求参数附加在URL的查询字符串中。 ii. 对服务器的请求是幂等的&#xff0c;即多次相同的GET请求应该返回相同的结果。 iii. 可以被缓存&#xff0c;可以被收藏为书签。 iv. 对于敏感数据不…

【回调函数】

1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被用来调用其所指向的函数 时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方…