写在前面, 最近因为某些原因要用到 OpenCV, 加上这东西既然有 android 的库, 那说明 java 也有, 作为老本行我还是挺喜欢 Java 这个语言的

打算在 mac 上使用, 但是发现没有编译好的 dylib 库, 所以只能自己动手了

使用 MacPorts 的失败之路

这条路实测不通

  1. 这个 port 我通过 pkg 安装不上, 没有报错原因, 还给我残留了垃圾
  2. 通过编译 port 源码的方式安装完毕后, 安装 opencv 的过程需要安装一个 db48, 结果失败了, 猜测是 port 需要使用 db48 作为数据库来管理自己的库或者别的什么原因, 总之失败了

查看日志是 Xcode 的问题, 说已知 11.1 有问题, 请更新到 11.2 巴拉巴拉的…, 问题是开发人员知道 11.2 的问题更大… 用这版本 Xcode 的人 不能上传 appstore…

11.1 有问题请修复 11.1 的问题.. 而不是简单让人升级, 升级 xcode 需要升级系统, 然后需要经历数个小时的折磨, 这只会让人放弃这个东西

brew 内应该有 opencv 的库, 但是还需要对应去寻找 Java 和 mac 的相同版本, 因为 opencv 并没有单独提供 Java 的源码下载

到这里, 简单使用三方管理二进制库的方案就失败了, 只能自己动手了

自己编译

首先进入 opencv 官网的 release 标签, 下载源码

然后解压缩, 默认应该是这样的:

20191112103456.png

是使用 cmake 进行管理的, 我们先安装个 cmake, $ brew install cmake, 或者你如果是 android 开发者,可以使用 android sdk 中的 cmake 工具, 或者你可以下载一个 cmake 的图形界面, 现在自己版本的

cd opencv-4.1.1
cmake -S . -B build

这样会在 build 文件夹内生成所有的 build 文件

接着执行下面的步骤, 这一步很慢, 可能需要半小时, 也可能会短一些, 但是 10 分钟以上还是需要的, 虽然我这次没出错, 但是三方库出错概率相当高… , 所以这就是我为什么希望可以拿到编译成品库的原因了…

cd build
make -j8 # 这步很重要, 可以开启多核优化, 能加快编译速度

这一步完成后, 在build/lib里就会有很多的 dylib 文件, 这样 c/c++ 层面的动态库就准备完毕了.

然后就是 java 的源码了, 在build/modules/java文件夹里就是 java 相关的文件了, 我们先执行以下操作

cd build/modules/java
make -j8

经过一段时间 java 的源码会被生成在这个文件夹里, jar/opencv/java, 可以直接复制这个源码到项目里, 但是我比较疑惑的是, 这东西不是应该是一个 jar 包吗?

运行

因为我用的是 Idea

20191112105047.png

需要添加-Djava.library.path=/Users/cai/Downloads/sdk/opencv/opencv-4.1.1/build/lib参数到 VM options 里,

20191112105109.png

在 java 中引入 so 库

import org.opencv.core.Core;

public class OpenCVExample1 {
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
}

这一步完成后就可以在 idea 里愉快的使用 OpenCV 了

后记

作为移动开发者, 平时可能更多的是在安卓上使用 OpenCV, 官方提供了 android 的原生支持, 我们不需要太多的考虑编译过程, 只需要引入即可.
但是毕竟有的时候, 本地运行代码的速度会快很多, 很适合做很多测试功能, 因为 android 这东西试验三方代码实在是太慢了.

以上