前言
最近有个项目需要对图片图像进行处理,使用到了开源框架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_java本文来源gao@daima#com搞(%代@#码@网&3410.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\\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]