SpringBoot使⽤OpenCV⽰例总结
前⾔
最近有个项⽬需要对图⽚图像进⾏处理,使⽤到了开源框架OpenCV全称是Open Source Computer Vision Library,是⼀个跨平台的计算机视觉库;⽽现在的项⽬都是基于SpringBoot,需要把OpenCv整合进去,下⾯把在使⽤中遇到的问题进⾏⼀个汇总整理。
下载安装
Opencv官⽹提供了⼀个多个平台的版本包括:Windows,IOS,Android,地址如下:;因为开发在Windows平台,发布在Linux平台,所以我们这⾥⾄少需要两个版本;
windows平台
直接可以在官⽹下载安装即可,安装完会出现opencv⽂件夹在build\java⽬录下有我们需要的opencv-
3410.jar,x64/opencv_java3410.dll,x86/opencv_java3410.dll⽂件;
Linux平台
Linux平台需要我们⼿动编译,下载,解压到/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.<clinit>(NativeConfig.java:10) ~[classes/:na]
绝对路径⽅式
可以通过System.load来指定本地库函数的绝对路径:
@Configuration
public class NativeConfig {
static {
System.load("C:\\Users\\opencv\\build\\java\ 64\\opencv_java3410.dll");
}
cmake如何使用
}
踩坑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.stOpenCV(OpenCVController.java:13) ~[classes/:na]
很明显是在使⽤jar包⾥⾯的⽅法时没有到对应的本地库函数,也就是说loadLibrary没有成功,但是之前其实在本地Java项⽬中是有进⾏测试的,可以通过的,猜测是不是使⽤了什么⼯具导致加载失败,最终锁定在⼯具包,提供了动态加载等功能,直接移除此⼯具包,或者配置如下开关:
System.setProperty("abled", "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直接去加载,具体实现代码可以参考
踩坑2
在执⾏maven编译打包的时候,发现本地库⽂件(dll或者so⽂件)体积会变⼤,猜测maven在编译的时候对本地库⽂件也进⾏了编译,具体如何禁⽤指定的⽂件格式编译,⽽只需要拷贝即可:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<!-- maven编译下⾯扩展类型⽂件的时候直接复制原⽂件,⽽不会进⾏⼆次编码-->
<nonFilteredFileExtensions>dll,so</nonFilteredFileExtensions>
</configuration>
</plugin>
第三⽅Jar包
除了以上两种需要我们⾃⼰去实现加载的⽅式,其实还可以直接使⽤第三⽅提供的jar包,⾥⾯包含了OpenCV.jar,对应各个平台的本地库,以及加载本地库的封装类;查看其源码可以发现,其实也是通过判断当前系统,然后将对应的本地库⽂件拷贝到系统的临时⽂件夹下,最后通过system.load去加载:
因为此包兼顾了所有平台,所以整个包有点⼤,⼀百多M,如果部署的系统确定,其实可以⾃⼰去加载指定库⽂件就可以了,然后以相同的⽅式打成⼀个公共包供各个系统使⽤;
总结
本⽂虽然介绍的是在项⽬中使⽤OpenCV的⼀些总结,但其实其他的本地库也可以使⽤相同的⽅式;本⽂重点记录⼀下在使⽤过程中遇到的那些坑,以及加载库⽂件的⽅式。
到此这篇关于SpringBoot使⽤OpenCV⽰例总结的⽂章就介绍到这了,更多相关SpringBoot使⽤OpenCV内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。