前言

最近有个项目需要对图片图像进行处理,使用到了开源框架OpenCV全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库;而现在的项目都是基于SpringBoot,需要把OpenCv整合进去,下面把在使用中遇到的问题进行一个汇总整理。

下载安装

Opencv官网提供了一个多个平台的版本包括:Windows,IOS,Android,地址如下:opencv.org/releases/;因为开发在Windows平台,发布在Linux平台,所以我们这里至少需要两个版本;

windows平台

直接可以在官网下载opencv-3.4.10-vc14_vc15.exe安装即可,安装完会出现opencv文件夹在build\java目录下有我们需要的opencv-3410.jar,x64/opencv_java3410.dll,x86/opencv_java3410.dll文件;

Linux平台

Linux平台需要我们手动编译,下载opencv-3.4.10.zip,解压到/user/local目录下,然后编译安装,执行如下命令:

cd /usr/local/opencv-3.4.10

mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..

make -j8

sudo make install

安装完之后可以在build/bin目录下找到opencv-3410.jar,在build/lib目录下找到libopencv_java3410.so

整合使用

两个平台分别安装完之后,获取了对应的dll和so文件;两个平台获取到的jar都是一样的,随便用哪个都可以,下面看看如何使用

外部引用方式

通过把应用jar与本地库文件进行分隔开,然后在项目中进行引用

相对路径方式

可以通过System.loadLibrary来指定本地库文件,但是这种方式需要在运行时指定-Djava.library.path,具体可以提供配置类:

@Configuration

public class NativeConfig {

static {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

}

}

运行时需要在VM arguments中添加-Djava.library.path=对应dll存放的路径,不然会出现如下错误:

Caused by: java.lang.UnsatisfiedLinkError: no opencv_java3410 in java.library.path

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) ~[na:1.8.0_251]

at java.lang.Runtime.loadLibrary0(Runtime.java:870) ~[na:1.8.0_251]

at java.lang.System.loadLibrary(System.java:1122) ~[na:1.8.0_251]

at com.springboot.opencv.NativeConfig.(NativeConfig.java:10) ~[classes/:na]

绝对路径方式

可以通过System.load来指定本地库函数的绝对路径:

@Configuration

public class NativeConfig {

static {

System.load("C:\\Users\\opencv\\build\\java\\x64\\opencv_java3410.dll");

}

}

踩坑1

在IDE中运行使用Opencv功能的时候,出现如下错误:

java.lang.UnsatisfiedLinkError: org.opencv.imgcodecs.Imgcodecs.imread_1(Ljava/lang/String;)J

at org.opencv.imgcodecs.Imgcodecs.imread_1(Native Method) ~[opencv-3.4.10.jar:unknown]

at org.opencv.imgcodecs.Imgcodecs.imread(Imgcodecs.java:332) ~[opencv-3.4.10.jar:unknown]

at com.springboot.opencv.OpenCVController.testOpenCV(OpenCVController.java:13) ~[classes/:na]

很明显是在使用jar包里面的方法时没有找到对应的本地库函数,也就是说loadLibrary没有成功,但是之前其实在本地Java项目中是有进行测试的,可以通过的,猜测是不是使用了什么工具导致加载失败,最终锁定在spring-boot-devtools工具包,提供了动态加载等功能,直接移除此工具包,或者配置如下开关:

System.setProperty("spring.devtools.restart.enabled", "false");

内部引用方式

为了更加简单部署,可以把本地库文件和项目文件打成一个jar包,可以把本地库文件放在resources目录下,这样可以打成一个jar包,现在的主要问题就是如何加载jar包里面的本地库文件,通过测试发现可以读取到resources目录下的库文件,但是通过system.load并不能去加载成功,对应的是一个类似如下的路径:

file:/C:/Users/Administrator.SKY-20170404CXG/Desktop/springboot-0.0.1-SNAPSHOT.j

ar!/BOOT-INF/classes!/opencv

最后采用的方式是把读取的库文件,存放到系统的一个临时文件夹下,然后拿到库文件的绝对路径,这样就可以通过system.load直接去加载,具体实现代码可以参考Github

踩坑2

在执行maven编译打包的时候,发现本地库文件(dll或者so文件)体积会变大,猜测maven在编译的时候对本地库文件也进行了编译,具体如何禁用指定的文件格式编译,而只需要拷贝即可:

org.apache.maven.plugins

maven-resources-plugin

UTF-8

dll,so

第三方Jar包

除了以上两种需要我们自己去实现加载的方式,其实还可以直接使用第三方提供的jar包OpenPnp,里面包含了OpenCV.jar,对应各个平台的本地库,以及加载本地库的封装类;查看其源码可以发现,其实也是通过判断当前系统,然后将对应的本地库文件拷贝到系统的临时文件夹下,最后通过system.load去加载:

Files.createTempDirectory(`opencv_openpnp`);

因为此包兼顾了所有平台,所以整个包有点大,一百多M,如果部署的系统确定,其实可以自己去加载指定库文件就可以了,然后以相同的方式打成一个公共包供各个系统使用;

总结

本文虽然介绍的是在项目中使用OpenCV的一些总结,但其实其他的本地库也可以使用相同的方式;本文重点记录一下在使用过程中遇到的那些坑,以及加载库文件的方式。

到此这篇关于SpringBoot使用OpenCV示例总结的文章就介绍到这了,更多相关SpringBoot使用OpenCV内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

opencv第三方库JAVA接口,SpringBoot使用OpenCV示例总结相关推荐

  1. 对接第三方平台JAVA接口问题推送和解决

    对接第三方平台JAVA接口问题推送和解决 参考文章: (1)对接第三方平台JAVA接口问题推送和解决 (2)https://www.cnblogs.com/CreateMyself/p/7295879 ...

  2. python的excell库_Python中使用第三方库xlrd来写入Excel文件示例

    继上一篇文章使用xlrd来读Excel之后,这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表示write x ...

  3. Lua快速入门篇(XLua教程)(Yanlz+热更新+xLua+配置+热补丁+第三方库+API+二次开发+常见问题+示例参考)

                            <Lua热更新> ##<Lua热更新>发布说明: ++++"Lua热更新"开始了,立钻哥哥终于开始此部分的探 ...

  4. python怎样在已有excel文件指定行写入-Python中使用第三方库xlrd来写入Excel文件示例...

    继上一篇文章使用xlrd来读Excel之后,这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表示write x ...

  5. 人脸识别用哪种python库_Python人脸识别第三方库face_recognition接口介绍文档

    1. 查找图像中出现的人脸 代码示例: #导入face_recognition模块 import face_recognition #将jpg文件加载到numpy数组中 image = face_re ...

  6. java接口 泛型_java 泛型接口示例

    /* * 泛型接口 */ interface Tool { public void show(T t); //泛型方法 public void print(E e); } /* * 这种方式适合实现接 ...

  7. opencv python安装_Python 安装 第三方库的安装技巧

    PythonIDE 软件:PyCharm 2016.1.4 pythonversion : Python 3.5.0 安装一个两条建议: 1. 使用pip命令行工具在线下载你需要的第三方库 2. 手动 ...

  8. 在php中调用java接口吗,php 调用 java 接口

    php 需要开启 curl模块 /* * HTTP 请求函数封装 */ function http_request_cloudzone($url, $data){ //var_dump($url.&q ...

  9. Python常用第三方库

    Python常用第三方库 一. 文件读写 二.网络抓取和解析 三.数据库连接 四.数据清洗转换 五.数据计算和统计分析 六.自然语言处理和文本挖掘 七.图像和视频处理 八.音频处理 九.数据挖掘/机器 ...

最新文章

  1. tomcat配置manager
  2. 基因组行业重大事件介绍
  3. Cocoapods安装过程【转载】
  4. AD设备覆铜与同网络过孔的连接方式
  5. anaconda方法安装python教程_anaconda的安装教程和使用方法
  6. 学编程的日子里,很多人因迷茫放弃了编程,那我们应该怎么做呢?
  7. 本周新出开源计算机视觉代码汇总(含图像超分辨、视频目标分割、行人重识别、点云识别等)...
  8. 数据库史上最大投资!Neo4j获3.25亿美元F轮融资
  9. 4556: [Tjoi2016Heoi2016]字符串
  10. 多尺度:传统高斯金字塔,拉普拉斯金字塔及SIFT算法多尺度金字塔
  11. 计算机毕业论文基于Python实现的仓库库存管理系统进销存储系统
  12. 微信支付之Native扫码支付功能
  13. (Qt)windows下鼠标键盘热插拔监测
  14. 南宁第一职业技术学校计算机专业,南宁第一职业技术学校
  15. 圆锥的表面积和体积计算
  16. java毕设项目公立医院绩效考核系统(附源码)
  17. Tableau:如何自定义形状
  18. 中国传统节日网页html,【学习在线】中国传统节日的形成和发展
  19. sqlserver,拆分分隔符并转换为列表格
  20. 一个男人一天最舒服的地方在地下车库

热门文章

  1. leetcode 382. Linked List Random Node | 382. 链表随机节点(Java)
  2. 【Python】判断字符串中是否含有某个子串
  3. 【Java爬虫】爬取网页中的内容,提取其中文字
  4. java中interrupt,interrupted和isInterrupted的区别
  5. 在linux服务器上安装Jenkins
  6. leetcode -- 303. 区域和检索 - 数组不可变
  7. ServletRequestAttributes用法详解——Spring系列学习笔记
  8. 【终极方法】This method must return a result of type boolean
  9. 【传智播客】Javaweb程序设计任务教程 黑马程序员 第三章 课后答案
  10. 38行代码AC——UVA-167The Sultan‘s Successors(八皇后问题,附视频讲解)