使用方法

opencv 官方的 SDK 已经有编译好的 so 库,我们可以直接使用,因此我们只需要将平台架构对应的 so 库文件以及头文件提取出来,使用 Android.mk 进行预安装,然后在需要使用 opencv 程序中的 Android.mk 引用头文件和动态链接库即可。

具体步骤

一、下载 opencv sdk 并解压(我这里以 3.4.11 为例)

下载链接1:https://opencv.org/releases/
下载链接2:https://udomain.dl.sourceforge.net/project/opencvlibrary/3.4.11/opencv-3.4.11-android-sdk.zip

二、提取相应的文件放置在Android源码指定的路径中,并编写 Android.mk 文件

1. 在 Android 源码中的 external 目录下创建 opencv_3.4.11 文件夹,并在 opencv_3.4.11 文件再创建 library 文件夹。

2. 将 opencv-3.4.11-android-sdk\OpenCV-android-sdk\sdk\native\libs 下面的 armeabi、armeabi-v7a、arm64-v8a 拷贝到 external\opencv_3.4.11\library(可以只拷贝适合所使用CPU架构的文件夹)

3. 在该目录下创建 Android.mk 并写入以下内容:(根据所使用的平台来选择用哪一段)

LOCAL_PATH := $(call my-dir)

# 第5代、第6代的ARM处理器
#include $(CLEAR_VARS)
#LOCAL_MODULE := libopencv_java3
#LOCAL_SRC_FILES := library/armeabi/libopencv_java3.so
#LOCAL_MODULE_CLASS := SHARED_LIBRARIES
#LOCAL_MODULE_SUFFIX := .so
#include $(BUILD_PREBUILT) # 第7代的32位ARM 处理器
include $(CLEAR_VARS)
LOCAL_MODULE := libopencv_java3
LOCAL_SRC_FILES := library/armeabi-v7a/libopencv_java3.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(BUILD_PREBUILT) # 第8代的64位ARM处理器
#include $(CLEAR_VARS)
#LOCAL_MODULE := libopencv_java3
#LOCAL_SRC_FILES := library/arm64-v8a/libopencv_java3.so
#LOCAL_MODULE_CLASS := SHARED_LIBRARIES
#LOCAL_MODULE_SUFFIX := .so
#include $(BUILD_PREBUILT)

4. 使用 mm 命令编译即可(我这里就不贴出来了),目录结构如下:

三、编写测试应用程序进行测试

Android.mk

###################### 全局定义 ########################

LOCAL_PATH:= $(call my-dir)

COMMON_C_INCLUDES_FILES	 := bionic external/stlport/stlport
COMMON_SHARED_LIBRARIES := libc libstlport libutils liblog libcutils libskia libandroid_runtime COMMON_LOCAL_CFLAGS := -fstack-protector-all -fomit-frame-pointer -Depl_LINUX
COMMON_LOCAL_CPPFLAGS := -std=c++11 OPENCV_SHARED_LIBRARIES := libopencv_java3
OPENCV_C_INCLUDES_FILES := external/opencv_3.4.11/include ###################### 编译 Exe ######################## include $(CLEAR_VARS) # 引入公共库
LOCAL_C_INCLUDES := $(COMMON_C_INCLUDES_FILES) $(OPENCV_C_INCLUDES_FILES)
LOCAL_SHARED_LIBRARIES := $(COMMON_SHARED_LIBRARIES) $(OPENCV_SHARED_LIBRARIES)
LOCAL_CFLAGS := $(COMMON_LOCAL_CFLAGS)
#LOCAL_CPPFLAGS := $(COMMON_LOCAL_CPPFLAGS)
LOCAL_LDLIBS += -llog -lz -lm LOCAL_SRC_FILES := bin/main.cpp
LOCAL_MODULE_TAGS := debug eng
LOCAL_MODULE := opencv_test
include $(BUILD_EXECUTABLE)

mian.cpp


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> #define CV_CXX_STD_ARRAY 0
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp" //OpenCV 图像处理头文件 using namespace cv; // 包含 cv 命名空间
using namespace std; int main()
{
// 读取图片
Mat src = imread("/data/1.jpg", 1);
Mat dst; // 彩色转为灰度图片
cvtColor(src,dst,CV_BGR2GRAY);
imwrite("/data/2.jpg",dst); src.release();
dst.release(); return 0;
}

编译完成之后,记得要将 libopencv_java3.so 通过 adb push 到设备的 /system/lib/ 目录下,如果编译整个固件烧录就不需要了。

四、转换效果

过程问题

一、array头文件找不到问题:include/opencv2/core/cvdef.h:639:21: fatal error: array: No such file or directory

从编译错误信息和 cvdef.h 源码位置,是因为没有定义 CV_CXX_STD_ARRAY 宏,而包含了 <array> 头文件,由于 Android 源码对 C++ 标准库支持的不是很好,我也花了不少时间去寻找相关资料,暂时未能找到更好的办法,因此我这边的解决方案就是在应用程序包含 opencv 头文件前,先定义 CV_CXX_STD_ARRAY 宏,并设置该宏为 0,使之不走包含 array 头文件的路径。

......
#define CV_CXX_STD_ARRAY 0 // 解决编译时报找不到 array 头文件的错误
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
......

二、initializer_list 头文件找不到的问题:include/opencv2/core/matx.hpp:57:28: fatal error: initializer_list: No such file or directory

这个问题也是一样的,只需要将 Android.mk 中的 LOCAL_CPPFLAGS 变量取消掉 -std=c++11 即可。

###################### 全局定义 ########################

LOCAL_PATH:= $(call my-dir)
......
COMMON_LOCAL_CPPFLAGS := -std=c++11
...... ###################### 编译 Exe ######################## include $(CLEAR_VARS)
......
# 注释或者删除下面这一句
#LOCAL_CPPFLAGS := $(COMMON_LOCAL_CPPFLAGS)
......
include $(BUILD_EXECUTABLE)

上面的编译报错的这两个问题,都应该与 opencv 本身没有关系,猜测应该是跟 Android 4.4 源码对 C++ 支持不够全的问题,很早之前我就发现 Android 源码去编译自己在 Linux 可以正常编译的 C++ 源代码,就会报很多和上述两个问题类似的缺失头文件错误。虽然源码中搜索能找到 array 头文件定义,但是却不能直接引用,苦寻不得其果,无奈暂且放下。若能解决的话,在 Android 不受限制的使用 C++ 写的源代码,还是非常爽的。

【Android】Android 源码方式使用 opencv 库文件的更多相关文章

  1. 源码方式安装 lrzsz库

    源码方式安装 lrzsz库:https://www.cnblogs.com/cocoajin/p/11731787.html 我们都知道安装了lrzsz工具的linux系统环境,在shell里可以非常 ...

  2. 源码方式安装 lrzsz 库

    我们都知道安装了lrzsz工具的linux系统环境: 在shell里可以非常方便的上传和下载linux里面的文件: 通常的安装方式: yum install lrzsz sudo apt-get in ...

  3. 树莓派学习笔记—— 源码方式安装opencv

    0.前言     本文介绍怎样在树莓派中通过编译源码的方式安装opencv,并通过一个简单的样例说明怎样使用opencv.     很多其它内容请參考--[树莓派学习笔记--索引博文] 1.下载若干依 ...

  4. 树莓派学习:源码方式安装opencv

    1:下载若干依赖项: 更新软件源:sudo apt-get update/upgrade; 依次安装一下依赖项:   sudo apt-get install build-essential   su ...

  5. 【转】编译Android系统源码和内核源码

    原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...

  6. FW 编译Android系统源码和内核源码

    编译Android系统源码和内核源码 分类: Android2014-07-21 20:58 7287人阅读 评论(28) 收藏 举报 好长时间没有写blog了,之所以没有写,主要还是工作上的事,发现 ...

  7. 又来一波!Android精品源码分享

    今天又汇总了几个不错的源码给大家!希望能帮到需要的小伙伴~话不多少,直接上源码! 1.Android精品源码:拖动条控件实现源码 此次分享的源码是一个不错的Android控件,建议大家可以细致的看下. ...

  8. 将Android系统源码导入Android studio的方法

    Android源码目录结构如下: |-- Makefile|-- abi (applicationbinary interface,应用程序二进制接口,生成libgabi++.so相关库文件)|-- ...

  9. Android FrameWork 学习之Android 系统源码调试

    这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...

  10. 编译Android系统源码和内核源码

    [日期:2016-01-11] 来源:Linux社区  作者:jiangwei [字体:大 中 小]     把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...

随机推荐

  1. 死磕面试系列,Java到底是值传递还是引用传递?

    Java到底是值传递还是引用传递? 这虽然是一个老生常谈的问题,但是对于没有深入研究过这块,或者Java基础不牢的同学,还是很难回答得让人满意. 可能很多同学能够很轻松的背出JVM.分布式事务.高并发 ...

  2. Flask框架:如何运用Ajax轮询动态绘图

    摘要:Ajax是异步JavaScript和XML可用于前后端交互. 本文分享自华为云社区<Flask框架:运用Ajax轮询动态绘图>,作者:LyShark. Ajax是异步JavaScri ...

  3. 阿里技术专家详解 DDD 系列- Domain Primitive

    简介: 关于DDD的一系列文章,希望能继续在总结前人的基础上发扬光大DDD的思想,但是通过一套我认为合理的代码结构.框架和约束,来降低DDD的实践门槛,提升代码质量.可测试性.安全性.健壮性. 作者| ...

  4. golang面向对象

    一.方法 1.方法是作用在指定的数据类型上,和指定的数据类型绑定,因此自定义类型都可以有方法,而不仅仅是struct: 2.方法的申明和格式调用: package main import ( &quo ...

  5. Android Studio打开时报错if you already hava 64-bit JDK installed,define a JAVA_HOME

    出现这个问题不知道改了什么导致的,卸载了重新安装也是不行. 以及到高级设置中进行配置jdk也是无效, 解决方法为需要在路径 C:\Users\你自己的用户名\AppData\Roaming\Googl ...

  6. hexo-gitalk-评论自动初始化

    第一步 申请Personal Access Token 从 Github 的 Personal access tokens 页面,点击 Generate new token 第二步 安装项目依赖 np ...

  7. 互联网最全cka真题解析-2022

    1.CKA真题解析kubectl自动补全及帮助信息1.配置kubectl自动补全apt install bash-completion source <(kubectl completion b ...

  8. Docker进阶-Dockerfile建立一个自定义的镜像执行自定义进程

    前言 docker对我来说是一个很方便的工具,,上一篇文章也写了docker基本的一些使用,这篇文章重点描述一下Dockerfile的使用,从零建立一个自己定制化的镜像,并可以执行我们需要的任务. 作 ...

  9. 02.JavaScript学习笔记1

    1.强制类型转换 当使用加号进行运算时,会将数字强制转换为字符串,然后再进行运算. const year = '1991'; console.log(year + 18); console.log(t ...

  10. 连接MySql时提示%d format: a number is required, not str

    代码: sql = "select * from appelementinfo" coon = pymysql.connect(user='root', password='', ...