win10编译OpenCV4Android系列2

您所在的位置:网站首页 win10编译过的hadoop273 win10编译OpenCV4Android系列2

win10编译OpenCV4Android系列2

2024-03-10 17:57| 来源: 网络整理| 查看: 265

win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib 前言一、编译环境二、cmake编译1.生成Makefile2.使用mingw编译 三、编译问题问题1:undefined reference to `__imp_GetACP‘问题2:error: '::hypot' has not been declared

前言

本文是系列文章2,最终目标是使用jni封装so,在Android上直接调用OpenCV的微信二维码解码接口。 本机已有环境如下: 1,jdk-8u321-windows-x64.exe 2,android-sdk_r24.4.1-windows.zip 3,apache-ant-1.10.12-bin.zip 4,android-ndk-r18b-windows-x86_64.zip 本文需要的环境如下: 1,cmake-3.19.2-win64-x64 2,mingw-64\x86_64-8.1.0 3,opencv-4.5.2.zip 4,opencv_contrib-4.5.2.zip

一、编译环境

(1)编译环境需求 编译OpenCV4Android所需要的环境有:JDK、SDK、NDK、Ant,配置方式如系列文章1所示,其他必须的环境有cmake和mingw,这俩软件之前在本机已经配置过,所以不再描述配置过程,因为忘记了。。。 本机cmake版本:cmake-3.19.2-win64-x64,mingw环境如下: 在这里插入图片描述 (2)opencv源码 下载地址:opencv-4.5.2.zip和opencv_contrib-4.5.2.zip;下载后解压到相应的目录。 需要注意的是,我们下载的是源码Source code,而不是opencv-4.5.2-android-sdk.zip,因为官方编译的sdk不包含opencv_contrib的内容,我们要使用的就是opencv_contrib中的wechat_qrcode模块,而且还修改了源码,所以才有此编译。

在这里插入图片描述 在这里插入图片描述

二、cmake编译 1.生成Makefile

(1)双击打开cmake-gui.exe 在这里插入图片描述 (2)配置源码目录和编译目录 D:/Android/opencv-4.5.2是opencv源码所在目录,D:/Android/opencv_android是新建目录,用来保存所有编译结果。 在这里插入图片描述 (3)添加参数 点击Add Entry,添加如下变量:

ANDROID_ABI:armeabi-v7a ANDROID_SDK:D:/Android/android-sdk-windows ANDROID_NDK:D:/android-ndk-r18b ANT_EXECUTABLE:D:/Android/apache-ant-1.10.12/bin ANDROID_STL:c++_static

ANDROID_ABI:设置平台,根据需要armeabi-v7a或者armeabi等,当需要多个平台时,需要重新设置新的编译目录,编译完成后把结果合并在一起即可,可以参考官方SDK目录。 ANDROID_STL:默认的stl编译方式是gnustl_static,这个在高版本软件已经不适配,本文使用c++_static,还有一种c++_shared,根据需求设置。 (4)设置mingw编译 添加以上Entry后,点击Configure,选择MinGW Makefiles和toolchain交叉编译 在这里插入图片描述 在接下来出现的Specify the Toolchain file里选择NDK目录下的toolschain,而不是源码中的,据其他博主说,如果选择opencv源码中的toolschain,会出各种编译错误。。。 在这里插入图片描述 点击finish,出现以下结果,Java wrappers:必须是YES才可以,如果不是,可能勾选了BUILD_opencv_world,取消即可。 在这里插入图片描述 (5)参数调整 OPENCV_EXTRA_MODULES_PATH=D:/Android/opencv-4.5.2/opencv_contrib-4.5.2/modules 添加opencv_contrib,很重要,使用微信解码 BUILD_ANDROID_PROJECTS=ON BUILD_ANDROID_EXAMPLES=ON BUILD_PERF_TESTS=OFF BUILD_TESTS=OFF 这些测试模块,默认是ON,没有编译通过,猜想应该是本人在opencv中添加了自定义接口导致,改成OFF后通过 BUILD_opencv_world=OFF,这个opencv_word在早期的opencv中是没有的,特别是在windows上编译后会出现各个模块的dll,有了这个,最后只生成一个opencv_world.dll,很方便,在Android上,本人不知道跟java4.so有什么分别,默认OFF就OFF吧。 BUILD_SHARED_LIBS=OFF,默认值,编出来跟官方一致,不要修改成ON,否则会编出很多so,根据需要吧 WITH_OPENCL=ON (因为我们编译的是 android sdk,所以建议添加移动端的并行架构支持) WITH_OPENCL_SVM=ON (建议开启共享虚拟内存) 调整完后再次Configure,完成后点击Generate 在这里插入图片描述

参数调整参考了博文https://www.cnblogs.com/zhxmdefj/p/13094954.html,表示感谢。

2.使用mingw编译

(1)使用管理员权限打开cmd(官方不建议使用cygwin) cd到编译输出目录,在这里是D:/Android/opencv_android,然后执行mingw32-make 在这里插入图片描述 在这里插入图片描述

如果如上图没有报错,再输入mingw32-make install 在这里插入图片描述 在这里插入图片描述 install成功后,SDK被安装在D:\Android\opencv_android\install目录下,可以对比下官方目录基本一致,多了opencv_contrib模块的内容。 在这里插入图片描述

三、编译问题 问题1:undefined reference to `__imp_GetACP‘

好像只有opencv_contrib 4.5.2这个版本才会遇到这个问题,解决办法: 1,找到opencv_contrib\modules\wechat_qrcode\src\zxing\zxing.hpp,将第30行的

#if defined(__ANDROID_API__)

改为

#if defined(__ANDROID_API__) || defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)

2,注释第54到第62行的内容:

#if defined(_MSC_VER) #ifndef NO_ICONV #define NO_ICONV #endif #endif

3,保存后,在cmake中重新configure和generate,再继续之后的步骤即可 解决办法来源:https://blog.csdn.net/coolermzb3/article/details/116278830

问题2:error: ‘::hypot’ has not been declared

1,找到文件C:\Program Files\mingw-64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\cmath然后添加

#define _hypot hypot

2,保存后重新编译 在这里插入图片描述 解决办法来源:https://blog.csdn.net/weixin_37993251/article/details/88054384 感谢以上两位博主!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3