Java (JDK 21) 调用 OpenCV (4.8.0)

Java 调用 OpenCV

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

一.OpenCV 下载和安装

Open CV 官网

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

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

安装即解压缩

根据系统位数选择

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

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

二.创建 Java Maven 项目

工程截图

xml 复制代码
<?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>

测试代码

java 复制代码
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);
    }
}

显示效果

三.其他测试

java 复制代码
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

边缘检测

反色

相关推荐
是梦终空20 分钟前
JAVA毕业设计210—基于Java+Springboot+vue3的中国历史文化街区管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·历史文化街区管理·景区管理
基哥的奋斗历程44 分钟前
学到一些小知识关于Maven 与 logback 与 jpa 日志
java·数据库·maven
m0_512744641 小时前
springboot使用logback自定义日志
java·spring boot·logback
十二同学啊1 小时前
JSqlParser:Java SQL 解析利器
java·开发语言·sql
老马啸西风1 小时前
Plotly 函数图像绘制
java
方圆想当图灵1 小时前
缓存之美:万文详解 Caffeine 实现原理(上)
java·缓存
gyeolhada1 小时前
计算机组成原理(计算机系统3)--实验八:处理器结构拓展实验
java·前端·数据库·嵌入式硬件
Java&Develop1 小时前
jeecg后端登录接口
java
蒙双眼看世界1 小时前
IDEA运行Java项目总会报程序包xxx不存在
java·spring·maven
graceyun3 小时前
C语言进阶习题【1】指针和数组(4)——指针笔试题3
android·java·c语言