一.背景
公司是非煤采矿业,核心业务是采选,大型设备多,安全风险因素多。当下政府重视安全,头部技术企业的安全解决方案先进但价格不低,作为民营企业对安全投入的成本很敏感。利用我本身所学,准备搭建公司的安全管理技术平台,从视觉、传感等多方面配合,逐步将公司的生产安全管理技术平台搭建起来。整体框架心中早有数,只是还没有时间来写。本文是安全帽的第一篇,先考虑把opencv在eclipse中java语言的开发环境搭建起来。
本次文章,涉及的知识很多,主要包含:怎么找到OpenCV的安装文件?OpenCV是什么?java使用OpenCV的关键是什么?java使用dll的机制是什么?JDK本身与其内部dll的关系是什么?java加载dll的两个方法?eclipse中项目加载外部jar包的两种方法?用java代码确认你具备了OpenCV开发的基础环境?
二.opencv的下载与安装
1.opencv的下载
打开opencv的官网,https://opencv.org/
找到opencv的下载连接:https://github.com/opencv/opencv/releases/download/4.10.0/opencv-4.10.0-windows.exe
不同的版本,链接可能不同,建议跟着下面的图片过程自己去找最新的下载链接。由于各种原因,浏览器下载github的东西会很慢,我用的迅雷下载的,速度还可以。大小约174M。
你也可以不用去找,直接从我这篇文章关联的资源下载也可以。opencv_java4100.dll
opencv_java4100.jar。OpenCV核心我们要用到的也就这2个文件,后面你仔细读就会知道了。
2.OpenCV的安装与配置
安装过程很简单就是解压,选择路径就好。关于路径,还是老要求,不要空格、特殊符号、中文,这个路径问题在10多年前有一次让我终生不忘。我的安装路径是:D:\zsp\tools\opencv
三.eclipse中怎么采用让java用上OpenCV?
1.先了解OpenCV是什么?
先看看AI的回答,官网前面给了的哈!
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| OpenCV(Open Source Computer Vision Library)是一个基于开源许可协议的跨平台计算机视觉库。以下是对OpenCV的详细介绍: #### 一、开发背景与现状 * OpenCV最初由Intel公司开发,现在由非营利组织OpenCV.org进行维护。 * 它支持多种编程语言,如C++、Python、Java等,并可在多个平台上使用,包括Windows、Linux、macOS等。 #### 二、功能特点 * 图像处理 :OpenCV提供了丰富的图像处理函数,包括图像的读取、写入、显示、缩放、旋转、平移、剪裁、颜色空间转换、边缘检测、直方图均衡化、模板匹配、形态学操作等。 * 视频处理 :支持视频的读取、写入、播放、剪辑、稳定、跟踪、特征提取、背景建模等功能,适用于监控和安全等应用。 * 物体检测与跟踪 :提供了多种目标检测和跟踪算法,如Haar级联检测器、HOG特征检测器、卡尔曼滤波器等,可以用于人脸检测、行人检测、车牌识别等应用。 * 特征提取与匹配 :包括角点检测、描述符提取、特征匹配等,有助于从图像中提取关键信息并进行比较和分析。 * 机器学习与深度学习 :集成了分类、聚类、回归等机器学习算法,并提供了与主流深度学习框架(如TensorFlow、PyTorch)的集成接口,支持神经网络模型的训练和推断。 #### 三、应用场景 * OpenCV被广泛应用于各种领域,包括智能监控、自动驾驶、医学图像处理、工业检测、农业图像分析、机器人技术等。 * 它可以帮助开发人员和研究人员高效地处理图像读取、显示、过滤、转换和分析等图像操作,从而开发出各种创新的计算机视觉应用。 #### 四、安装与使用 * OpenCV可以通过官方网站下载适合操作系统的版本,并按照官方文档提供的指南进行安装。 * 在编程环境中导入OpenCV库后,可以使用其提供的函数和算法进行图像处理和分析。 综上所述,OpenCV是一个功能强大且易于使用的计算机视觉库,通过学习和掌握其功能和用法,可以开发出各种创新的计算机视觉应用。 |
2.再了解OpenCV在java中的使用机制?
OpenCV主要是使用**C++**编程语言开发的。对于java使用OpenCV就是用jar包调用dll的形式来完成的,这个形式叫作JNI(Java Native Interface)机制。JNA(Java Native Access)也是基于JNA封装的。其实JDK本身的一些实现思路也是这样的,一些基础的内容java语言自己实现了就是普通的jar包,需要调用操作系统的能力的jar包就是JNI机制下的本地能力调用包,实际执行还是其操作系统对应的组件来完成的,如windows下面是dll,linux下面是sh(没有去查啊,我自己理解的)。windows系统中,在jdk的bin目录下一大堆dll,就是这样的。
那JDK项目是默认约定加载的dll的路径在哪里?第一个肯定是JDK的bin目录啦,第二个应该是操作系统的目录啦,比如windows操作系统中的c:/windows/system32目录。当然,java肯定可以指定目录文件加载咯!如果你是JDK的设计人员,相信你也会这样去设计的。
所以,windows系统中java要调用OpenCV,你只需要做好两件事情,一是让你的工程加载OpenCV的jar包,二是让你的项目能加载到OpenCV的dll文件。
3.dll加载的两种方式
1)用System.loadLibrary加载dll
看看方法的注释
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Loads the native library specified by the libname
argument. The libname
argument must not contain any platform specific prefix, file extension or path. If a native library called libname
is statically linked with the VM, then the JNI_OnLoad_libname
function exported by the library is invoked. See the JNI Specification for more details. Otherwise, the libname argument is loaded from a system library location and mapped to a native library image in an implementation-dependent manner. The call System.loadLibrary(name)
is effectively equivalent to the call > > Runtime.getRuntime().loadLibrary(name) >
|
这一段我的理解是:
放的位置是特定的库位置,比如windows/system32和jdk的bin目录。文件名字不需要写它的后缀,比如xxx.dll就写xxx就可以了,不需要后面的".dll'。
所以,我分别把OpenCV的dll复制到操作系统的目录下和JDK的bin目录下面,都好使哦!
D:\zsp\tools\opencv\build\java\x64\opencv_java4100.dll
C:\Windows\System32
D:\zsp\tools\jdk-22.0.2\bin
我的操作系统是windows64位哈。你的版本不同,可能dll文件的名字中数字不一样哈
2)用System.load加载dll
先看看方法的注释:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Loads the native library specified by the filename argument. The filename argument must be an absolute path name. If the filename argument, when stripped of any platform-specific library prefix, path, and file extension, indicates a library whose name is, for example, L, and a native library called L is statically linked with the VM, then the JNI_OnLoad_L function exported by the library is invoked rather than attempting to load a dynamic library. A filename matching the argument does not have to exist in the file system. See the JNI Specification for more details. Otherwise, the filename argument is mapped to a native library image in an implementation-dependent manner. |
我的理解是这个方法是需要文件的绝对路径,就是完整路径,名称包含后缀的那种。
我分别测试了直接从安装目录加载和项目的resources下都好使。
java
static {
System.load("D:/zsp/tools/opencv/build/java/x64/opencv_java4100.dll");
}
当然,如果是从工程的resources目录加载,我是把dll复制过去的哦!当然可以写死路径,我这样写方便别的人测试我的代码就不用修改路径了哦。用了点小技巧。
java
static {
String path1 = ClassLoader.getSystemResource(Core.NATIVE_LIBRARY_NAME+".dll").getPath();
if(path1.startsWith("/")) {
path1=path1.substring(1);
}
}
4.jar包加载的两种方式
既然是jar加载,这个跟开发工具或者叫java项目有关。
1)方法一eclipse项目添加外部jar包
项目鼠标右键,点击最下面的Properties,在java build path中 切换到Libraries选项卡,点击Classpath,选择右边的Add External Jars...,去选择你OpenCV的jar包。
2)方法二利用maven加载jar包
这个方法,我不太推荐。当然有maven私库环境的小伙伴可以用这种,方便其他小伙伴使用。我虽然熟悉,但是对应jar的dll又从哪里来?OpenCV官方是否把最新的jar包上传到了仓库?所以先还是不推荐直接依赖远程库的方法。当然,你也可以用maven外部包安装的方法来解决,或者上传到maven的私库哦。
bash
mvn install:install-file -Dfile=D:\zsp\tools\opencv\build\java\opencv-4100.jar -DgroupId=org.opencv -DartifactId=opencv -Dversion=4.10.0 -Dpackaging=Jar
然后在你的pom.xml增加依赖如下:
XML
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv</artifactId>
<version>4.10.0</version>
</dependency>
5.我推荐的加载方式及测试代码
1)先看看我最后的工程结构
2)我的pom.xml
XML
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.scantt</groupId>
<artifactId>opcv-install</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>opencv安装确认</name>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<!-- 可以不用这种jar包加载哦
<dependencies>
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv</artifactId>
<version>4.10.0</version>
</dependency>
</dependencies>
-->
</project>
3)我的java测试代码
java
import java.net.URL;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
/**
* 记得把lib目录中的opencv-4100.jar添加到项目的外部jar
*/
public class Test {
static {
// System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String path1 = ClassLoader.getSystemResource(Core.NATIVE_LIBRARY_NAME+".dll").getPath();
if(path1.startsWith("/")) {
path1=path1.substring(1);//windows系统有毒...jar包不认识 /开头这样的形式,如/c:/xx
}
// System.load("D:/zsp/tools/opencv/build/java/x64/opencv_java4100.dll");
System.load(path1);
}
public static void main(String[] args) {
URL url=ClassLoader.getSystemResource("soear.png");
String path = url.getPath();
if(path.startsWith("/")) {
path=path.substring(1);//windows系统有毒...jar包不认识 /开头这样的形式,如/c:/xx
}
Mat mat = Imgcodecs.imread(path);
// Mat mat = Imgcodecs.imread("C:\\Users\\Dell\\git\\prodsafemanagetechplatform\\demos\\opcv-install\\src\\main\\resources\\soear.png");
if (mat.empty()) {
System.out.println("load image faild");
return;
}
System.out.println("image size:"+mat.size());
}
}
输出结果是:image size:596x980
4)我的jar加载配置
四.可能遇到的问题
我主要遇到了JDK版本与OpenCV要求不一致的问题。我最后用了OpenJDK22.0.2哦。项目编译的版本是11哦。<maven.compiler.source>11</maven.compiler.source>
五.参考文章
Windows+Java + Eclipse + OpenCV 环境搭建教程_eclipse opencv-CSDN博客