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

news2024/11/26 3:05:27

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

3. 接入OpenCV+YOLOv8+NCNN

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.coloradmin.cn/o/1075638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频账号矩阵源码saas开发-----

短视频矩阵系统源码开发分享 开发背景&#xff1a; 短视频矩阵系统源码是一款基于PHP语言开发的混剪工具&#xff0c;可以方便地将多个抖音账号的视频素材进行混剪&#xff0c;生成一个新的视频。该工具使用了多线程、协程和异步编程等技术&#xff0c;可以显著提高处理速度&…

Kubernetes革命:云原生时代的应用编排和自动化

文章目录 什么是Kubernetes以及为何它备受欢迎&#xff1f;云原生应用和K8s的关系Kubernetes的核心概念&#xff1a;Pods、Services、ReplicaSets等部署、扩展和管理应用程序的自动化容器编排的演进&#xff1a;Docker到Kubernetes实际用例&#xff1a;企业如何受益于K8s的应用…

美发店微信小程序怎么制作

随着智能手机的普及和移动互联网的发展&#xff0c;越来越多的消费者喜欢通过手机APP或微信小程序来寻找附近的美发店。为了满足消费者的需求&#xff0c;提高品牌知名度和客户满意度&#xff0c;美发店需要制作一款微信小程序&#xff0c;为顾客提供更加便捷、高效、优质的美发…

04训练——基于YOLO V8的自定义数据集训练——在windows环境下使用pycharm做训练-1总体步骤

在上文中,笔者介绍了使用google公司提供的免费GPU资源colab来对大量的自定义数据集进行模型训练。该方法虽然简单好用,但是存在以下几方面的短板问题: 一是需要通过虚拟服务器做为跳板机来访问,总体操作起来非常繁杂。 二是需要将大量的数据上传缓慢,管理和使用非常不友…

力扣第654题 最大二叉树 c++注释版

题目 654. 最大二叉树 中等 相关标签 栈 树 数组 分治 二叉树 单调栈 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地…

曦力音视频转换工具Xilisoft Video Converter Ultimate mac中文版

Xilisoft Video Converter Ultimate mac是一款功能强大的视频转换软件&#xff0c;它可以将几乎所有流行的视频格式转换为其他格式&#xff0c;包括AVI、MPEG、WMV、DivX、MP4、H.264/AVC、AVCHD、MKV、RM、MOV、XviD、3GP等。此外&#xff0c;它还支持将视频转换为音频格式&am…

小谈设计模式(24)—命令模式

小谈设计模式&#xff08;24&#xff09;—命令模式 专栏介绍专栏地址专栏介绍 命令模式角色分析命令&#xff08;Command&#xff09;具体命令&#xff08;ConcreteCommand&#xff09;接收者&#xff08;Receiver&#xff09;调用者&#xff08;Invoker&#xff09;客户端&am…

遗传算法入门笔记

目录 一、大体实现过程 二、开始我们的进化(具体实现细节) 2.1 先从编码说起 2.1.1 二进制编码法 2.1.&#xff12; 浮点编码法 2.1.3 符号编码法 2.2 为我们的袋鼠染色体编码 2.3 评价个体的适应度 2.4 射杀一些袋鼠 2.5 遗传--染色体交叉(crossover) 2.6 变异--基…

万万没想到,我用文心一言开发了一个儿童小玩具

最近关注到一年一度的百度世界大会今年将于10月17日在北京首钢园举办&#xff0c;本期大会的主题是“生成未来&#xff08;PROMPT THE WORLD&#xff09;”。会上&#xff0c;李彦宏会做主题为「手把手教你做AI原生应用」的演讲&#xff0c;比较期待 Robin 会怎么展示。据说&am…

【后端】韩顺平Java学习笔记(入门篇)

目前准备学后端&#xff0c;java虽然大二上学了但是基本忘没了orz 争取大三卷一点啊啊啊 九月份写的10月份才发orz 中间摆烂了很久&#xff0c;现在目标清晰准备行动了kkk 来源&#xff1a;韩顺平 零基础30天学会Java 目录 I. 简介 一、特点 ✿ 跨平台性 → 运行机制…

GIN框架路由的实现原理

文章目录 首先回顾一下gin框架的路由如何使用的从源码分析一下gin框架gin的路由实现前缀树前缀树的实现压缩前缀树--Radix TrieTrie VS Map 首先回顾一下gin框架的路由如何使用的 package mainimport ("fmt""github.com/gin-gonic/gin""net/http&quo…

使用策略模式重构审批

之前在公司与同时合作开发了一个考核系统&#xff0c;最后干完后整个代码也是合在了我这里&#xff0c;于是进行了codereview&#xff0c;进行优化代码&#xff0c;在审核这边&#xff0c;我先是拆分了公共代码&#xff0c;然后对重复的代码块进行了封装&#xff0c;但是审核这…

Flutter配置Android SDK路径

在使用VSCode作为开发Flutter的工具时&#xff0c;当选择调试设备时&#xff0c;通常看不到android的模拟器&#xff0c;只能看到Chrome之类的。 原因就是Flutter找不到Android的SDK路径&#xff0c;所以无法识别模拟器&#xff0c;我们用flutter doctor命令检查环境时&#xf…

论文《Link Prediction on Latent Heterogeneous Graphs》阅读

论文《Link Prediction on Latent Heterogeneous Graphs》阅读 论文概况IntroductionLHGNNA.语义嵌入a.节点级语义嵌入b.路径级语义嵌入 B.潜在异构上下文聚合a.上下文个性化b.上下文聚合 C.链路预测a.链路编码器b.损失函数 总结 论文概况 本文是2023年WWW上的一篇论文&#xf…

LeetCode 59. 螺旋矩阵 II【数组,模拟】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

563. 二叉树的坡度

563. 二叉树的坡度 C代码&#xff1a; int sum;int dfs(struct TreeNode* root) {if (root NULL) {return 0;}int left dfs(root->left);int right dfs(root->right);sum fabs(left - right);return root->val left right; }int findTilt(struct TreeNode* roo…

【HTML5】语义化标签记录

前言 防止一个页面中全部都是div&#xff0c;或者ul li&#xff0c;在html5推出了很多语义化标签 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 常用语义化案例 一般我用的多的是header&#xff0c;main&#xff0c;footer 这些标签不难理解&#x…

G1 GC详解及设置

一、概述 G1 GC&#xff0c;全称Garbage-First Garbage Collector&#xff0c;在JDK1.7中引入了G1 GC&#xff0c;从JAVA 9开始&#xff0c;G1 GC是默认的GC算法。通过-XX:UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器&#xff0c;分区既可以是年轻代也可以是老…

ChatGLM2-6B微调实践-Lora方案

ChatGLM2-6B微调实践-Lora方案 环境部署Lora微调项目部署准备数据集修改训练脚本adapter推理模型合并与量化合并后的模型推理 微调过程中遇到的问题参考&#xff1a; 环境部署 安装Anaconda、CUDA、PyTorch 参考&#xff1a;ChatGLM2-6B微调实践-P-Tuning方案 Lora微调 项目…

基于opencv,卡尺工具

机器视觉尺寸测量项目中&#xff0c;测量工件尺寸中最基本的卡尺工具。 卡尺工具涉及到的最主要任务&#xff1a; 扫描边缘点&#xff0c;亚像素精度 拟合直线 实现了一个小demo&#xff0c;用来获取工件边缘&#xff0c;亚像素精度。 代码链接放下下面 https://download.cs…