Android 在自己的项目中接入OpenCV+YOLOv8+NCNN : 实现人像分割

news/2024/7/11 1:32:39 标签: android, opencv, YOLO, 人像分割, 人体识别, NCNN, YOLO8

1. 前言

通过前两篇文章 Android 导入ncnn-android-yolov8-seg : 实现人体识别人像分割 、Android ncnn-android-yolov8-seg源码解析 : 实现人像分割 ,我们已经跑起来了程序,也分析了其源码。
接下来,这篇文章我们来实战一下,抽取出Demo的核心代码,在自己的项目中,使用Java层的Camera API,在JNI层使用OpenCV+YOLOv8+NCNN,来实现人体识别人像分割功能。

实现效果如下,整个图像的是相机的原图,左上角部分,是我们进行人像识别、人像分割后,处理得到的图像 (未做镜像处理,所以暂时和原图左右是相反的)

在这里插入图片描述

>>> 本文的源码demo可以直接看这里 :
Android 基于 OpenCV+YOLOv8+NCNN 实现人像分割 Demo 源码下载

2. 新建项目

2.1 新建主项目

在这里插入图片描述

2.2 新建 Native library

在这里插入图片描述

2.3 在app中添加MyNcnnLib依赖

implementation(project(mapOf("path" to ":MyNcnnLib")))

2.4 配置NDK版本

记得在项目根目录下的local.properties中,配置NDK版本,这里的NDK版本需要在NDK16-NDK20之间

# 这里的路径需修改为你电脑中ndk的具体路径
ndk.dir=C\:\\Developer\\Android_SDK\\ndk\\20.0.5594570

YOLOv8NCNN_27">3. 接入OpenCV+YOLOv8+NCNN

NCNNOpenCV_28">3.1 导入NCNN和OpenCV

我们将ncnn-20221128-android-vulkanopencv-mobile-4.6.0-android复制到cpp文件夹下

在这里插入图片描述

3.2 复制cpp文件

yolo.cppyolo.h复制到cpp文件夹下
在这里插入图片描述

3.3 配置Cmake

新版Android StudioCMakeLists.txt的位置和Android Studio 3.6CMakeLists.txt的路径位置不一样,所以CMakeLists.txt在设置配置的时候,设置的路径也是不一样的。

初始的CMakeLists.txt

cmake_minimum_required(VERSION 3.22.1)


project("myncnnlib")


add_library(${
   CMAKE_PROJECT_NAME} SHARED
        myncnnlib.cpp)

target_link_libraries(${
   CMAKE_PROJECT_NAME}
        android
        log)

配置后的CMakeLists.txt

cmake_minimum_required(VERSION 3.22.1)

project("myncnnlib")

set(OpenCV_DIR ${
   CMAKE_SOURCE_DIR}/opencv-mobile-4.6.0-android/sdk/native/jni)

find_package(OpenCV REQUIRED core imgproc)

set(ncnn_DIR ${
   CMAKE_SOURCE_DIR}/ncnn-20221128-android-vulkan/${
   ANDROID_ABI}/lib/cmake/ncnn)

find_package(ncnn REQUIRED)

add_library(${
   CMAKE_PROJECT_NAME} SHARED
        myncnnlib.cpp
        yolo.cpp)

target_link_libraries(${
   CMAKE_PROJECT_NAME}
        ncnn
        camera2ndk
        mediandk
        ${
   OpenCV_LIBS}
        android
        log)

4. 创建JNI接口

4.1 新建JNI接口

NcnnNativeLib.kt中,新增两个JNI方法

/**
 * 初始化NCNN
 *
 * @return 是否成功
 */
external fun load(mgr: AssetManager, modelid: Int, cpugpu: Int): Boolean

/**
 * 人像检测
 *
 */
external fun detect(data: ByteArray?, width: Int, height: Int, cameraId: Int): ByteArray

4.2 cpp中增加对应JNIf方法

myncnnlib.cpp中,增加对应的JIN方法

extern "C"
JNIEXPORT jboolean JNICALL
Java_com_heiko_myncnnlib_NativeLib_load(JNIEnv *env, jobject thiz, jobject assetManager,
                                        jint modelid, jint cpugpu) {
   

}
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_heiko_myncnnlib_NativeLib_detect(JNIEnv *env, jobject thiz, jbyteArray data_,
                                          jint w, jint h, jint camera_id) {
   

}

4.3 声明include

#include <jni.h>
#include <string>
#include <platform.h>
#include <benchmark.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
#include "opencv2/opencv.hpp"
#include <string>
#include <iostream>
#include "yolo.h"

static Yolo *g_yolo = 0;
static ncnn::Mutex lock;

4.4 加载模型

这里将Demo中的loadModel中的代码,全部拷贝过来

extern "C"
JNIEXPORT jboolean JNICALL
Java_com_heiko_myncnnlib_NativeLib_load(JNIEnv* env, jobject thiz, jobject assetManager, jint modelid, jint cpugpu)
{
   
    if (modelid < 0 || modelid > 6 || cpugpu < 0 || cpugpu > 1)
    {
   
        return JNI_FALSE;
    }

    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);

    __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "loadModel %p", mgr);

    const char* modeltypes[] =
            {
   
                    

http://www.niftyadmin.cn/n/5076117.html

相关文章

四川竹哲电子商务有限公司抖音培训的靠谱选择

在今天的数字时代&#xff0c;抖音已经成为企业和个人必备的营销工具。然而&#xff0c;如何充分利用抖音的潜力&#xff0c;实现最大的营销效果&#xff0c;却让许多人感到困惑。四川竹哲电子商务有限公司正是为了解决这一问题而存在的。作为一家专业的抖音培训公司&#xff0…

人工智能5:构建基于iris 数据集的 SVM 分类模型,含有 iris.csv

内容:设计并实现一个简单的用于分类的SVI M,主要用于iris 分类。将iris数据集分为训综集和测试集,使用训练集训练得到SVM 分类模型,并使用模型预测测试集的类别归属。 实现思路及步骤如下。 (1)读取数据集,区分标签和数据。(2)标准化数据集。 (3)将数据集划分为训练集和测…

Compose 编译器版本和Kotlin版本对应关系

使用了最新的kotlin版本&#xff0c;compose报错&#xff0c;不兼容&#xff0c;在这里记录一下版本对应关系 值得注意的是Compose Kotlin 编译器扩展 (androidx.compose.compiler) 未关联到 Compose 库版本。相反&#xff0c;它会关联到 Kotlin 编译器插件的版本&#xff0c;…

浅谈安科瑞PZ系列多功能仪表在越南水电站的应用

摘要&#xff1a;用户侧用能的透明化、智能化、是当下用能管理的必然趋势。针对用户侧主要的用能节点&#xff0c;设计安装智能仪表&#xff0c;再通过后台系统来实时监控各用能回路的工作状态&#xff1b;并计量各个回路的用电量、用水量、用气量。通过实时监控用能以及相关电…

论文研读|Protecting Intellectual Property of Deep Neural Networks with Watermarking

目录 论文信息文章简介研究动机研究方法水印生成水印嵌入版权验证 实验结果有效性&#xff08;Effectiveness&#xff09;高效性&#xff08;Converge Speed&#xff09;保真度&#xff08;Functionality&#xff09;鲁棒性&#xff08;Robustness&#xff09;Anti-剪枝攻击&am…

DeepFace【部署 03】轻量级人脸识别和面部属性分析框架deepface在Linux环境下服务部署(conda虚拟环境+docker)

Linux环境下服务部署 1.使用虚拟环境[810ms]1.1 环境部署1.2 服务启动 2.使用Docker[680ms] 1.使用虚拟环境[810ms] 1.1 环境部署 Anaconda的安装步骤这里不再介绍&#xff0c;直接开始使用。 # 1.创建虚拟环境 conda create -n deepface python3.9.18# 2.激活虚拟环境 cond…

JavaScript进阶(二十三):立即执行函数(匿名函数)( ( ) { } ( ) )含义解析

文章目录 一、前言二、立即执行函数2.1 立即执行函数使用的场景 三、拓展阅读 一、前言 前端项目改造过程中&#xff0c;引入的工具类实现如下&#xff1a; var tensquared(function(x) {return x*x; }(10)); 拆解以上语句如下&#xff1a; var tensquared xx; 这是赋值语句…

Compose Navigation用于Android多module项目最佳实践

Compose Navigation用于Android多module项目最佳实践 在本文中&#xff0c;我们将采取同一个项目并扩展它以实现最佳实践。该项目具有文章、设置和关于屏幕的抽屉导航。项目的输出如下所示&#xff1a; 当你有一个多屏幕的项目时&#xff0c;每个屏幕至少必须有自己单独的模…