使用方法

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. Spring Boot 项目自定义 banner

    前言 我们在启动 Spring Boot 项目时,控制台会打印出 Spring Boot 专属的标语,也称 banner(横幅标语/广告),效果如下: 实际上,上面这个 banner,我们可以自定义, ...

  2. 从0到1搭建redis6.0.7续更~

    "心有所向,日复一日,必有精进" 前言: 想必大家看完我之前写的搭建redis服务器,大家都已经把redis搭建起来了吧如果没有搭建起来的小可爱请移步这里哦从0到1搭建redis6 ...

  3. C#一个16进制数用二进制数表示是几位?

    1个字节是8位,二进制8位:xxxxxxxx 范围从00000000-11111111,表示0到255.一位16进制数(用二进制表示是xxxx) 最多只表示到15(即对应16进制的F),要表示到255 ...

  4. Go语言核心36讲45

    你好,我是郝林,我今天继续分享bufio包中的数据类型. 在上一篇文章中,我提到了bufio包中的数据类型主要有Reader.Scanner.Writer和ReadWriter.并着重讲到了bufio ...

  5. 【云原生 · Docker】Docker入门、安装配置

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying Docker入门.安装配置 1. Docker入门简介 2. Docker虚拟化特点 3. ...

  6. Redis集群研究和实践(基于redis 3.2.5)(一)

    前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到广泛的使 用. Redis在2015年发布了3.0.0,官方支持了redis cluster.至此结束了redis ...

  7. 【SQL进阶】【REPLACE/TIMESTAMPDIFF/TRUNCATE】Day01:增删改操作

    一.插入记录 1.插入多条记录 自己的答案: INSERT INTO exam_record(uid, exam_id, start_time, submit_time, score) VALUES ...

  8. 创建第一个WebService项目

    前提: 保证联网的情况下创建webservice实例,需下载依赖jar 一.创建WebService服务端 1.创建服务端的工程 2.创建javaee的WebServices服务 3.命名server ...

  9. 《HTTP权威指南》– 3.HTTP方法和状态码

    常见HTTP方法: 常用HTTP方法 描述 是否包含主体 GET 从服务器获取一份文档 否 HEAD 只从服务器获取文档的首部 否 POST 向服务器发送需要处理的数据 是 PUT 将请求的主体部分存 ...

  10. [Webcast]Silverlight探秘系列课程

    Silverlight探秘系列课程(1):创建第一个Silverlight应用视频:http://download.microsoft.com/download/B/7/1/B71CA32C-163D ...