Android
文章平均质量分 96
tmacfrank
这个作者很懒,什么都没留下…
展开
-
OpenGL 入门(四)—— 贴纸与美颜滤镜
本篇我们来介绍贴纸效果与美颜滤镜的实现。原创 2024-05-08 20:00:48 · 1109 阅读 · 0 评论 -
OpenGL 入门(三)—— OpenGL 与 OpenCV 共同打造大眼滤镜
从本篇开始,会在上一篇搭建的滤镜框架的基础上,介绍具体的滤镜效果该如何制作。本篇会先介绍大眼滤镜,先来看一下效果,原图如下:使用手机后置摄像头对眼部放大后的效果:下面让我们一步步来实现这个效果吧。原创 2024-05-08 19:53:06 · 1341 阅读 · 2 评论 -
OpenGL 入门(二)—— 渲染摄像头采集的预览画面
Android 通过 OpenGL 绘制图像以及滤镜添加原创 2024-05-06 16:57:23 · 1292 阅读 · 1 评论 -
OpenCV 入门(七)—— 身份证识别
利用 OpenCV 实现身份证识别 Demo 效果:实际上身份证识别、银行卡识别都是相同的思路。原创 2024-05-06 16:48:40 · 2197 阅读 · 1 评论 -
OpenCV 入门(六) —— Android 下的人脸识别
本篇我们来介绍在 Android 下如何实现人脸识别。上一篇我们介绍了如何在 Windows 下通过 OpenCV 实现人脸识别,实际上,在 Android 下的实现的核心原理是非常相似的,因为 OpenCV 部分的代码改动不大,绝大部分代码可以直接移植到 Android 上。最主要的区别是,Android 摄像头采集图像的代码要复杂一些,而 Windows 下几行代码就搞定了。我们会介绍 Camera1 和 CameraX 两种方式。原创 2024-05-04 22:59:41 · 3885 阅读 · 3 评论 -
OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别
人脸识别需要人脸模型(特征集合)的支持,人脸定位的速度与准确度取决于模型。OpenCV 提供了已经训练好的模型,无论是 Windows 版本还是 Android 版本的 SDK,都在 etc 目录下提供了两种级联分类器模型:Haarcascades 基于 Haar-like 特征(哈尔特征)的级联分类器。Haar-like 特征是一种基于像素差值的特征描述方法,通过计算图像中不同区域的像素值之和的差异,来捕捉图像中的纹理和形状信息。原创 2024-05-04 12:17:17 · 4407 阅读 · 1 评论 -
OpenCV 入门(四)—— 车牌号识别
OpenCV车牌识别原创 2024-05-03 12:13:39 · 3519 阅读 · 2 评论 -
OpenCV 入门(三)—— 车牌筛选
支持向量机(Support Vector Machine,SVM)是一类按监督学习(Supervised Learning)方式对数据进行二元分类的广义线性分类器。用通俗的话来讲,就是用来分类,或者说挑选东西的。对于车牌识别而言,车牌定位的候选车牌图可以分为两类:车牌与非车牌。SVM 可以对候选图进行测评,告诉我们图中的是不是车牌,相似程度是多少。当然,SVM 可以进行分类的前提还是我们使用正负样本对其进行了训练。原创 2024-05-03 11:37:06 · 1436 阅读 · 2 评论 -
OpenCV 入门(二)—— 车牌定位
车牌定位:从整张图片中识别出牌照,主要操作包括对原图进行预处理、把车牌从整图中抠出字符分割:将牌照中的字符进行切割字符识别:识别单个字符,然后拼接成字符串本节是 OpenCV 车牌识别的第一节课,主要完成了车牌定位的工作。为了找出图像中的蓝色部分,需要检查 RGB 分量中的 Blue 分量就可以了。原创 2024-05-02 14:24:14 · 3283 阅读 · 5 评论 -
OpenCV 入门(一) —— OpenCV 基础
OpenCV(Open Source Computer Vision Library)是一个基于 BSD 许可开源发行的跨平台的计算机视觉库。可用于开发实时的图像处理、计算机视觉以及模式识别程序。由英特尔公司发起并参与开发,以 BSD 许可证授权发行,可以在商业和研究领域中免费使用。英特尔公司的 IPP 可以对 OpenCV 进行加速处理。OpenCV 拥有 C++,Python 和 Java 接口,并且支持 Windows, Linux, Mac OS, iOS 和 Android 系统。原创 2024-05-02 14:14:47 · 5013 阅读 · 3 评论 -
OpenGL 入门(一)—— OpenGL 基础
OpenGL(Open Graphics Library)是图形领域的工业标准,是一套跨编程语言、跨平台、专业的图形编程(软件)接口。它用于二维、三维图像,是一个功能强大,调用方便的底层图形库。它与硬件无关,可以在不同的平台如 Windows、Linux、Mac、Android、IOS 之间进行移植。因此,支持 OpenGL 的软件具有很好的移植性,可以获得非常广泛的应用(比如 PS 在部分功能和操作中使用 OpenGL 加速,以提高图像处理和渲染的性能)。对于 Android 系统而言,它支持的是 Ope原创 2024-05-01 23:41:17 · 5791 阅读 · 0 评论 -
RTMP 直播推流 Demo(二)—— 音频推流与视频推流
上一节我们对项目进行了配置,并且实现了摄像头预览,摄像头采集到的图像数据已经可以通过 LivePusher 传递到 Native 层,接下来就可以开始音视频编码与推流了。原创 2024-05-01 22:35:31 · 1965 阅读 · 0 评论 -
RTMP 直播推流 Demo(一)—— 项目配置与视频预览
RTMP 直播推流 Demo(二)—— 音频推流与视频推流前面的视频播放器 Demo 是在拉流端进行音视频解码,接下来介绍的 RTMP 直播推流的 Demo 是推流端进行音视频编码。Android 设备作为推流端将摄像头拍摄的图像上传至服务器,在 PC 端通过 FFmpeg 提供的 ffplay 工具或者 EVPlayer 拉流播放视频。原创 2024-04-30 22:06:14 · 2110 阅读 · 4 评论 -
Android 音视频播放器 Demo(二)—— 音频解码与音视频同步
本篇会介绍音频的解码与渲染、音视频同步以及进度条的实现。原创 2024-04-30 21:38:31 · 2235 阅读 · 2 评论 -
Android 音视频播放器 Demo(一)—— 视频解码与渲染
FFmpeg 的交叉编译我们在前面介绍过,这里就不再赘述了,有需要可以去参考NDK 编译(二)—— NDK 编译与集成 FFmpeg。这里主要介绍 FFmpeg 的环境配置,分三步:FFmpeg 编译产物的静态库(6 个 .a 文件)复制到 libs/armeabi-v7a 下,include 文件夹复制到 src/main/cpp 目录下android {cmake {# 定义源文件# 定义 FFmpeg 路径# 导入 FFmpeg 头文件# 添加 FFmpeg 库文件路径到编译标记中。原创 2024-04-29 12:35:30 · 1795 阅读 · 0 评论 -
Android 音视频基础知识
视频编码就是指通过特定的压缩技术,将某个视频格式文件转换成另一种视频格式文件的方式。国际电信联盟(ITU-T)的 H.26X 系列,常用的有 H.264、H.265,在这之前还有 H.261、H.263ISO 国际标准化组织的 MPEG 系列,如 MPEG1、MPEG2、MPEG4 AVC 等从 H.264 开始,两个组织合作推出编码标准,只不过 ITU-T 将其称为 H.264,而 ISO 将其称为 MPEG4 AVC。原创 2024-04-29 12:31:40 · 1437 阅读 · 1 评论 -
NDK 基础(一)—— C 语言知识汇总
过往的例子中有很多代码因为 IDE 不同致使写法也不同,在结构体上体现的尤为明显。但是在 VS 中就不用写 struct 关键字。为了避免一份代码放在不同的 IDE 中可能无法运行的情况,可以使用 typedef 关键字定义类型别名来解决这个问题。在 C 语言中,typedef关键字用于为已有的数据类型创建新的类型别名。它的作用是使代码更易读、更具可维护性,并提供了一种简化和抽象数据类型的方式,是 C 语言中非常有用的特性之一。通过使用typedef。原创 2024-04-27 21:40:09 · 804 阅读 · 0 评论 -
NDK 入门(三)—— JNI 注册与 JNI 线程
在 Native 方法中把 JNIEnv 和 jobject 封装在 MyContext 中,然后把 MyContext 传入 pthread_create() 的第四个参数,在 线程的入口方法 task 中接收 MyContext 使用两个封装的参数回调上层方法。默认的注册方式就是静态注册,上面提到的模板方法 stringFromJNI() 就是通过静态注册生成的 JNI 函数 Java_com_jni_register_MainActivity_stringFromJNI()。原创 2024-04-28 16:41:47 · 1505 阅读 · 2 评论 -
NDK 基础(三)—— C++ 语言基础与特性2
C++ 中的可变参数(Variadic Parameters)是一种特性,允许函数接受可变数量的参数。这使得我们可以定义接受不同数量或不同类型参数的通用函数。可变参数的处理是通过使用特殊的语法和标准库中的相关功能来实现的。原创 2024-04-27 22:11:29 · 656 阅读 · 0 评论 -
NDK 基础(四)—— C++ 高级特性1
STL(Standard Template Library)译为标准模板库,它是一套强大的标准库,是 C++ 标准库的一部分,在 iostream 中。STL 提供了包括容器在内的许多常用的数据结构和算法,以及用于操作这些数据结构的迭代器。STL 被分为 STL 包、算法包和迭代器,是为了提供更好的模块化和可扩展性:将 STL 划分为 STL 包、算法包和迭代器的主要目的是提供模块化的设计,并促进代码的重用和扩展。这种划分使得开发人员可以根据具体的需求选择性地使用STL的不同部分,同时也使得 STL 的设计原创 2024-04-27 22:18:17 · 726 阅读 · 0 评论 -
NDK 基础(二)—— C++ 语言基础与特性1
当我们显式定义拷贝构造函数后,默认的会被覆盖掉。// 使用常量引用作为参数,避免修改原对象cout原创 2024-04-27 21:52:40 · 922 阅读 · 0 评论 -
NDK 入门(一)—— JNI 初探
宏是预处理器的一个重要概念,它是一种简单的文本替换机制。宏定义使用#define关键字,将一个标识符与一个文本片段关联起来。当源代码中出现宏标识符时,预处理器会将其替换为与之关联的文本片段。以下是一些常见的宏使用示例:// 定义 PI 为常量#define PI3.14159// 定义 PI 为常量 # define PI 3.14159 // 定义 MAX(a, b) 为宏函数 # define MAX(a , b)((a) >(b)?(a) :(b))原创 2024-04-28 16:42:41 · 1042 阅读 · 0 评论 -
NDK 入门(四)—— 静态缓存与 Native 异常
throw "我报废了";// 更加简单的写法 自定义异常public:return "自定义";Student s;throw s;try {// 抛的是 const char *,因此捕获也是这种类型cout原创 2024-04-28 16:41:14 · 1892 阅读 · 0 评论 -
NDK 入门(二)—— 调音小项目
FMOD Ex 声音系统是为游戏开发者准备的革命性音频引擎,像 cocos2d,unity3d 游戏引擎默认就集成了 fmod。如今采用了 FMOD 作为音频引擎的游戏包括 Far Cry(孤岛惊魂)、Tom Clancy's Ghost Recon(幽灵行动),甚至著名的 World Of Warcraft(魔兽争霸)。原创 2024-04-28 16:42:21 · 1383 阅读 · 0 评论 -
NDK 编译(二)—— NDK 编译与集成 FFmpeg
在使用 NDK 进行音视频开发时,势必会用到 FFmpeg,因此我们要知道如何编译 FFmpeg 并将其集成到 Android 项目中。原创 2024-04-28 17:31:54 · 2080 阅读 · 0 评论 -
NDK 编译(一)—— Linux 知识汇总
bin/bash#无类型,无须声明变量类型,但是要注意等号两侧不能有空格A=10#使用变量的值,前面要加$echo A=$AA=100成功输出 A=10,然后通过输出,可以显示上一条命令的退出状态码,以验证命令是否执行成功,0 表示成功。/bin/bash# 1.输出指令执行结果,指令要大写# 2.获取指令参数echo 当前Shell脚本的名字:$0echo 参数一:$1echo 参数二:$2# 3.通过?获取执行状态if(($?));thenecho 执行失败。原创 2024-04-28 17:30:39 · 998 阅读 · 0 评论 -
NDK 基础(五)—— C++ 高级特性2
在 C++ 中,左值(lvalue)和右值(rvalue)是用于描述表达式的术语,它们与赋值操作和内存中对象的生命周期有关。**左值(lvalue)**是指可以出现在赋值操作符左侧的表达式,它通常具有持久的身份(identity)和内存位置。左值可以是变量、对象、函数或表达式,它们具有可寻址(addressable)的属性,可以获取其地址。例如:**右值(rvalue)**是指不能出现在赋值操作符左侧的表达式,它通常是临时的、没有持久身份的值。右值可以是字面量、临时对象、表达式的结果等。右值不能直接获取其原创 2024-04-27 22:26:01 · 1107 阅读 · 1 评论 -
NDK 编译(三)—— CMake 原生构建工具
在 Android Studio 2.2 及以上,构建原生库的默认工具是 CMake。CMake 是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的 makefile 或者 project 文件。CMake 并不直接构建出最终的软件,而是产生其他工具的脚本(如 makefile),然后再依据这个工具的构建方式使用。原创 2024-04-28 17:32:52 · 870 阅读 · 0 评论 -
Android 虚拟机与类加载机制
Android 应用程序运行在 Dalvik/Art 虚拟机上,并且每一个应用程序都有一个单独的 Dalvik/Art 虚拟机实例。原创 2023-11-26 21:35:02 · 1173 阅读 · 0 评论 -
手写简易版 Retrofit
这里只实现最基本的使用,适配器和转换器等并未实现。基本使用方法分两步,先定义 Api 接口:分别使用 POST 和 GET 请求去获取天气数据,这里使用的是高德地图的 API。接下来创建 Retrofit 对象,获取 Api 实例,用异步方式执行 Api 中的请求:二、手写代码写代码之前至少要清楚 Retrofit 其实是因为封装了 OkHttp 才拥有网络访问能力的,实际执行网络请求的是 OkHttp。Retrofit 要做的是为网络请求接口生成动态代理对象,并在请求方法被调用时,在动态代理的 In原创 2023-11-26 19:35:43 · 391 阅读 · 0 评论 -
Navigation 基本原理
Navigation 组件旨在用于具有一个主 Activity 和多个 Fragment 目的地的应用。主 Activity 与导航图相关联,且包含一个负责根据需要交换目的地的。在具有多个 Activity 目的地的应用中,每个 Activity 均拥有其自己的导航图。原创 2023-11-12 19:38:16 · 252 阅读 · 0 评论 -
嵌套滑动的简单应用——仿京东淘宝首页
系列文章目录View 的绘制与事件分发(一)——视图层级与布局加载例如:第一章 Python 机器学习入门之pandas的使用一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warnings原创 2023-06-10 15:59:00 · 790 阅读 · 0 评论 -
ViewModel 基本原理
Activity 配置发生改变,如屏幕旋转时,会销毁原本的 Activity 再创建一个新的实例,会走一次 Activity 的生命周期。传统的应对方式是在 Activity 的 onCreate()/onSaveInstanceState() 中通过获取/保存 savedInstanceState 参数实现状态保存。但是在使用 ViewModel 后,就无须我们手动处理了。那么如何使用 ViewModel 来保存非配置数据呢?原创 2023-11-05 14:53:07 · 179 阅读 · 0 评论 -
DataBinding 基本原理
/</</更多使用方法与案例可参考官方文档。原创 2023-11-04 23:24:52 · 257 阅读 · 0 评论 -
LiveData 原理与 LiveData 总线
LiveData 是一种具有生命周期感知能力的可观察数据持有类,可以保证屏幕上的显示内容和数据一直保持同步。原创 2023-10-31 23:30:45 · 157 阅读 · 0 评论 -
生命周期感知组件 Lifecycle
Android 系统中的 LifecycleOwner 除了 Activity、Fragment 还有一个 ProcessLifecycleOwner(在 lifecycle-process 依赖中),它会在应用级别监听 Activity 生命周期。原创 2023-10-31 23:26:59 · 135 阅读 · 0 评论 -
Hilt 使用方法与隔离层实现
Hilt 解决了一部分 Dagger2 不好用的问题,当有多个 Component 向类中注入对象时,Dagger2 并不好用。Hilt 在 Dagger2 的基础上做出了一些改进,使得在向 Application、Activity、Fragment、View、Service 和 BroadcastReceiver 这些类中注入对象时,仅仅通过简单的注解就可以完成对象注入(不用再写这些类的 Component 了)。原创 2023-10-30 22:25:26 · 136 阅读 · 0 评论 -
Dagger2 的使用与基本原理
使用 Dagger2 的最佳做法:如果有可能,通过@Inject进行构造函数注入,以向 Dagger 图中添加类型。使用@Binds告知 Dagger 接口应采用哪种实现使用@Provides告知 Dagger 如何提供你的项目所不具备的类只能在组件中声明一次模块根据注释的使用生命周期,为作用域注释命名,例如和依赖注入。原创 2023-10-30 16:38:18 · 1186 阅读 · 0 评论 -
Retrofit 源码分析
一、简介Retrofit 是一个基于并封装了 OkHttp 的 RESTful 网络请求框架,网络请求工作本质上由 OkHttp 完成,而 Retrofit 仅负责网络请求接口的封装。它使用注解配置网络请求参数,且框架内部使用了大量的设计模式,不仅简化了使用,也降低了模块间的耦合,提高了扩展性,支持 RxJava 框架和 Gson、Protobuf 等序列化格式,是一款功能十分强大的开源框架。使用 Retrofit 框架进行网络请求的过程为:请求过程:在应用内通过 Retrofit 发起一个网络请原创 2023-10-19 22:19:12 · 120 阅读 · 0 评论 -
OkHttp(一)—— 整体流程与分发器
OkHttp 的简单使用与分发器的源码分析原创 2022-07-09 23:06:41 · 325 阅读 · 0 评论