当前位置: 首页 > news >正文

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

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

jniLibs目录指定为libs

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这个库 (系统自带) ,后面会用到。

#导入头文件
include_directories(include)#导入库文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../../../libs/${ANDROID_ABI}")target_link_libraries(myopencvtestopencv_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完整代码如下所示

cmake_minimum_required(VERSION 3.22.1)project("myopencvtest")add_library(myopencvtestSHAREDnative-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-liblog)target_link_libraries(myopencvtestopencv_java4${log-lib}android)

3.6 cpp中声明opencv引用

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

#include "opencv2/opencv.hpp"

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

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

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

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

4.1 创建指定文件夹

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

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需要和你实际的包名和类名相匹配
#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博客 (待更新)

相关文章:

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

1. 前言 上文 我们在Windows电脑上实现了人脸功能&#xff0c;接下来我们要把人脸识别的功能移植到Android上。 那么首先第一步&#xff0c;就是要创建一个Native的Android项目&#xff0c;并且配置好OpenGL&#xff0c;并能够调用成功。 这里我们使用的是openCV-4.8.0&#x…...

(1)、扩展SpringCache一站式解决缓存击穿,穿透,雪崩

1、问题描述 我们在使用SpringCache的@Cacheable注解时,发现并没有设置过期时间这个功能。 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @I...

Rancher使用cert-manager安装报错解决

报错&#xff1a; rancher-rke-01:~/rke/rancher-helm/rancher # helm install rancher rancher-stable/rancher --namespace cattle-system --set hostnamewww.rancher.local Error: INSTALLATION FAILED: Internal error occurred: failed calling webhook "webhook…...

Harvard transformer NLP 模型 openNMT 简介入门

项目网址&#xff1a; OpenNMT - Open-Source Neural Machine Translation logo&#xff1a; 一&#xff0c;从应用的层面先跑通 Harvard transformer GitHub - harvardnlp/annotated-transformer: An annotated implementation of the Transformer paper. ​git clone https…...

【数据结构OJ题】用栈实现队列

原题链接&#xff1a;https://leetcode.cn/problems/implement-queue-using-stacks/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 用两个栈实现&#xff0c;一个栈进行入队操作&#xff0c;另一个栈进行出队操作。 出队操作&#xff1a; 当出队的栈…...

通达信指标公式15:除权除息数据统计分析

#1.关于除权除息指标的介绍&#xff1a;本指标是小红牛原创指标之一&#xff0c;觉得有必要研究一下这个问题&#xff0c;所以就花时间整理一下这个指标相关内容&#xff0c;大家可以在本源码基础上&#xff0c;进一步优化自己的思路。本指标为通达信幅图指标&#xff0c;可以做…...

day-27 代码随想录算法训练营(19)回溯part03

39.组合总和 分析&#xff1a;同一个数可以选多次&#xff0c;但是不能有重复的答案&#xff1b; 思路&#xff1a;横向遍历&#xff0c;纵向递归&#xff08;不同的是递归的时候不需要跳到下一个位置&#xff0c;因为同一个数可以选多次&#xff09; class Solution { publ…...

CSDN编程题-每日一练(2023-08-22)

CSDN编程题-每日一练(2023-08-22) 一、题目名称:最长递增区间二、题目名称:K树三、题目名称:小Q的价值无向图一、题目名称:最长递增区间 时间限制:1000ms内存限制:256M 题目描述: 给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3。…...

使用 KubeBlocks 为 K8s 提供稳如老狗的数据库服务

原文链接&#xff1a;https://forum.laf.run/d/994 大家好&#xff01;今天这篇文章主要向大家介绍 Sealos 的数据库服务。在 Sealos 上数据库后端服务由 KubeBlocks 提供&#xff0c;为用户的数据库应用保驾护航。无论你是在公有云还是本地环境中使用&#xff0c;Sealos 都能为…...

SFL212B-10-21-15、SFL212B-20-21-40喷嘴挡板伺服阀

SFL212B-05-21-10、SFL212B-10-21-15、SFL212B-20-21-40、SFL212-05-32-10、SFL212-10-32-15、SFL212-20-32-40、SFL212A-05-21-10、SFL212A-10-21-15、SFL212A-20-21-40喷嘴挡板力反馈伺服阀&#xff0c;外置伺服放大器&#xff0c;四通&#xff0c;带阀芯阀套的两级伺服阀&am…...

阿里云100元预算可选的云服务器配置2核2G3M带宽

阿里云服务器100元可以买到哪些配置&#xff1f;如果是一年时长&#xff0c;轻量应用服务器2核2G3M带宽一年108元&#xff0c;系统盘为50GB高效云盘。以前阿里云服务器ECS卖过35元一年、69元、88元、89元和99元的都有过&#xff0c;但是现在整体费用上涨&#xff0c;入门级云服…...

Linux问题--docker启动mysql时提示3306端口被占用

问题描述&#xff1a; 解决方法&#xff1a; 1.如果需要kill掉mysqld服务可以先通过 lsof -i :3306 2. 查询到占用3306的PID&#xff0c;随后使用 kill -15 PID 来kill掉mysqld服务。 最后结果...

2023年中秋月饼市场趋势分析(月饼京东销售数据分析)

中秋将至&#xff0c;月饼作为节令食品将再次掀起消费热潮。今年月饼市场的需求如何呢&#xff0c;是更受欢迎还是热度有所降低&#xff0c;结合数据我们一起来看今年月饼市场的销售表现。 在这里&#xff0c;我们分别选取了2022年第31周-32周和2023年第31周-32周&#xff08;…...

A Survey on Model Compression for Large Language Models

本文是LLM系列文章&#xff0c;关于模型压缩相关综述&#xff0c;针对《A Survey on Model Compression for Large Language Models》的翻译。 大模型的模型压缩综述 摘要1 引言2 方法3 度量和基准3.1 度量3.2 基准 4 挑战和未来方向5 结论 摘要 大型语言模型&#xff08;LLM…...

读取/加载 properties/yml 配置文件

大家好 , 我是苏麟 , 今天带来一个简单好用的东西 . 读取/加载 properties/yml配置文件 基于PropertiesConfiguration读取配置文件 引入依赖 <!--加载yml资源--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b…...

UG\NX二次开发 创建中心线

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C++,Qt-CSDN博客 简介: 下面是在制图模块创建中心线的例子,用的是ufun函数。 效果: 代码: #include "me.hpp"#include <stdio.h> #include <string.h> #include <uf.h>…...

用java语言写一个网页爬虫 用于获取图片

以下是一个简单的Java程序&#xff0c;用于爬取网站上的图片并下载到本地文件夹&#xff1a; import java.io.*; import java.net.*;public class ImageSpider {public static void main(String[] args) {// 确定要爬取的网站URL和本地保存目录String url "https://www.…...

三数之和-LeetCode

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&a…...

ubuntu 对多CPU统一设置高性能模式

一、问题描述 之前在网上找到的CPU设置高性能模式&#xff0c;只能设置CPU0单个CPU&#xff0c;下述是对多核CPU统一设置工作模式。 二、软件安装与设置 执行下述命令sudo apt-get install indicator-cpufreq,然后重启电脑。此时&#xff0c;界面右上角会出现如下图标&#xf…...

志凌海纳 SmartX 携手灵雀云推出全栈云原生联合解决方案

近日&#xff0c;北京志凌海纳科技有限公司&#xff08;以下简称“SmartX”&#xff09;与北京凌云雀科技有限公司&#xff08;以下简称“灵雀云”&#xff09;联合推出全栈云原生联合解决方案&#xff0c;为客户提供从基础设施到容器云平台的一站式服务&#xff0c;加速客户云…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...