Java Opencv识别图片上的虫子

最近有个需求,希望识别图片上的虫子,对于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);
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

俄语演讲开场白,柯桥外贸俄语培训

1、&#xff08;Разрешите мне&#xff09;от имени... 请允许我代表... 例&#xff1a; Разрешите мне от имени нашей компании поприветствовать всех членов вашей делегации…

智慧金融新视野:银行数据中心可视化大屏的崛起

在数字化浪潮的推动下&#xff0c;银行业正迎来一场前所未有的变革。在这场变革中&#xff0c;银行数据中心可视化大屏以其独特的魅力&#xff0c;为银行的数据分析和决策提供强有力的支持。 随着金融科技的不断发展&#xff0c;银行对于数据处理和分析的需求日益增长。银行数据…

如何把java项目打包成jar包

以下就是图解过程 确定好以后 过一会就成这样了

Vuepress 2从0-1保姆级进阶教程——标准化流程(Tailwindcss+autoprefixer+commitizen)

Vuepress 2 专栏目录【已完结】 1. 入门阶段 Vuepress 2从0-1保姆级入门教程——环境配置篇Vuepress 2从0-1保姆级入门教程——安装流程篇Vuepress 2从0-1保姆级入门教程——文档配置篇Vuepress 2从0-1保姆级入门教程——主题与部署 2.进阶阶段 Vuepress 2从0-1保姆级进阶教程—…

06--jenkins构建CI_CD

前言&#xff1a;上一篇文章整理了git的部署和使用&#xff0c;这章主要复习持续集成软件Jenkins&#xff0c;这个技术现在在云计算方面也是有应用的&#xff0c;同时也是越高级越智能的软件代表。 1、概念简介 1&#xff09;jenkins是什么 Jenkins是一个开源的、可扩展的持…

美国空军发布类ChatGPT产品—NIPRGPT

6月11日&#xff0c;美国空军研究实验室&#xff08;AFRL&#xff09;官网消息&#xff0c;空军部已经发布了一款生成式AI产品NIPRGPT。 据悉&#xff0c;NIPRGPT是一款类ChatGPT产品&#xff0c;可生成文本、代码、摘要等内容&#xff0c;主要为为飞行员、文职人员和承包商提…

传神论文中心|第12期人工智能领域论文推荐

在人工智能领域的快速发展中&#xff0c;我们不断看到令人振奋的技术进步和创新。近期&#xff0c;开放传神&#xff08;OpenCSG&#xff09;社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自的论…

看国足!不破不立!层次越低的家庭,语言攻击性越强——早读(逆天打工人爬取热门微信文章解读)

你昨晚看国足了吗&#xff1f; 引言Python 代码第一篇 洞见 层次越低的家庭&#xff0c;语言攻击性越强第二篇结尾 引言 昨天看了国足比赛 输了韩国一个球 剩下大概率的出线希望 除非泰国赢新加坡 且3个球或者以上 泰国稍强于新加坡 但并不到打进3个球的地步 都觉得2个球已经是…

移民月贺礼!世贸通EB-5移民项目首批投资人获批了

特大喜讯 第八届移民月正在如火如荼地开展中 世贸通迎来了一个令人振奋的好消息 为移民月送来了一份大礼 增添了一抹格外耀眼的光彩 由世贸通担任大中华区独家代理的 「佛罗里达湖畔犹太社区」EB-5乡村项目 迎来首批投资人I-526E获批 世贸通恭喜获得I-526E批准的投资家庭…

【数据结构 |集合框架、泛型】初始集合框架、时间(空间)复杂度、简单认识泛型

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

GitHub加载慢怎么解决

选了一个最简单的方法记录一下 一、GitHub为什么加载这么慢 简而言之就是&#xff0c;国内DNS默认解析到美国服务器&#xff08;慢&#xff09;&#xff0c;我们只要绕过DNS解析&#xff0c;直接访问韩国日本服务器&#xff08;快&#xff09;就可以解决访问缓慢的问题。 二、…

13.shell awk基础

13.shell awk基础 awk作用awk语法结构awk脚本结构awk工作原理awk内部变量awk格式输出awk模式匹配RegExp示例运算符匹配示例布尔运算符匹配示例运算符匹配示例 awk条件判断if判断 awk循环语句while循环for循环 awk是一种强大的文本处理工具&#xff0c;主要用于对文本和数据进行…

启动mysql 3.5时出现 MySql 服务正在启动 . MySql 服务无法启动。

有可能是端口冲突 netstat -ano | findstr :3306运行这段代码出现类似&#xff1a; 可以看到端口 3306 已经被进程 ID 为 6284 的进程占用。为了启动新的 MySQL 服务&#xff0c;我们需要停止这个进程或更改新服务的端口&#xff1a; 1、终止进程 taskkill /PID 6284 /F2、确…

大语言模型QA

Q:关于 Yi-9B 通过 input/output cosine 来分析模型,可能文档里没有把前提说明白。该指标确实存在你们提到的不同模型大小不可比的问题。所以我们比较的是同一个模型在不同训练阶段,以及 layer 深度相同的dense models 之间的比较。除了发现yi-6B/34B 随着训练 tokens 的增加…

在矩池云使用GLM-4的详细指南(无感连GitHubHuggingFace)

GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本&#xff0c;在多项测试中表现出超越已有同等规模开源模型的性能&#xff0c;它能兼顾多轮对话、网页浏览、代码执行、多语言、长文本推理等多种功能&#xff0c;性能更加强大。其多模态语言模型GLM-4V-9B在…

Autohotkey使用记录

文章目录 1. 安装1.1 autohotkey1.2 vscode需要安装的插件 3. 函数使用3.1 按键3.2 MouseMove 4. Bug分析4.1 A_TimeSincePriorHotkey 1. 安装 1.1 autohotkey 下载安装即可 1.2 vscode需要安装的插件 3. 函数使用 3.1 按键 各个按键的代词使用关键字搜索&#xff1a;Hotk…

antd Pagination分页组件自定义跳转文案、按钮的方法【配置组件自带api即可支持】

组件默认效果&#xff1a; 期望效果&#xff1a; 代码&#xff1a; <PaginationclassNamelist-pagerpageSize{10}current{params?.pageNo}responsivetotal{listData?.totalItem}showSizeChanger{false}showQuickJumper{{ goButton: <Button classNamego-page>确定…

一、时钟控制

时钟 STM32F4有五种时钟源 HSI 内部高速时钟LSI 内部低速时钟HSE 外部高速时钟LSE 外部低速时钟PLL 锁相环倍频输出 其中 HSI、HSE、PLL可驱动系统时钟 (SYSCLK)&#xff0c;对于每个时钟源来说&#xff0c;在未使用时都可单独打开或者关闭&#xff0c;以降低功耗。 HSE高速…

计算机信息安全技术课后习题答案

计算机信息安全技术课后习题答案 计算机信息安全技术&#xff08;第2版&#xff09;付永刚 部分习题答案 第一章 计算机信息安全技术概述 选择题 关于访问控制服务的描述中&#xff0c;正确的是&#xff08; A &#xff09; A. 可控制用户访问网络资源 B.可识别发送方的真实身…

多用户竞拍商城系统 挂售转卖竞拍商城系统源码 竞拍系统 竞拍系统开发定制 转拍闪拍系统 后端PHP+前端UNIAPP源码+教程

挂售转卖竞拍商城系统源码/竞拍系统/转拍闪拍系统/后端PHP前端UNIAPP源码 玩法简介 ①、后台可添加商品进行挂单 ②、后台设置场次以及场次开始时间 ③、用户抢单 ④、抢单以后可选择提货或者转售 ⑤、玩家寄售需按照后台设置百分比进行加价 ⑥、玩家寄售需支付手续费(余额支付…