【问题标题】:Using OpenCv contrib modules for android为 android 使用 OpenCv contrib 模块
【发布时间】:2025-11-27 20:30:02
【问题描述】:

有没有办法在 android 中使用 opencv contrib 模块?我专门使用文本模块。这些模块是否有 android lib。我的代码在桌面上工作,我正在尝试将我的代码迁移到 android。任何见解都是 gr8。

【问题讨论】:

  • 你必须使用<opencv-src>/platforms/android/build_sdk.py编译你自己的OpenCV Android SDK。

标签: opencv android-ndk opencv4android


【解决方案1】:

我在找出这些问题的解决方案时也遇到了问题。我想我会在那里找到一个相关的问题并为社区做出回应,以防其他人也在寻找与我和这个类似的问题的解决方案。编译是在 Macbook Retina 13" 上完成的。

提供的说明有些不完整,需要执行额外的步骤才能获得最终产品。

在开始时,您将遵循在线概述的标准程序

$ cd <opecv_directory>
$ mkdir build
$ cd <opencv_build_directory>
$ cmake -D OPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules <opencv_source_directory>
$ make -j5
$ make install

除此之外,您可能还会遇到一两个错误。我需要安装一些缺失的组件来弥补缺失的东西,但这对你来说可能有所不同(我研究了错误并了解我需要额外的组件)

brew install ninja
brew install oxygen
brew install ant

我还遇到了一个错误,其中一个模块要求在源代码(或编译器标志)中声明以下内容:

#define SOLARIS_64BIT_ENABLED

您可以做的另一件事是在编译期间删除您可能不感兴趣的 contrib 文件夹中的其他模块。只需包含您想要的模块,并希望这些模块是好的。我只是通过从 /modules 文件夹中删除一两个然后重新运行 python 脚本来做到这一点。

需要一个最终的 Python 脚本来运行构建。我在主源代码树和 contrib 文件夹旁边创建了一个目录。

OpenCVSource
  -> opencv
  -> opencv_contrib
  -> android_opencv_build

下面的调用是从我想要构建的目录进行的,所以我更改为目录调用如下:

python ../opencv/platforms/android/build_sdk.py --extra_modules_path ../opencv_contrib/modules --ndk_path <your-path-to-ndk-top-level-folder> --sdk_path <your-path-to-sdk-top-level-folder> ./ ../opencv

这只会构建使用库所需的 .so 文件,但不会构建使用新二进制文件所需的 .jar 文件。为了做到这一点,导航到您的构建文件夹(我的在 android_opencv_build/OpenCV-android-sdk 中)

以标准方式将此项目加载到 Eclipse 中,并将现有 Android 项目导入工作区。你真的只需要 /sdk 项目,但如果需要也可以随意加载示例。然后构建项目。您可能需要更改目标构建以支持新的相机 API 以成功构建;在我的例子中,将目标更改为 API 级别 21。

然后您将在项目的 /bin 目录中找到 .jar 文件。在 android_opencv_build/OpenCV-android-sdk/sdk/native/jni/ 中找到的 .jar 和 .so 文件包含必要的 .so 文件,您需要将它们包含在项目的 /lib 文件夹中,与此 jar 并排。

现在您应该拥有所需的一切。由于我们正在使用 contrib 模块(或者如果您出于其他原因构建它,则不使用),您可能会在构建过程中遇到其他不太稳定且需要注意的错误。这无济于事,但人们可以随时将 cmets 添加到其他人的解决方案中,如果他们找到了解决方案,这篇文章可以帮助他们解决这些问题。

【讨论】:

  • 需要注意的是,并不是所有的 contrib 模块实际上都创建了一个 java 对应的模块。例如,当使用 Aruco 模块时,它们没有 java 类。您必须为源代码创建 jni 包装器并使用 C++ 库调用。 .jar 和 .so 只允许从您的 Android 项目访问它们。