工业生产安全-安全帽第一篇-opencv及java开发环境搭建

一.背景

       公司是非煤采矿业,核心业务是采选,大型设备多,安全风险因素多。当下政府重视安全,头部技术企业的安全解决方案先进但价格不低,作为民营企业对安全投入的成本很敏感。利用我本身所学,准备搭建公司的安全管理技术平台,从视觉、传感等多方面配合,逐步将公司的生产安全管理技术平台搭建起来。整体框架心中早有数,只是还没有时间来写。本文是安全帽的第一篇,先考虑把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下都好使。

static {System.load("D:/zsp/tools/opencv/build/java/x64/opencv_java4100.dll");
}

      当然,如果是从工程的resources目录加载,我是把dll复制过去的哦!当然可以写死路径,我这样写方便别的人测试我的代码就不用修改路径了哦。用了点小技巧。

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的私库哦。

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增加依赖如下:

		<dependency><groupId>org.opencv</groupId><artifactId>opencv</artifactId><version>4.10.0</version></dependency>

5.我推荐的加载方式及测试代码

     1)先看看我最后的工程结构

2)我的pom.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测试代码

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博客

opencv的java-maven-idea开发环境配置_java opencv maven-CSDN博客

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

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

相关文章

fastadmin多个表crud连表操作步骤

1、crud命令 php think crud -t xq_user_credential -u 1 -c credential -i voucher_type,nickname,user_id,voucher_url,status,time --forcetrue2、修改控制器controller文件 <?phpnamespace app\admin\controller;use app\common\controller\Backend;/*** 凭证信息…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-26

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

Essential Cell Biology--Fifth Edition--Chapter one (8)

1.1.4.6 The Cytoskeleton [细胞骨架] Is Responsible for Directed Cell Movements 细胞质基液不仅仅是一种无结构的化学物质和细胞器的混合物[soup]。在电子显微镜下&#xff0c;我们可以看到真核细胞的细胞质基液是由长而细的丝交叉而成的。通常[Frequently]&#xff0c;可…

RK3568 Linux 系统加系统运行指示灯

一、dts配置 gpio-leds {status = "okay";compatible = "gpio-leds";work-led {gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>

C++11(六)----包装器function和bind

文章目录 包装器&#xff1a;function包装器&#xff1a;bind 包装器&#xff1a;function function接口介绍 在头文件<functional>中 语法&#xff1a;function的语法比较特殊 function<返回值(参数)> 自定义变量名 要被包装的可调用对象 class Plus { public:…

店铺推推-项目测试用例设计(Xmind)

项目介绍&#xff1a; 技术栈: Spring BootMyBatisRedis项目描述&#xff1a; 项目旨在为消费者提供一个公平、公开、透明的平台&#xff0c;让消费者能够基于真实的消费体验对店铺进行评价和 推荐&#xff0c;并为其他潜在消费者提供参考。同时&#xff0c;店铺推推也是为商家…

c++--------《set 和 map》

c--------《set 和 map》 1 set系列的使⽤1.1 set类的介绍1.2 set的构造和迭代器1.3 set重要接口 2 实现样例2.1: insert和迭代器遍历使⽤样例&#xff1a;2.2: find和erase使⽤样例&#xff1a; 练习3.map系列的使用3.1 map类的介绍3.1.1 pair类型介绍 3.2 map的数据修改3.3mu…

GIS融合之路(八)-如何用Cesium直接加载OSGB文件(不用转换成3dtiles)

系列传送门&#xff1a; 山海鲸可视化&#xff1a;GIS融合之路&#xff08;一&#xff09;技术选型CesiumJS/loaders.gl/iTowns? 山海鲸可视化&#xff1a;GIS融合之路&#xff08;二&#xff09;CesiumJS和ThreeJS深度缓冲区整合 山海鲸可视化&#xff1a;GIS融合之路&…

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过&#xff0c;上架后却一直无法被搜索到。打开后&#xff0c;再在 QQ 上下拉查看 “最近使用”&#xff0c;发现他出现一下又马上消失。 上线是按正常流程走的&#xff0c;开发、备案、审核&#xff0c;没有任何违规&#xf…

word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行

注&#xff1a;本文为 “word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行” 相关专题文章合辑。 未整理去重。 “公式较长时最好在等号 “&#xff1d;” 处转行&#xff0c;如难实现&#xff0c;则可在&#xff0b;、&#xff0d;、、 运算符号处…

【优选算法 — 滑动窗口】串联所有单词的子串 最小覆盖子串

串联所有单词的子串 串联所有单词的子串 题目描述 题目解析 算法原理 以示例一为例&#xff0c;一定要记得&#xff0c;words中的每一个字符串长度相同&#xff0c;所以我们可以根据 words 中的每一个字符串的长度length&#xff0c;将 s 这个字符串以 length 个为一组来…

WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等

SQL注入课程体系&#xff1a; 1、数据库注入-access mysql mssql oracle mongodb postgresql 2、数据类型注入-数字型 字符型 搜索型 加密型&#xff08;base64 json等&#xff09; 3、提交方式注入-get post cookie http头等 4、查询方式注入-查询 增加 删除 更新 堆叠等 …

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

SHELL(4)脚本与用户交互以及if条件判断

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…

使用chrome 访问虚拟机Apache2 的默认页面,出现了ERR_ADDRESS_UNREACHABLE这个鸟问题

本地环境 主机MacOs Sequoia 15.1虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 服务器版本 最小安装 开发环境 编辑器编译器调试工具数据库http服务web开发防火墙Vim9Gcc13Gdb14Mysql8Apache2Php8.3Iptables 第一坑 数…

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

【工控】线扫相机小结 第三篇

海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe &#xff0c;最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题&#xff1a; 需要注意的是&#xff0c;我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定&#xff01; 4.5 准确率 5、Pytorch完成回归任务 5.…

【#IEEE独立出版、EI稳定检索##高录用 快见刊 稳检索#】2024健康大数据与智能医疗国际会议(ICHIH 2024,12月13-15日)

#IEEE独立出版、EI稳定检索# #往届快至会后3-4个月检索# #高录用 快见刊 稳检索# 2024健康大数据与智能医疗国际会议&#xff08;ICHIH 2024&#xff09; 2024 International Conference on Health Big Data and Intelligent Healthcare 重要信息 大会官网&#xff1a;ww…