网上的OpenCV配置环境大部分都不能正常配置成功,不是编译时报找不到so,就是运行找不到so.本文是我试了不少坑才找到的配置方法.其原理是让AndroidStudio自己根据mk文件自动配置.

1.下载OpenCV

先去OpenCV官网下载OpenCV的Android版本.速度慢的可以用迅雷下载.

OpenCV4.5.5

下载完成之后解压到文件夹

2.AndroidStudio新建C++项目

新建项目选择nativeC++模板.

C++标准选默认就好了

创建完成之后如果以前没配置过NDK可能会报错.

打开 Project Structue

切换到 SDK Location标签下,选择一个已安装的NDK即可.

如果没有NDK可供选择,需要先下载NDK.打开 SDK Manager

选择一个合适的版本下载就好,建议不要下载最新版本.

3.配置OpenCV开发环境

在配置OpenCV开发环境之前,可以安装运行一下看一下有没有报错,第一次运行会有较长加载so库的时间.

3.1配置include头文件

找到之前解压好的opencv-4.5.5-android-sdk文件夹,复制下面的 OpenCV-android-sdk\sdk\native\jni\include文件夹到 src/main/cpp文件夹下.

3.2配置CMakeLists.txt文件

将以下内容复制替换到 cpp/CMakeLists.txt 注意将里面的opencv路径替换为自己电脑上的路径.注意斜杆

cmake_minimum_required(VERSION 3.4.1)

# ##################### OpenCV 环境 ############################
#设置OpenCV-android-sdk路径,替换为自己电脑上的路径,注意是双斜杠或者反斜杠
set( OpenCV_DIR D:\\Develop\\OpenCV\\opencv-4.5.5-android-sdk\\OpenCV-android-sdk\\sdk\\native\\jni ) find_package(OpenCV REQUIRED )
if(OpenCV_FOUND)
include_directories(${OpenCV_INCLUDE_DIRS})
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
else(OpenCV_FOUND)
message(FATAL_ERROR "OpenCV library not found")
endif(OpenCV_FOUND) # ###################### 项目原生模块 ########################### add_library( native-lib
SHARED
native-lib.cpp
) #jnigraphics是Android bitmap处理库,如果需要在JNI处理bitmap对象,需要添加引用
target_link_libraries( native-lib
${OpenCV_LIBS}
log
jnigraphics)

4.验证OpenCV是否配置成功

4.1验证头文件是否配置成功

重新build之后打开 native-lib.cpp 导入OpenCV的头文件.如果有提示说明头文件配置成功.

4.2验证OpenCV库是否正确链接到

打开 native-lib.cpp 找到默认生成的stringFromJNI方法

extern "C" JNIEXPORT jstring JNICALL
Java_komine_demos_opencvdemo_MainActivity_stringFromJNI(JNIEnv* env,jobject thiz) {
//添加这行声明
cv::Mat mat;
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}

运行如果没有报错说明OpenCV配置成功

4.3简单使用OpenCV进行图片处理

首先在 MainActivity中声明一个processImage native方法,新版AndroidStudio再也不需要通过javah去生成头文件了,

直接 Alt + Enter生成native的方法声明,我的AndroidStudio版本是3.6.3,高于3.0的应该都能自动生成.

为了更方便使用OpenCV的类,可以导入cv命名空间

//写在include语句的下方
using namespace cv;

native实现

extern "C"
JNIEXPORT void JNICALL
Java_komine_demos_opencvdemo_MainActivity_processImage(JNIEnv *env, jobject thiz,jstring image_path,jstring outPath) {
//将jstring转换为const char*
const char* path = env->GetStringUTFChars(image_path,NULL);
const char* imageOutPath = env->GetStringUTFChars(outPath,NULL); //读取mat对象
Mat sourceMat = imread(path);
//灰度mat
Mat grayMat; //将图片转换为灰度图
cvtColor(sourceMat,grayMat,COLOR_BGR2GRAY); //将图片写入到文件
imwrite(imageOutPath,grayMat);
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示灰度图"
android:onClick="loadGrayImage"
/> </LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {
private ImageView mImageView;
private String mOutputPath; static {
System.loadLibrary("native-lib");
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mImageView = findViewById(R.id.image); //注意读写权限,或者将图片upload到files目录
String sourcePath = Environment.getExternalStorageDirectory() + File.separator + "miku.png";
mOutputPath = Environment.getExternalStorageDirectory() + File.separator + "miku_gray.png"; processImage(sourcePath,mOutputPath);
} public void loadGrayImage(View view) {
mImageView.setImageBitmap(BitmapFactory.decodeFile(mOutputPath));
} public native void processImage(String imagePath,String outPath);
}

效果图

Android配置OpenCV C++开发环境的更多相关文章

  1. [Android] 环境配置之基础开发环境(SDK/Android Studio)(转)

    [Android] 环境配置之基础开发环境(SDK/Android Studio)   博客: blog.csdn.net/qiujuer 网站: www.qiujuer.net 开源库: Geniu ...

  2. Android Studio C/C++开发环境配置

    Android Studio C/C++开发环境配置  我的开发环境 : Win 10 + android studio 1.5   一, 安装NDK 开发环境: 1.  Settings -> ...

  3. Eclipse+ADT+Android SDK 搭建安卓开发环境

    Eclipse+ADT+Android SDK 搭建安卓开发环境   要求 必备知识 windows 7 基本操作. 运行环境 windows 7(64位); eclipse-jee-luna-SR2 ...

  4. 解决 Ubuntu 18.10 使用较新的独立显卡输出无法初始化图形界面并配置深度学习开发环境

    原文地址:解决 Ubuntu 18.10 使用较新的独立显卡输出无法初始化图形界面并配置深度学习开发环境 0x00 配置 硬件 OS: Ubuntu 18.10 Base Board: ASUS WS ...

  5. [webpack] 配置react+es6开发环境

    写在前面 每次开新项目都要重新安装需要的包,简单记录一下. 以下仅包含最简单的功能: 编译react 编译es6 打包src中入口文件index.js至dist webpack配置react+es6开 ...

  6. EditPlus+VisualStudio配置VC简易开发环境环境

         对于C++开发, 我想在Windows下大家用的最多的应该是MS的VC++.但其强大的功能背后却有着"启动速度慢","占用资源多"的缺点,尤其是VS后 ...

  7. Ubuntu下配置C/C++开发环境

    在 Ubuntu 下配置 C/C++ 开发环境 转自:白巴的临时空间 Submitted by 白巴 on 2009-04-27 19:52:12. 学习笔记 虽然 Ubuntu 的版本已经是9.04 ...

  8. 在VMware虚拟机中配置DOS汇编开发环境!!

    操作系统:win7 32位 DOS环境:DosBox  下载:http://www.dosbox.com/ 选择当前适合自己版本,下载就可以了. 汇编编译器:MASM 5.0 下载:http://do ...

  9. 在windows下用eclipse + pydev插件来配置python的开发环境

    在windows下用eclipse + pydev插件来配置python的开发环境 一.安装 python 可以到网上下个Windows版的python,官网为:https://www.python. ...

随机推荐

  1. 方法(method)

    方法是可以完成某个特定的功能,并且可以重复利用的代码片段...C中叫为函数 方法定义在类体中,不可定义在主方法下. 一个方法执行完就会被释放, 提高代码的复用性 相同的业务逻辑就可以不用重复,,,,因 ...

  2. CVPR2022 | 弱监督多标签分类中的损失问题

    前言 本文提出了一种新的弱监督多标签分类(WSML)方法,该方法拒绝或纠正大损失样本,以防止模型记忆有噪声的标签.由于没有繁重和复杂的组件,提出的方法在几个部分标签设置(包括Pascal VOC 20 ...

  3. OpenCloudOS使用snap安装.NET 6

    开源操作系统社区 OpenCloudOS 由腾讯与合作伙伴共同倡议发起,是完全中立.全面开放.安全稳定.高性能的操作系统及生态.OpenCloudOS 沉淀了多家厂商在软件和开源生态的优势,继承了腾讯 ...

  4. SAP Grid control( ALV Grid 列表 自定义 按钮)

    ALV 列表和按钮 效果 源代码 PROGRAM bcalvc_tb_menu_with_def_but. *&&&&&&&&& ...

  5. 合宙Air32F103CBT6开发板上手报告

    2022年6月初合宙新上市了 Air32F103 系列 MCU, 市面上 STM32F103 的克隆军队又增加了新的一员. 这次不知道是哪家的贴牌, 分 Air32F103CBT6 和 Air32F1 ...

  6. oracle-安装与访问、卸载

    安装oracle 官网(http://oracle.com/ )下载oracle -->Oracle Database -->点击接受Accept --> 下载11g(Downloa ...

  7. 利用websocket实现手机扫码登陆后,同步登陆信息到web端页面

    新手必看 广播系统 事件系统 准备工作 初始化项目 引入 laravel-websockets 软件包 启动 websocket 监听 主要流程 创建两个页面 建立 socket 连接 手机端扫码登陆 ...

  8. [ZJCTF 2019]NiZhuanSiWei 1

    考察知识点:反序列化.php伪协议 1.打开之后获得源码信息,如下: <?php $text = $_GET["text"]; $file = $_GET["fil ...

  9. YYYYMMdd和yyyyMMdd的区别

    YYYYMMdd的 YYYY 是表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年.比如今天是2021-12-29 星期三,然后本周六是2022-01-01,存 ...

  10. nginx服务器配置传递给下一层的信息的一些参数-设置哪些跨域的域名可访问

    http { server_tokens off; #隐藏nginx版本 proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_si ...