- 作者:老汪软件技巧
- 发表时间:2024-09-18 15:02
- 浏览量:
OpenCV 的 JNI(Java Native Interface)是用来使 Java 应用程序能够调用 OpenCV 的 C++ 库函数的接口。JNI 是 Java 提供的一种机制,它允许 Java 代码与本地(通常是 C/C++)代码进行交互,因此可以在 Java 应用中使用性能更高的本地代码。
在 OpenCV 中,通过 JNI 可以将 OpenCV 的核心功能暴露给 Java 程序,使得 Java 开发者能够利用 OpenCV 的图像处理和计算机视觉功能。这通常涉及到创建一个 JNI 层,Java 代码调用 JNI 层的函数,而这些函数再调用底层的 OpenCV C++ 函数。
典型的流程如下:
Java 代码调用本地方法(native method)。JNI 层将这些调用转发到相应的 C/C++ 实现中。C/C++ 实现执行所需的操作(如调用 OpenCV 的函数)。结果通过 JNI 层返回给 Java 代码。
在 OpenCV 中,为了在 Java 中使用 JNI,你需要:
这样,你就可以在 Java 项目中利用 OpenCV 的强大功能,同时保持 Java 的跨平台优势。
1 查询编译依赖
brew info opencv
确保所有需要的模块都已安装,未安装的使用homebrew进行安装
2 下载 OpenCV 源码和拓展库
3 编译安装
进入源码文件夹,创建并进入 build 文件夹
cd opencv-4.8.0
mkdir build $$ cd build
建立一个run.sh文件,并输入如下代码,其中BUILD_opencv_java设置为ON OPENCV_EXTRA_MODULES_PATH设置为下载的opencv_contrib的modules路径,
同时修改jdk的路径
# run.sh 脚本文件内容
cmake \
-DCMAKE_SYSTEM_PROCESSOR=arm64 \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DWITH_OPENJPEG=OFF \
-DWITH_IPP=OFF \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local/opencv \
-DJAVA_INCLUDE_PATH=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/include \
-DJAVA_AWT_INCLUDE_PATH=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/include \
-DJAVA_INCLUDE_PATH2=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/include/darwin \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_java=ON \
-DINSTALL_PYTHON_EXAMPLES=OFF \
-DINSTALL_C_EXAMPLES=OFF \
-DBUILD_ZLIB=OFF \
-DOPENCV_ENABLE_NONFREE=ON \
-DOPENCV_EXTRA_MODULES_PATH=/Users/tankenqi/Downloads/opencv_contrib-4.8.0/modules \
-DBUILD_EXAMPLES=ON ..
输入 bash run.sh运行该命令,启动 cmake
bash ./run.sh
完成之后输入make -j8或者make实现make
J之后的数字 8 表示我们将使用所有 8 个内核来运行Make命令
make -j8
最后后输入sudo make install进行安装
sudo make install
完成之后会在两个地方出现jar文件和lib文件,一个是build路径
opencv-4.8.0/build/bin/opencv-480.jar
opencv-4.8.0/build/lib/libopencv_java480.dylib
一个是安装路径
/usr/local/opencv/share/java/opencv4/libopencv_java480.dylib
/usr/local/opencv/share/java/opencv4/opencv-480.jar
4 测试验证
完成后,利用IDEA创建如下示例代码
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat mat = Mat.eye( 3, 3, CvType.CV_8UC1 );
System.out.println( "mat = " + mat.dump() );
}
}
同时设置 java library path
-Djava.library.path=/usr/local/opencv/share/java/opencv4
添加 jar 包依赖
启动运行输出如下