JavaCV on CentOS 6
JavaCV is a “Java interface to OpenCV and more”. OpenCV is the de facto standard of computer vision software enabling facial recognition, motion detection, general object detection to run over images. JavaCV incorporates with other technologies like ffmpeg allowing the same computer vision algorithms to intake videos.
If Java is language of choice, or the JVM, Java Bindings are used to interact with c/c++ libraries like OpenCV and ffmpeg. JavaCV provides all the jars pre-built including a jar that contains .so files, shared object files, for the various platforms, Mac, Linux and Windows. The intention is to not require a system level install of the OpenCV libraries.
CentOS 6.4 was unable to find the shared object files. JavaCV loaded the .so files from the provided jar and dynamically made the jnilib*.so files. Unfortunately the libc version provided with CentOS 6.4 is below the version the provided .so files were built for and the linking operation failed.
To see what version of libc is installed, ldd --version
. In this case 2.12 and the stack traces looked like this:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniopencv_objdetect in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:701)
at com.googlecode.javacpp.Loader.load(Loader.java:578)
at com.googlecode.javacpp.Loader.load(Loader.java:532)
at com.googlecode.javacv.cpp.opencv_objdetect.<clinit>(opencv_objdetect.java:91)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:266)
at com.googlecode.javacpp.Loader.load(Loader.java:553)
at Smoother.main(Smoother.java:6)
Caused by: java.lang.UnsatisfiedLinkError: /tmp/javacpp8883169523366/libjniopencv_objdetect.so: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /tmp/javacpp8883169523366/libjniopencv_objdetect.so)
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
at java.lang.Runtime.load0(Runtime.java:787)
at java.lang.System.load(System.java:1022)
at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:690)
Try out the provided demo on CentOS 6.4
git clone https://github.com/imintel/javacv-on-centos-6.git && cd javacv-on-centos-6/demo
javac -cp javacv-linux-x86_64.jar:javacpp.jar:javacv.jar Smoother.java
java -cp javacv-linux-x86_64.jar:javacpp.jar:javacv.jar Smoother
This produces a similar stack trace from above.
To fix these errors, compile javacv-linux-x86_64.jar and OpenCV libraries on CentOS 6.4.
###Building OpenCV
Ensure JAVA_HOME defined. Something like /usr/lib/jvm/java
Install system packages
sudo yum groupinstall "Development Tools" sudo yum install cmake sudo yum install ant
Clone the OpenCV repository
git clone https://github.com/Itseez/opencv.git && cd opencv
Checkout desired release
git checkout 2.4.6.2
Make release directory
mkdir release && cd release
Generate make file, make and install
This takes some time depending on the machine and what 3rd party libraries are built.
cmake -DBUILD_SHARED_LIBS=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/ .. make sudo make install
Ensure library files exist
ls /usr/lib/*opencv*
###Building JavaCV
Install maven if needed.
Clone the JavaCV repository
git clone https://code.google.com/p/javacv/ && cd javacv
Checkout the latest release tag, 0.6 at this time.
git checkout 0.6
Build the project
mvn install
In step 3 c++ compiler commands execute and pick up on the libraries built in the “Building OpenCV” step.
Copy the built jar
cp target/javacv-linux-x86_64.jar PATH_TO_DEMO_REPOSITORY/
###Using the jar built from source
Run the same test commands from above
javac -cp javacv-linux-x86_64.jar:javacpp.jar:javacv.jar Smoother.java
java -cp javacv-linux-x86_64.jar:javacpp.jar:javacv.jar Smoother
The correctly linked libjni file path prints.
/tmp/javacpp14551117426304/libjniopencv_objdetect.so
The provided Smoother.java file attempts to load the shared library and print the path. To get started with JavaCV take a look at their cookbook.
You can see the demo files on our Github repo.