❗️❗️注意事项:本篇的配置环境基于 Mac + M2芯片(arm64架构)+ Intellij,其他操作系统可能存在不适用的情况,请知晓。
1. 基础信息确认
在进行opencv配置前,需要先确认系统和jvm的架构,以保证后续安装可以顺利进行。
查询设备os架构:
uname -m
//以我的设备为例,输出的是:arm64
查询jvm架构:
java -XshowSettings:properties -version
// 以我的设备为例,os.arch字段输出的是:os.arch = aarch64
// 如果输出的是 os.arch = x86_64,需要重新下载正确的jdk
这里要注意,jvm的架构需要和设备os架构一致,否则在引入opencv动态库时,会报incompatible architecture的错误。
2. Intellij配置opencv
2.1. 安装opencv
mac上面最方便快捷的安装方法是使用Homebrew安装。
Homebrew安装完成后,检查一下你是否已经安装了XCode 命令行工具,在终端执行以下命令:
xcode-select --install
如果出现 error: command line tools are already installed 你就可以直接开始安装OpenCV了,如果没有报错,你就需要安装XCode。
检查你是否安装了Apache Ant,如果没有安装,使用下面的命令安装:
brew install ant
你需要修改opencv的安装规则(formula)以安装opencv的java支持,你可以执行以下命令:
brew edit opencv
进入编辑模式,找到 DBUILD_opencv_java=OFF 并修改为 DBUILD_opencv_java=ON,保存并退出。
现在你可以执行如下命令来安装最近版本的opencv:
HOMEBREW_NO_INSTALL_FROM_API=1 brew install --build-from-source opencv
如果你想要安装旧版本的OpenCV,使用这个命令查看可以选择的版本:
brew search opencv
然后带版本号安装:
HOMEBREW_NO_INSTALL_FROM_API=1 brew install --build-from-source opencv@[Version]
稍等片刻,OpenCV就安装完成了,可以使用这个命令来查看OpenCV的安装信息:
brew info opencv
在 /opt/homebrew/Cellar/opencv/xxx/share 路径下查看jar包的格式:
cd /opt/homebrew/Cellar/opencv/4.9.0_3/share/java/opencv4
file libopencv_java490.dylib
libopencv_java490.dylib: Mach-O 64-bit bundle arm64
// 可以看到编译产生的动态库支持的是arm64架构
2.2. 配置Intellij
在IDEA中创建一个新的项目或者打开一个已有的,打开 File -> Project Structure,在 Project Settings 的 Libraries 点击 + 并选择java
浏览到上面提到的OpenCV的安装路径,在其中找到 share/java/opencv4 并选择 opencv-xxx.jar。文件名称与你安装的具体版本关联。
选择module opencv-430点击 + 在上面的jar所在目录,找到 libopencv_java430.dylib
配置完成如上图所示,点击OK。
2.3. 配置maven
maven导入依赖。这里需要注意,maven中的依赖版本需要和导入的opencv库版本一致,否则会报错。
以上都配置完成后,就可以在代码中使用opencv了:
public class SIFT {
public static void main(String[] args) throws IOException {
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
System.out.println("load lib success: " + Core.VERSION);
}
}
// 控制台输出
// load lib success: 4.9.0
3. 踩坑记录
1. brew edit opencv提示Error: Invalid usage: opencv doesn't exist on disk.
很大可能是安装homebrew的时候没有正确安装,比如网络断了等,根据提示更新一下homebrew-core就可以了。
brew tap --force homebrew/core
// 更新成功后再brew edit opencv
2. /opt/homebrew/Cellar/opencv/xxx/share 路径下没有java编译结果。
查看brew在执行 brew install --build-from-source opencv 时的log:
`brew install` ignores locally edited casks and formulae if HOMEBREW_NO_INSTALL_FROM_API is not set.
log说的很明白了,如果不设置 HOMEBREW_NO_INSTALL_FROM_API,就会忽略本地的修改,从线上拉取。线上拉取的formula 默认的 DBUILD_opencv_java=OFF,所以不会生成jar包。网上的参考文档估计是比较早的版本了,当时没有 HOMEBREW_NO_INSTALL_FROM_API 这个东西。
HOMEBREW_NO_INSTALL_FROM_API=1 brew install --build-from-source opencv
3. intellij导入动态库后,运行报错:
Exception in thread "main"java.Lang.UnsatisfiedLinkError Create breakpoint /opt/homebrew/Cellar/opencv/4.9.0 3/share/java/opencv4/libopency java490.dylib:
dlopen(/opt/homebrew/Cellar/opencv/4.9.0_3/share/java/opencv4/Libopencv_java490.dylib,0x0001):tried:'/opt/homebrew/Cellar/opencv/4.9
.0_3/share/java/opencv4/libopencv_java490.dylib'(mach-o file,but is an incompatible architecture (have 'arm64',need 'x86_64'))
原因是安装的jdk有问题,jvm环境是x86_64的,但是编译出来的动态库是aarch64的格式,导致报错。
java -XshowSettings:properties -version 查看 os.arch 字段,如果为"x86_64",去Oracle官网重新下载正确系统的jdk。