如何在 Android 项目中应用 OpenCV?

news/2024/11/16 4:45:31/文章来源:https://www.cnblogs.com/lockegogo/p/18306398

如何在 Android 项目中应用 OpenCV?

流程总览

  1. 导入 OpenCV 库
  2. 在 Android 项目中配置 OpenCV
  3. 创建人脸识别器
  4. 识别并裁剪人脸区域
  5. 显示裁剪后的人脸图片

具体实现

导入 OpenCV 库

  1. 先去 OpenCV 官网下载 OpenCV 的 Android 库并解压:https://opencv.org/releases/
  2. 在项目中点击 file->new->Import Module,选择解压后的 opencv-android-sdk 文件夹中的 sdk 文件夹,并将 Module name 的名字修改为 lib_opencv
  3. 修改 build.gradle(Module:lib_opencv)sdk 版本和 build.gradle(Module:app) 保持一致

img

  1. build.gradle(Project:project-name) 中增加如下代码:
 buildscript {# addext.kotlin_version = '1.5.20'repositories { ... }dependencies {...# addclasspath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
  1. settings.gradle 中增加一行:include ':lib_opencv'
  2. 应用 OpenCV 库到 APP 中:点击 file->project structure->Dependencies->app->3 Module Dependency,然后给 opencv 打上对勾,应用即可,表现在 build.gradle(Module:app) 中:
dependencies {...implementation project(path: ':lib_opencv')...
}
  1. 在 Android 项目的 AndroidManifest.xml文件中添加如下权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
  1. 在 MainActivity 类中,添加如下代码来加载 OpenCV 库
static {System.loadLibrary("opencv_java4");
}
  1. 可选步骤:将 lib_opencv/etc/haarcascade/haarcascade_frontalface_default.xml 文件复制到 app/src/main/assets/ 文件夹下,方便调用

创建人脸识别器

public class FaceDetector {private final String TAG = "FaceUtils";private String xmlPath = "haarcascade_frontalface_default.xml";CascadeClassifier faceDetector;static {System.loadLibrary("opencv_java4");}public FaceDetector(String dataPath) {String xmlFilePath = dataPath + xmlPath;// 创建人脸检测器faceDetector = new CascadeClassifier(xmlFilePath);}

识别并裁剪人脸

在这一步中,我们将加载图像并使用人脸识别器进行人脸检测:

public Bitmap detectAndCropFace(Bitmap originalBitmap) {// 将 Bitmap 转换为 MatMat mat = new Mat();Utils.bitmapToMat(originalBitmap, mat);// 创建一个灰度 MatMat grayMat = new Mat();Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_BGR2GRAY);// 检测人脸MatOfRect faces = new MatOfRect();faceDetector.detectMultiScale(grayMat, faces);// 获取第一个检测到的人脸的边界框Rect[] facesArray = faces.toArray();if (facesArray.length > 0) {Rect faceRect = facesArray[0];// 扩大边界框:数值可调整int padding = 20;faceRect.y = Math.max(faceRect.y - padding, 0);faceRect.height = Math.min(faceRect.height + 2 * padding, mat.rows() - faceRect.y);// 裁剪人脸Mat faceMat = new Mat(mat, faceRect);// 将 Mat 转换为 BitmapBitmap faceBitmap = Bitmap.createBitmap(faceMat.cols(), faceMat.rows(), Bitmap.Config.ARGB_8888);Utils.matToBitmap(faceMat, faceBitmap);return faceBitmap;} else {return null;}}

显示裁剪后的人脸图片

private void showFace(Bitmap faceBitmap) {ImageView faceImageView = findViewById(R.id.faceImageView);faceImageView.setImageBitmap(faceBitmap);
}runOnUiThread(() -> showFace(faceBitmap));

参考资料

  1. Android Studio 配置 OpenCV 库
  2. android opencv 识别人脸并裁剪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744999.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 开发学习笔记

Android 开发学习笔记 基本概念 Android 应用程序由一些零散的有联系的组件组成,通过一个工程 manifest 绑定在一起。在 manifest 中,描述了每一个组件以及组件的作用,其中有 6 个组件,它们是 Android 应用程序的基石。Android 有四大组件(也有说六大组件的,外加 Intent …

Synergy键鼠跨屏幕同步

Synergy 在多台计算机之间使用单个键盘和鼠标,使用一台计算机的键盘、鼠标或触控板来控制附近的计算机,并在它们之间无缝工作 支持Windows Mac Linux 和树莓派,解放桌面空间,减少操作复杂性,多屏操作神器没错了小记 Synergy 在多台计算机之间使用单个键盘和鼠标,使用一台…

基于粒子群优化的图像融合算法matlab仿真

1.程序功能描述基于粒子群优化的图像融合算法,通过PSO优化,得到最优的图像融合权值参数,将彩色模糊图像和清晰的灰度图像进行融合获得彩色清晰图像。2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序for it = 1:Ites(ijj)itfor i=1:Popu% 更新速度 ptls(i)…

一起学RISC-V汇编第3讲之寄存器

寄存器是处理器中最常用的处理单元,RISC-V指令的操作数除了立即数就是寄存器。 RISC-V指令集包含了多种不同类型的寄存器,用于不同目的和功能: 对于rv32imafd架构而言,包含如下寄存器:通用寄存器:32个通用整数寄存器,分别标记为x0-x31,如果是fd扩展,还有32 个独立的浮…

第三期 Plugins Function Calling

大模型的缺陷:没有最新消息:训练周期长且昂贵,GPT3.5/4的知识截至2021-9 没有真逻辑:表现出的逻辑和推理,是训练文本的统计规律,不是真正的逻辑Plugins 订机票、数学计算、日程提醒... 插件选择&使用插件的原理 通过prompt判断是否应该调用插件失败使用门槛高:用户需…

第四期 AI 编程

目标如何用 AI 辅助编程,提升工作效率 如何用 AI 快速应用和学习新技术,扩展职业边界 通过 AI 编程,洞察 AI 对各个行业的影响趋势产品与技术的联通+业务视角 =AI 全栈工程师 AI 编程 使用 AI 编程(编程目前是大模型能力最强的垂直领域),除了解决编程问题以外,更重要是建…

Linux调度器:进程优先级

一、前言 本文主要描述的是进程优先级这个概念。从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级、realtime优先级、归一化优先级和动态优先级等概念,我们希望能在第二章将这些相关的概念描述清楚。为了加深理解,在第三章我们给出…

中山大学人工智能夏令营实践课

Day 0 配置wsl的 vscode环境 (速通速通!) Day 1 上午讲了中山大学的校史以及鸿蒙系统的大体介绍 感慨: 作为互联网原生的一代,是最具创造性的一代,通过我们的夏令营不仅可以锻练我们的技术能力,开发能力,沟通能力,从而让自己链接的能力超出自已的物理空间。还可以提升…

微调(Fine-Tuning)和检索增强生成(RAG)

微调(Fine-Tuning)和检索增强生成(RAG) https://www.toutiao.com/article/7386094597421810186/?log_from=21b91ee0752_17211185181952024-06-30 09:05架构笔记 微调(Fine-Tuning)过程的核心,是在新的任务和数据集上对预训练模型的参数进行微小的调整,使其能精准契合…

为视觉语言多模态模型进行偏好优化

为视觉语言多模态模型进行偏好优化 训练模型使得它能够理解并预测人类偏好是一项比较复杂的任务。诸如 SFT (Supervised finetuning) 的传统的方法一般都需要耗费较大成本,因为这些算法需要对数据打上特定的标签。而偏好优化 (Preference Optimization) 作为一种替代选项,通常…

别小瞧它,提高效率可了解可拖拽的工作流引擎

提升效率,可以随时来了解低代码技术平台、可拖拽的工作流引擎更多特点。当前,社会发展程度越来越高,很多企业都希望寻求更优的平台产品实现提质增效的目的。低代码技术平台、可拖拽的工作流引擎具有可视化操作界面、更灵活、好操作等多个优势特点,在提升办公效率方面具有事…