【Android】Android 源码方式使用 opencv 库文件
使用方法
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 库文件的更多相关文章
- 源码方式安装 lrzsz库
源码方式安装 lrzsz库:https://www.cnblogs.com/cocoajin/p/11731787.html 我们都知道安装了lrzsz工具的linux系统环境,在shell里可以非常 ...
- 源码方式安装 lrzsz 库
我们都知道安装了lrzsz工具的linux系统环境: 在shell里可以非常方便的上传和下载linux里面的文件: 通常的安装方式: yum install lrzsz sudo apt-get in ...
- 树莓派学习笔记—— 源码方式安装opencv
0.前言 本文介绍怎样在树莓派中通过编译源码的方式安装opencv,并通过一个简单的样例说明怎样使用opencv. 很多其它内容请參考--[树莓派学习笔记--索引博文] 1.下载若干依 ...
- 树莓派学习:源码方式安装opencv
1:下载若干依赖项: 更新软件源:sudo apt-get update/upgrade; 依次安装一下依赖项: sudo apt-get install build-essential su ...
- 【转】编译Android系统源码和内核源码
原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...
- FW 编译Android系统源码和内核源码
编译Android系统源码和内核源码 分类: Android2014-07-21 20:58 7287人阅读 评论(28) 收藏 举报 好长时间没有写blog了,之所以没有写,主要还是工作上的事,发现 ...
- 又来一波!Android精品源码分享
今天又汇总了几个不错的源码给大家!希望能帮到需要的小伙伴~话不多少,直接上源码! 1.Android精品源码:拖动条控件实现源码 此次分享的源码是一个不错的Android控件,建议大家可以细致的看下. ...
- 将Android系统源码导入Android studio的方法
Android源码目录结构如下: |-- Makefile|-- abi (applicationbinary interface,应用程序二进制接口,生成libgabi++.so相关库文件)|-- ...
- Android FrameWork 学习之Android 系统源码调试
这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...
- 编译Android系统源码和内核源码
[日期:2016-01-11] 来源:Linux社区 作者:jiangwei [字体:大 中 小] 把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...
随机推荐
- 测试开发jmeter forEach控制器
测试开发jmeter forEach控制器 forEach控制器的使用场景:主要是对大量数据轮询就行接口请求 forEach控制器的使用前提:将数据进行参数化 测试开发jmeter forEach控制 ...
- springboot整合mybatis步骤以及错误集合
1.首先在springboot项目中的pomx文件引入官方的依赖 <groupId>org.mybatis.spring.boot</groupId> <artifact ...
- VBA---Basic
题记: 之前用VBA做过几个小工具,用来实现办公自动化的.在编写过程中也遇到了一些问题,但最终都通过网友们的分享予以解决,现对其中的一些知识点进行总结. common sense 取消文件刷新: Ap ...
- LabVIEW+OpenVINO在CPU上部署新冠肺炎检测模型实战
前言 之前博客:[YOLOv5]LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来给大家介绍了在LabVIEW上使用openvino加速推理,在CPU上也能感受丝滑的实时物体识别.那我 ...
- AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- C#串口初始化
//通信端口 string[] PortList = SerialPort.GetPortNames(); if (PortList.Length > 0) { this.cmb_Port.Da ...
- 使用CRD扩展Kubernetes API
本文是如何创建 CRD 来扩展 Kubernetes API 的教程.CRD 是用来扩展 Kubernetes 最常用的方式,在 Service Mesh 和 Operator 中也被大量使用.因此读 ...
- EntityUtils MapStruct BeanCopier 数据实体类转换工具 DO BO VO DTO 附视频
一.序言 在实际项目开发过程中,总有数据实体类互相转换的需求,DO.BO.VO.DTO等数据模型转换经常发生.今天推荐几个好用的实体类转换工具,分别是EntityUtils MapStruct Bea ...
- Java 中你绝对没用过的一个关键字?
layout: post categories: Java title: Java 中你绝对没用过的一个关键字? tagline: by 子悠 tags: 子悠 前面的文章给大家介绍了如何自定义一个不 ...
- 高效率开发Web安全扫描器之路(一)
一.背景 经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞,一直好奇它们怎么能挖到这么多漏洞,开始还以为它们不上班除了睡觉就挖漏洞,后来有机会认识了一些大佬,发现它们大部分漏洞其实是通过工具挖 ...