Android Studio 接入OpenCV最简单的例子 : 实现灰度图效果

1. 前言

上文 我们在Windows电脑上实现了人脸功能,接下来我们要把人脸识别的功能移植到Android上。

那么首先第一步,就是要创建一个NativeAndroid项目,并且配置好OpenGL,并能够调用成功。

这里我们使用的是openCV-4.8.0,官网下载地址 : https://opencv.org/releases/

也可以直接下载我上传的资源 : Android和Windows下,使用OpenCV实现人脸识别 示例 Demo

2. 创建Native Android项目

首选我们先来创建一个Native Android项目,这里选择 Native C++

输入项目名,这里我命名为MyOpenCVTest


C++ Stardard这里选择c++11,然后点击Finish,项目就创建成功了。

3. 配置OpenCV

接着,我们需要在项目中配置好OpenCV

3.1 配置build.config

app下的build.configcmake闭包中,指定abiFilters arm64-v8aarmeabi-v7a,注意这里arguments需要配置-DANDROID_STL=c++_sharedcppFlags-std=c++11

groovy 复制代码
defaultConfig
	//省略了代码...
	
	externalNativeBuild {
	     cmake {
	         cppFlags "-std=c++11"
	         abiFilters 'arm64-v8a','armeabi-v7a'
	         arguments "-DANDROID_STL=c++_shared"
	     }
	 }
 }

jniLibs目录指定为libs

groovy 复制代码
android {
	//...省略了代码

	sourceSets {
	    main {
	        jniLibs.srcDirs = ['libs']
	    }
	}
}

3.2 解压 opencv-4.8.0-android-sdk.zip

解压opencv-4.8.0-android-sdk.zip,在opencv-4.8.0-android-sdk\OpenCV-android-sdk\sdk\native\libs中可以看到arm64-v8aarmeabi-v7a

arm64-v8aarmeabi-v7a复制到我们Android项目的app/lib目录下

3.3 解压 opencv-4.8.0-windows.exe

打开并安装opencv-4.8.0-windows.exe(其实是解压了该文件到指定目录),在解压后的目录中,比如我这里是D:\Developer\opencv4.8.0\opencv\build,可以看到include文件夹

3.4 复制include头文件

include文件夹复制到Android项目中的app\src\main\cpp文件夹

3.5 配置 CMakeLists.txt

修改app\src\main\cpp\CMakeLists.txt,将头文件和库文件导入,注意这里target_link_libraries不仅要导入opencv_java4,还要导入android这个库 (系统自带) ,后面会用到。

c 复制代码
#导入头文件
include_directories(include)

#导入库文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../../../libs/${ANDROID_ABI}")

target_link_libraries(
        myopencvtest
        opencv_java4
        ${log-lib}
        android)

这里 CMAKE_CXX_FLAGS 用来设置特定的编译选项给C++编译器
-L 参数在 CMAKE_CXX_FLAGS 中用于指定链接器在链接时搜索库文件的路径。也就是说,如果你的项目中使用了一些库文件,并且这些库文件不在系统默认的库文件搜索路径下,你就需要使用 -L 参数来告诉链接器去哪里找这些库文件。
${CMAKE_SOURCE_DIR}路径为E:/WorkSpace/Demo/OpenCV/Android/MyOpenCVTest/app/src/main/cpp,所以我们需要使用../../../定位到app下,然后再通过libs/${ANDROID_ABI}进入到libs目录下的具体ANDROID_ABI下。

CMakeLists.txt完整代码如下所示

c 复制代码
cmake_minimum_required(VERSION 3.22.1)

project("myopencvtest")

add_library(
        myopencvtest
        SHARED
        native-lib.cpp)

#导入头文件
include_directories(include)

#导入库文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../../../libs/${ANDROID_ABI}")

find_library( # Sets the name of the path variable.
        log-lib
        log)

target_link_libraries(
        myopencvtest
        opencv_java4
        ${log-lib}
        android)

3.6 cpp中声明opencv引用

接着,在native-lib.cpp中引入opencv2/opencv.hpp

cpp 复制代码
#include "opencv2/opencv.hpp"

运行项目,项目正常运行,说明OpenCV配置成功了。

4. 使用OpenCV将图片转化为灰度图

在我的Visual Studio 2022 cmake配置opencv开发环境这篇博客里,最后通过调用OpenCVcvtColor方法,显示出了灰白色的图片,我们现在把这个功能移植到android中。

实现的功能 : 从sd卡中读取一张图片,然后将其转变为灰度图,并保存在sd

4.1 创建指定文件夹

首先我们在MainActivity里添加这样几行代码,然后app跑起来运行一次,这会创建sdcard/Android/data/包名/files这个文件夹

kotlin 复制代码
val dir = getExternalFilesDir("")
if (!dir!!.exists()) {
    dir!!.mkdirs()
}

4.2 将图片复制到该文件夹下

我们要把一张图片复制到sdcard/Android/data/包名/files目录下,重命名为img1.jpg

4.3 实现cpp代码

然后修改stringFromJNI这个JNI方法,修改为如下所示的代码。

  • 注意这里的路径,需要改成你项目中的实际路径
  • 注意这里的com_heiko_myopencvtest_MainActivity需要和你实际的包名和类名相匹配
cpp 复制代码
#include <jni.h>
#include <string>
#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

extern "C" JNIEXPORT jstring JNICALL
Java_com_heiko_myopencvtest_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {
    string hello = "文件已经保存至";
    char *result = new char[100];
    string opencvOutPath = "/sdcard/Android/data/com.heiko.myopencvtest/files/img_gray.jpg";
    Mat mat = imread("/sdcard/Android/data/com.heiko.myopencvtest/files/img1.jpg");
    Mat grayMat;
    cvtColor(mat, grayMat, COLOR_BGR2GRAY);
    imwrite(opencvOutPath, grayMat);
    strcat(result, hello.c_str());
    strcat(result, opencvOutPath.c_str());
    jstring return_str = env->NewStringUTF(result);
    delete result;
    return return_str;
}

4.4 运行项目

运行项目,提示文件已经保存至/sdcard/Android/data/com.heiko.myopencvtest/files/img_gray.jpg

然后我们到这个文件夹下查看下,可以看到多了一张灰色的图片img_gray.jpg

至此,我们就在Android上完成OpenCV的接入了,下一篇文章我们来看一下怎么在Android中使用OpenCV实现人脸识别。

5. OpenCV系列文章

Visual Studio 2022 cmake配置opencv开发环境_opencv visualstudio配置_氦客的博客-CSDN博客

在Visual Studio上,使用OpenCV实现人脸识别_氦客的博客-CSDN博客

Android Studio 接入OpenCV,并实现灰度图效果_氦客的博客-CSDN博客

Android 使用OpenCV实现人脸识别_氦客的博客-CSDN博客 (待更新)

相关推荐
冬奇Lab9 分钟前
ANR实战分析:一次audioserver死锁引发的系统级故障排查
android·性能优化·debug
冬奇Lab14 分钟前
Android车机卡顿案例剖析:从Binder耗尽到单例缺失的深度排查
android·性能优化·debug
ZHANG13HAO1 小时前
调用脚本实现 App 自动升级(无需无感、允许进程中断)
android
圆号本昊2 小时前
【2025最新】Flutter 加载显示 Live2D 角色,实战与踩坑全链路分享
android·flutter
小曹要微笑2 小时前
MySQL的TRIM函数
android·数据库·mysql
mrsyf4 小时前
Android Studio Otter 2(2025.2.2版本)安装和Gradle配置
android·ide·android studio
DB虚空行者4 小时前
MySQL恢复之Binlog格式详解
android·数据库·mysql
liang_jy6 小时前
Android 事件分发机制(一)—— 全流程源码解析
android·面试·源码
颖风船6 小时前
膨胀腐蚀及底层实践,拒绝opencv,matlab等方式
前端·opencv·matlab
峥嵘life7 小时前
2026 Android EDLA 认证相关资源网址汇总(持续更新)
android·java·学习