JavaCV是java实现的调用openCV的接口,本身opencv就可以支持Windows,Linux和Mac OS,Javacv可以将OpenCV的功能放到Android系统上调用,处理设备的图形图像和视频等
关于javacv 在Windows、Android系统的配置,可以参考:http://blog.csdn.net/victory06057231/article/details/8026188 这篇文章来做。
在Java的Web服务器上配置JavaCV的环境,没有介绍。
JavaCV的依赖是:
<dependency> <groupId>com.googlecode.javacv</groupId> <artifactId>javacv</artifactId> <version>0.1</version> </dependency>
下载下来有7个jar包,其中带系统和机型后缀的jar包里面都是OpenCV的配置文件,在带linux后缀的jar包中是C编译的.so文件,解压之后就可以看到
javacv-0.1.jar javacv-0.1-macosx-x86_64.jar javacv-0.1-linux-x86_64.jar javacv-0.1-linux-x86.jar javacv-0.1-windows-x86.jar javacv-0.1-windows-x86_64.jar
这个.so文件,要Linux环境配置是要配置到指定目录下面的,开始以为定义环境变量就可以了,但是直到看到javacv-0.1.jar的源码(反编译得来的),才发现所有的配置目录都是写死了的
public class opencv_core { public static final String genericIncludepath = "/opt/local/include/"; public static final String genericLinkpath = "/opt/local/lib/:/opt/local/lib64/:/usr/local/lib/:/usr/local/lib64/"; public static final String windowsIncludepath = "C:/opencv/build/include/"; public static final String windowsx86Linkpath = "C:/opencv/build/x86/vc10/lib/"; public static final String windowsx86Preloadpath = "C:/opencv/build/x86/vc10/bin/;C:/opencv/build/common/tbb/ia32/vc10/"; public static final String windowsx64Linkpath = "C:/opencv/build/x64/vc10/lib/"; public static final String windowsx64Preloadpath = "C:/opencv/build/x64/vc10/bin/;C:/opencv/build/common/tbb/intel64/vc10/"; public static final String androidIncludepath = "../include/"; public static final String androidLinkpath = "../lib/";
@Properties({@com.googlecode.javacpp.annotation.Platform(includepath={"/opt/local/include/"}, linkpath={"/opt/local/lib/:/opt/local/lib64/:/usr/local/lib/:/usr/local/lib64/"}, include={"<opencv2/calib3d/calib3d.hpp>", "opencv_adapters.h"}, link={"[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"}), @com.googlecode.javacpp.annotation.Platform(value={"windows"}, includepath={"C:/opencv/build/include/"}, link={"opencv_calib3d240", "opencv_features2d240", "opencv_flann240", "opencv_highgui240", "opencv_imgproc240", "opencv_core240"}), @com.googlecode.javacpp.annotation.Platform(value={"windows-x86"}, linkpath={"C:/opencv/build/x86/vc10/lib/"}, preloadpath={"C:/opencv/build/x86/vc10/bin/;C:/opencv/build/common/tbb/ia32/vc10/"}), @com.googlecode.javacpp.annotation.Platform(value={"windows-x86_64"}, linkpath={"C:/opencv/build/x64/vc10/lib/"}, preloadpath={"C:/opencv/build/x64/vc10/bin/;C:/opencv/build/common/tbb/intel64/vc10/"}), @com.googlecode.javacpp.annotation.Platform(value={"android"}, includepath={"../include/"}, linkpath={"../lib/"})}) public class opencv_calib3d {
也就是必须按照源码的配置,javacv才会读OpenCV的动态链接库。
对于我的linux服务器是Linux86_64位的8核机,将javacv-0.1-windows-x86_64.jar的解压的.so文件放到/usr/local/lib64/或者/opt/local/lib64/目录下面就可以了。
如果没有找到配置文件,会在应用服务器的临时文件夹解压文件,解压不成功找不到文件,就抛这个异常
ERROR com.alibaba.citrus.turbine.pipeline.valve.HandleExceptionValve - Failed to process request /auto/imageCompare.do, the root cause was UnsatisfiedLinkError: /home/admin/wtp/.default/temp/javacpp33861831521035698/libjniopencv_core.so: libopencv_core.so.2.4: 无法打开共享对象文件: 没有那个文件或目录
java.lang.UnsatisfiedLinkError: /home/admin/wtp/.default/temp/javacpp33861831521035698/libjniopencv_core.so: libopencv_core.so.2.4: 无法打开共享对象文件: 没有那个文件>
或目录
at java.lang.ClassLoader$NativeLibrary.load(Native Method) ~[na:1.6.0_32]
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1807) ~[na:1.6.0_32]
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1703) ~[na:1.6.0_32]
at java.lang.Runtime.load0(Runtime.java:770) ~[na:1.6.0_32]
at java.lang.System.load(System.java:1003) ~[na:1.6.0_32]