Java (JDK 21) 调用 OpenCV (4.8.0)

Java 调用 OpenCV

  • 一.OpenCV 下载和安装
  • 二.创建 Java Maven 项目
  • 三.其他测试

一.OpenCV 下载和安装

Open CV 官网

可以下载编译好的包,也可以下载源码自行编译

在这里插入图片描述

双击安装 opencv-4.8.0-windows.exe 默认为当前目录

在这里插入图片描述

安装即解压缩

在这里插入图片描述

根据系统位数选择

在这里插入图片描述

将 x64 目录下 opencv_java480.dll 放到 JDK 目录

在这里插入图片描述

将 opencv-480.jar 引入项目依赖

二.创建 Java Maven 项目

工程截图

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>opencv</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>20</maven.compiler.source>
        <maven.compiler.target>20</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.opencv</groupId>
            <artifactId>opencv</artifactId>
            <version>4.8.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/opencv-480.jar</systemPath>
        </dependency>
    </dependencies>

</project>

测试代码

package org.example;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * @author Administrator
 */
public class Main {

    /**
     * load opencv_java480
     */
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {

        String img = "C:\\Users\\Administrator\\Desktop\\IMG_20140207_165557.jpg";
        //read image
        Mat src = Imgcodecs.imread(img);
        //define a dst mat
        Mat dst = new Mat();
        // resize
        Imgproc.resize(src,dst,new Size(1600,900));
        //show
        HighGui.imshow("dst",dst);
        HighGui.resizeWindow("dst",1600,900);
        // show delay some ms auto close
        HighGui.waitKey(1000);
        // exit
        System.exit(0);
    }
}

显示效果

在这里插入图片描述

三.其他测试

package org.example;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * @author Administrator
 */
public class Main {

    /**
     * load opencv_java480
     */
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }


    /**
     * 低通滤波器 均值滤波 使图像模糊、消除噪点
     */
    static float[] vague_shaper = new float[]{
            1/9,1/9,1/9,
            1/9,1/9,1/9,
            1/9,1/9,1/9
    };

    /**
     * 低通滤波器 高斯滤波 使图像模糊
     */
    static float[] gauss_shaper = new float[]{
            1/16,2/16,1/16,
            2/16,4/16,2/16,
            1/16,2/16,1/16
    };

    /**
     * 高通滤波器 锐化卷积核
     */
    static float[] sharpening = new float[]{
            -1,-1,-1,
            -1,8,-1,
            -1,-1,-1
    };

    /**
     * 一阶微算子 pre_witt 处理噪声多、灰度突变的图像
     */
    static float[] pre_witt = new float[]{
            -1,-1,-1,
            0,0,0,
            1,1,1
    };

    /**
     * 一阶微算子 sobel pre_witt 的改进版
     */
    static float[] sobel_vertical = new float[]{
            -1,0,1,
            -2,0,2,
            -1,0,1
    };

    /**
     * 一阶微算子 sobel pre_witt 的改进版
     */
    static float[] sobel_horizontal = new float[]{
            1,2,1,
            0,0,0,
            -1,-2,-1
    };

    public static void main(String[] args) {



        String imgF = "C:\\Users\\Administrator\\Desktop\\IMG_20220204_132906.jpg";

        Mat img = Imgcodecs.imread(imgF);
        Mat src = new Mat();
        Mat dst = new Mat();
        //重置大小
        Imgproc.resize(img,src,new Size(1600,900));
        int rows = src.rows();
        int cols = src.cols();
        int channels = src.channels();
        //展示
        HighGui.resizeWindow("dst",1600,900);
        HighGui.imshow("dst",src);
        HighGui.waitKey(0);
        //灰度化
        Imgproc.cvtColor(src,dst,Imgproc.COLOR_RGB2GRAY);
        HighGui.imshow("dst",dst);
        HighGui.waitKey(0);
        //定义卷积核
        Mat operator = new Mat(3,3, CvType.CV_32FC1);
        //模糊
        operator.put(0,0,vague_shaper);
        Imgproc.filter2D(src,dst,-1,operator);
        HighGui.imshow("vague_shaper",dst);
        HighGui.waitKey(0);
        //模糊
        operator.put(0,0,gauss_shaper);
        Imgproc.filter2D(src,dst,-1,operator);
        HighGui.imshow("gauss_shaper",dst);
        HighGui.waitKey(0);
        //高通
        operator.put(0,0,sharpening);
        Imgproc.filter2D(src,dst,-1,operator);
        HighGui.imshow("sharpening",dst);
        HighGui.waitKey(0);
        //pre_witt
        operator.put(0,0,pre_witt);
        Imgproc.filter2D(src,dst,-1,operator);
        HighGui.imshow("pre_witt",dst);
        HighGui.waitKey(0);
        //sobel_vertical
        operator.put(0,0,sobel_vertical);
        Imgproc.filter2D(src,dst,-1,operator);
        HighGui.imshow("sobel_vertical",dst);
        HighGui.waitKey(0);
        //sobel_horizontal
        operator.put(0,0,sobel_horizontal);
        Imgproc.filter2D(src,dst,-1,operator);
        HighGui.imshow("sobel_horizontal",dst);
        HighGui.waitKey(0);
        //二值化
        Mat gray = new Mat();
        Imgproc.cvtColor(src,gray,Imgproc.COLOR_RGB2GRAY);
        Imgproc.threshold(gray,dst,100,255,Imgproc.THRESH_BINARY);
        HighGui.imshow("binary",dst);
        HighGui.waitKey(0);
        //边缘检测
        Imgproc.Canny(src,dst,128,255);
        HighGui.imshow("edge",dst);
        HighGui.waitKey(0);
        //反色
        dst = src.clone();
        byte[] data = new byte[rows * cols * channels];
        dst.get(0,0,data);
        int index,r,g,b;
        for (int rs = 0 ; rs < rows ; rs++){
            //通道值横向排列
            for (int c = 0 ; c < cols * channels ; c = c + channels){
                //取位置
                index = rs * cols * channels + c;
                //取RGB并翻转
                b = 255 - data[index] & 0xff;
                g = 255 - data[index + 1] & 0xff;
                r = 255 - data[index + 2] & 0xff;
                //回写
                data[index] = (byte) b;
                data[index + 1] = (byte) g;
                data[index + 2] = (byte) r;
            }
        }
        dst.put(0,0,data);
        HighGui.imshow("overturn",dst);
        HighGui.waitKey(0);

        System.exit(0);
    }
    
}

原图

在这里插入图片描述

灰度图

在这里插入图片描述

锐化图

在这里插入图片描述

Prewitt 算子

在这里插入图片描述

sobel_vertical

在这里插入图片描述

sobel_horizontal

在这里插入图片描述

binary

在这里插入图片描述

边缘检测

在这里插入图片描述

反色

在这里插入图片描述

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

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

相关文章

数据结构 | 查漏补缺之求叶子结点,分离链接法、最小生成树、DFS、BFS

求叶子结点的个数 参考博文&#xff1a; 树中的叶子结点的个数 计算方法_求树的叶子节点个数-CSDN博客 分离链接法 参考博文 数据结构和算法——哈希查找冲突处理方法&#xff08;开放地址法-线性探测、平方探测、双散列探测、再散列&#xff0c;分离链接法&#xff09;_线性…

Linux存储软件栈到底有多复杂,存储软件栈全景概览

从今天开始&#xff0c;我们将介绍一下Linux的存储软件栈&#xff0c;也称为IO栈。今天我们先从整体上了解一下Linux的整个IO栈&#xff0c;后续再深入介绍每个组件。我们很难说清楚Linux的存储软件栈到底有多复杂&#xff0c;但thomas-krenn的一张图可能可以给大家一个比较直观…

堆的相关时间复杂度计算(C语言)

目录 前言 建堆的时间复杂度 向上调整建堆的时间复杂度 向下调整建堆的时间复杂度 维护堆的时间复杂度 top K问题的时间复杂度 前言 在前面的三篇文章中我们成功的实现了堆排序的升降序以及基于堆的top K问题&#xff0c;现在我们来解决它们的时间复杂度问题 建堆的时间…

查看Linux的Ubuntu的版本

我的Ubuntu版本是 Jammy x86_64&#xff0c;即 Ubuntu 22.04.3 LTS&#xff0c;代号为"Jammy Jellyfish"&#xff0c;架构是 x86_64&#xff08;64位&#xff09;。

UEC++ 探索虚幻5笔记 day11

虚幻5.2.1探索 项目目录探索 C工程一定不能是中文路径&#xff0c;中文项目名&#xff0c;最好全部不要用中文&#xff0c;蓝图项目可以是中文浅浅创建一个空项目&#xff0c;讲解一下之前UE4没有讲解的项目目录文件的分布组成 .vs&#xff1a;文件夹一般是项目编译缓存文件夹…

linux安装mysql5.7(一遍过)

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

游戏盾的防御原理以及为什么程序类型更适合接入游戏盾。

游戏盾是一种专门用于游戏服务器的安全防护服务&#xff0c;旨在抵御各种网络攻击。它的原理主要包括以下几个方面&#xff1a; 流量清洗和过滤&#xff1a;游戏盾会对进入游戏服务器的流量进行实时监测、分析和过滤。它通过识别恶意流量和攻击流量&#xff0c;过滤掉其中的攻击…

多种混沌映射初始化种群MATLAB代码(开源代码)

五种混沌映射改进鲸鱼算法&#xff08;自行切换&#xff09;&#xff1a; clc clear close allSearchAgents_no30; % Number of search agents %种群数量Function_nameF1; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper) %使用方程的名…

【java设计模式】——代理设计模式,两种举例说明

代理设计模式 1.介绍 Spring 框架中AOP底层使用动态代理设计模式。通过学习动态代理设计模式可以很好的理解Spring框架AOP底层 代理模式&#xff08;Proxy&#xff09;是GoF23种设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象&#xff0c;而是通过调用代理&am…

浅谈https

1.网络传输的安全性 http 协议&#xff1a;不安全&#xff0c;未加密https 协议&#xff1a;安全&#xff0c;对请求报文和响应报文做加密 2.对称加密与非对称加密 2.1 对称加密 特点&#xff1a; 加解密使用 相同 秘钥 高效&#xff0c;适用于大量数据的加密场景 算法公开&a…

深入了解Java Duration类,对时间的精细操作

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概6000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

Linux安装mysq 8.0服务端和客户端(亲测保成功)

1. 查看当前是否有已经安装好的mysql,先卸载 # 命令 rpm -qa|grep -i mysql# 结果显示 mysql-community-libs-5.7.42-1.el7.x86_64 mysql-community-common-5.7.42-1.el7.x86_64 mysql-community-libs-compat-5.7.42-1.el7.x86_64 mysql57-community-release-el7-10.noarch my…

perl脚本获取Windows系统常用路径信息

windows系统常用的路径,比如临时目录、资源文件夹、字体保存目录、应用程序数据存放目录等等。在日常操作的时候寻找略有不便。这里用perl写一个脚本&#xff0c;并把这些目录信息格式化为json&#xff0c;方便查找。如下是perl代码&#xff1a; #! /usr/bin/perl use v5.14; …

中国科技巨头:集体变革中 /华为鸿蒙 4:功能、模型、生态三大升级 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 中国科技巨头&#xff1a;集体变革中 华为鸿蒙 4&#xff1a;功能、模型、生…

2002-2021年全国各地级市环境规制18个相关指标数据

2002-2021年全国各地级市环境规制18个相关指标数据 1、时间&#xff1a;2002-2021年 2、来源&#xff1a;城市年鉴 3、指标&#xff1a;行政区划代码、地区、年份、工业二氧化硫排放量(吨)、工业烟粉尘排放量(吨)、工业废水排放量(万吨)、工业废水排放达标量(万吨)、工业二氧…

华为OD机试 - 攀登者1(Java JS Python C)

题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5…

SpringSecurity6 | 修改默认用户

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏: MySQL学习 🥭本文内容:SpringSecurity6 | 修改默认用户 📚个人知识库 :知识库,欢迎大家访问 学习参考…

一款带键扫的LED驱动电路

一、基本概述 TM1628A是一种带键盘扫描接口的LED&#xff08;发光二极管显示器&#xff09;驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电…

ProEasy机器人案例:电池边包胶

如下图所示&#xff0c;对一个电池三边包边&#xff0c;因客户现场有很多规格电池的大小&#xff0c;所以就需要建立动态的工具坐标来实现适配所有种类的电池 程序如下&#xff1a;Ddome程序 function Speed(num) --速度设置 MaxSpdL(2000) --movl最大速度…

机器学习 sklearn 中的超参数搜索方法

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…