自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 OpenGL 入门(四)—— 贴纸与美颜滤镜

本篇我们来介绍贴纸效果与美颜滤镜的实现。

2024-05-08 20:00:48 1113

原创 OpenGL 入门(三)—— OpenGL 与 OpenCV 共同打造大眼滤镜

从本篇开始,会在上一篇搭建的滤镜框架的基础上,介绍具体的滤镜效果该如何制作。本篇会先介绍大眼滤镜,先来看一下效果,原图如下:使用手机后置摄像头对眼部放大后的效果:下面让我们一步步来实现这个效果吧。

2024-05-08 19:53:06 1348 2

原创 OpenGL 入门(二)—— 渲染摄像头采集的预览画面

Android 通过 OpenGL 绘制图像以及滤镜添加

2024-05-06 16:57:23 1305 1

原创 OpenCV 入门(七)—— 身份证识别

利用 OpenCV 实现身份证识别 Demo 效果:实际上身份证识别、银行卡识别都是相同的思路。

2024-05-06 16:48:40 2233 1

原创 OpenCV 入门(六) —— Android 下的人脸识别

本篇我们来介绍在 Android 下如何实现人脸识别。上一篇我们介绍了如何在 Windows 下通过 OpenCV 实现人脸识别,实际上,在 Android 下的实现的核心原理是非常相似的,因为 OpenCV 部分的代码改动不大,绝大部分代码可以直接移植到 Android 上。最主要的区别是,Android 摄像头采集图像的代码要复杂一些,而 Windows 下几行代码就搞定了。我们会介绍 Camera1 和 CameraX 两种方式。

2024-05-04 22:59:41 3939 3

原创 OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别

人脸识别需要人脸模型(特征集合)的支持,人脸定位的速度与准确度取决于模型。OpenCV 提供了已经训练好的模型,无论是 Windows 版本还是 Android 版本的 SDK,都在 etc 目录下提供了两种级联分类器模型:Haarcascades 基于 Haar-like 特征(哈尔特征)的级联分类器。Haar-like 特征是一种基于像素差值的特征描述方法,通过计算图像中不同区域的像素值之和的差异,来捕捉图像中的纹理和形状信息。

2024-05-04 12:17:17 4493 1

原创 OpenCV 入门(四)—— 车牌号识别

OpenCV车牌识别

2024-05-03 12:13:39 3580 2

原创 OpenCV 入门(三)—— 车牌筛选

支持向量机(Support Vector Machine,SVM)是一类按监督学习(Supervised Learning)方式对数据进行二元分类的广义线性分类器。用通俗的话来讲,就是用来分类,或者说挑选东西的。对于车牌识别而言,车牌定位的候选车牌图可以分为两类:车牌与非车牌。SVM 可以对候选图进行测评,告诉我们图中的是不是车牌,相似程度是多少。当然,SVM 可以进行分类的前提还是我们使用正负样本对其进行了训练。

2024-05-03 11:37:06 1448 2

原创 OpenCV 入门(二)—— 车牌定位

车牌定位:从整张图片中识别出牌照,主要操作包括对原图进行预处理、把车牌从整图中抠出字符分割:将牌照中的字符进行切割字符识别:识别单个字符,然后拼接成字符串本节是 OpenCV 车牌识别的第一节课,主要完成了车牌定位的工作。为了找出图像中的蓝色部分,需要检查 RGB 分量中的 Blue 分量就可以了。

2024-05-02 14:24:14 3336 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 5342 3

原创 OpenGL 入门(一)—— OpenGL 基础

OpenGL(Open Graphics Library)是图形领域的工业标准,是一套跨编程语言、跨平台、专业的图形编程(软件)接口。它用于二维、三维图像,是一个功能强大,调用方便的底层图形库。它与硬件无关,可以在不同的平台如 Windows、Linux、Mac、Android、IOS 之间进行移植。因此,支持 OpenGL 的软件具有很好的移植性,可以获得非常广泛的应用(比如 PS 在部分功能和操作中使用 OpenGL 加速,以提高图像处理和渲染的性能)。对于 Android 系统而言,它支持的是 Ope

2024-05-01 23:41:17 5901

原创 RTMP 直播推流 Demo(二)—— 音频推流与视频推流

上一节我们对项目进行了配置,并且实现了摄像头预览,摄像头采集到的图像数据已经可以通过 LivePusher 传递到 Native 层,接下来就可以开始音视频编码与推流了。

2024-05-01 22:35:31 1971

原创 RTMP 直播推流 Demo(一)—— 项目配置与视频预览

RTMP 直播推流 Demo(二)—— 音频推流与视频推流前面的视频播放器 Demo 是在拉流端进行音视频解码,接下来介绍的 RTMP 直播推流的 Demo 是推流端进行音视频编码。Android 设备作为推流端将摄像头拍摄的图像上传至服务器,在 PC 端通过 FFmpeg 提供的 ffplay 工具或者 EVPlayer 拉流播放视频。

2024-04-30 22:06:14 2122 4

原创 Android 音视频播放器 Demo(二)—— 音频解码与音视频同步

本篇会介绍音频的解码与渲染、音视频同步以及进度条的实现。

2024-04-30 21:38:31 2241 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 1806

原创 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 1447 1

原创 NDK 编译(三)—— CMake 原生构建工具

在 Android Studio 2.2 及以上,构建原生库的默认工具是 CMake。CMake 是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的 makefile 或者 project 文件。CMake 并不直接构建出最终的软件,而是产生其他工具的脚本(如 makefile),然后再依据这个工具的构建方式使用。

2024-04-28 17:32:52 874

原创 NDK 编译(二)—— NDK 编译与集成 FFmpeg

在使用 NDK 进行音视频开发时,势必会用到 FFmpeg,因此我们要知道如何编译 FFmpeg 并将其集成到 Android 项目中。

2024-04-28 17:31:54 2089

原创 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 1003

原创 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 1050

原创 NDK 入门(二)—— 调音小项目

FMOD Ex 声音系统是为游戏开发者准备的革命性音频引擎,像 cocos2d,unity3d 游戏引擎默认就集成了 fmod。如今采用了 FMOD 作为音频引擎的游戏包括 Far Cry(孤岛惊魂)、Tom Clancy's Ghost Recon(幽灵行动),甚至著名的 World Of Warcraft(魔兽争霸)。

2024-04-28 16:42:21 1387

原创 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 1508 2

原创 NDK 入门(四)—— 静态缓存与 Native 异常

throw "我报废了";// 更加简单的写法 自定义异常public:return "自定义";Student s;throw s;try {// 抛的是 const char *,因此捕获也是这种类型cout

2024-04-28 16:41:14 1894

原创 NDK 基础(五)—— C++ 高级特性2

在 C++ 中,左值(lvalue)和右值(rvalue)是用于描述表达式的术语,它们与赋值操作和内存中对象的生命周期有关。**左值(lvalue)**是指可以出现在赋值操作符左侧的表达式,它通常具有持久的身份(identity)和内存位置。左值可以是变量、对象、函数或表达式,它们具有可寻址(addressable)的属性,可以获取其地址。例如:**右值(rvalue)**是指不能出现在赋值操作符左侧的表达式,它通常是临时的、没有持久身份的值。右值可以是字面量、临时对象、表达式的结果等。右值不能直接获取其

2024-04-27 22:26:01 1110 1

原创 NDK 基础(四)—— C++ 高级特性1

STL(Standard Template Library)译为标准模板库,它是一套强大的标准库,是 C++ 标准库的一部分,在 iostream 中。STL 提供了包括容器在内的许多常用的数据结构和算法,以及用于操作这些数据结构的迭代器。STL 被分为 STL 包、算法包和迭代器,是为了提供更好的模块化和可扩展性:将 STL 划分为 STL 包、算法包和迭代器的主要目的是提供模块化的设计,并促进代码的重用和扩展。这种划分使得开发人员可以根据具体的需求选择性地使用STL的不同部分,同时也使得 STL 的设计

2024-04-27 22:18:17 728

原创 NDK 基础(三)—— C++ 语言基础与特性2

C++ 中的可变参数(Variadic Parameters)是一种特性,允许函数接受可变数量的参数。这使得我们可以定义接受不同数量或不同类型参数的通用函数。可变参数的处理是通过使用特殊的语法和标准库中的相关功能来实现的。

2024-04-27 22:11:29 657

原创 NDK 基础(二)—— C++ 语言基础与特性1

当我们显式定义拷贝构造函数后,默认的会被覆盖掉。// 使用常量引用作为参数,避免修改原对象cout

2024-04-27 21:52:40 925

原创 NDK 基础(一)—— C 语言知识汇总

过往的例子中有很多代码因为 IDE 不同致使写法也不同,在结构体上体现的尤为明显。但是在 VS 中就不用写 struct 关键字。为了避免一份代码放在不同的 IDE 中可能无法运行的情况,可以使用 typedef 关键字定义类型别名来解决这个问题。在 C 语言中,typedef关键字用于为已有的数据类型创建新的类型别名。它的作用是使代码更易读、更具可维护性,并提供了一种简化和抽象数据类型的方式,是 C 语言中非常有用的特性之一。通过使用typedef。

2024-04-27 21:40:09 805

原创 序列化基础

源码流程中提到,在 writeSerialData() 中,如果 Serializable 的实现类自定义了 writeObject(),那么就通过反射调用到这个 writeObject(),否则就调用 defaultWriteFields() 执行一般的序列化过程。因此,重写 writeObject()、readObject() 可以实现自定义序列化。自定义序列化机制可以让程序控制如何序列化实例变量,甚至完全不序列化。

2023-11-26 22:42:07 866

原创 深入理解对象与垃圾回收机制

类加载:把 class 加载到 JVM 运行时数据区的过程。可以通过本地文件的形式,也可以通过网络加载。检查加载:首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查类是否已经被加载、解析和初始化过。符号引用 :以一组符号来描述所引用的目标,比如 String 类的符号引用是全类名 java.lang.String。分配内存:从堆内存中划分出一部分给新创建的对象。划分内存有两种方式:指针碰撞与空闲列表。内存空间初始化。

2023-11-26 22:37:34 1211

原创 JVM 内存管理深度剖析

JVM 能识别 class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成指定操作。操作系统并不认识这些 class 文件,是 JVM 将它们翻译成操作系统可识别的机器码,最终由操作系统执行这些机器码。Java 具有跨平台、跨语言的特性,也是因为 JVM 可以把 Java 字节码、Kotlin 字节码、Groovy 字节码等翻译成可以被 Linux、Windows、Mac 系统识别的机器码。

2023-11-26 22:36:16 1361

原创 Android 虚拟机与类加载机制

Android 应用程序运行在 Dalvik/Art 虚拟机上,并且每一个应用程序都有一个单独的 Dalvik/Art 虚拟机实例。

2023-11-26 21:35:02 1175

原创 手写简易版 Retrofit

这里只实现最基本的使用,适配器和转换器等并未实现。基本使用方法分两步,先定义 Api 接口:分别使用 POST 和 GET 请求去获取天气数据,这里使用的是高德地图的 API。接下来创建 Retrofit 对象,获取 Api 实例,用异步方式执行 Api 中的请求:二、手写代码写代码之前至少要清楚 Retrofit 其实是因为封装了 OkHttp 才拥有网络访问能力的,实际执行网络请求的是 OkHttp。Retrofit 要做的是为网络请求接口生成动态代理对象,并在请求方法被调用时,在动态代理的 In

2023-11-26 19:35:43 391

原创 Java 注解在 Android 中的使用场景

Java 元注解有 5 种,常用的是 @Target 和 @Retention 两个。这三个值表示的生命周期为 SOURCE < CLASS < RUNTIME,即 RUNTIME 生命周期最长,涵盖了 SOURCE 和 CLASS,其次是 CLASS 的生命周期涵盖了 SOURCE。

2023-11-26 19:30:07 1169

原创 Java 泛型知识总结

泛型是 JDK5 引入的特性,所谓参数化类型就是把类型当成参数一样传递,它使得一个类型在定义类、接口和方法时成为一个参数,类似于方法声明中的形式参数,不同之处在于形式参数的输入是值,而类型形参的输入是类型。

2023-11-26 15:18:42 847

原创 JDK 动态代理

代理模式会给某个对象提供一个代理对象,并由代理对象控制原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。代理模式一般会有三个角色:抽象接口:代理角色和真实角色对外提供的公共方法,一般为一个接口。真实角色:需要实现抽象接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。真正的业务逻辑在此。代理角色:需要实现抽象接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并。将统一的流程控制都放到代理角色中处理。一个简单的例子就是,业务中需要统计某些方法的执行时间。

2023-11-18 15:25:48 148

原创 Navigation 基本原理

Navigation 组件旨在用于具有一个主 Activity 和多个 Fragment 目的地的应用。主 Activity 与导航图相关联,且包含一个负责根据需要交换目的地的。在具有多个 Activity 目的地的应用中,每个 Activity 均拥有其自己的导航图。

2023-11-12 19:38:16 253

原创 ViewModel 基本原理

Activity 配置发生改变,如屏幕旋转时,会销毁原本的 Activity 再创建一个新的实例,会走一次 Activity 的生命周期。传统的应对方式是在 Activity 的 onCreate()/onSaveInstanceState() 中通过获取/保存 savedInstanceState 参数实现状态保存。但是在使用 ViewModel 后,就无须我们手动处理了。那么如何使用 ViewModel 来保存非配置数据呢?

2023-11-05 14:53:07 179

原创 DataBinding 基本原理

/</</更多使用方法与案例可参考官方文档。

2023-11-04 23:24:52 261

原创 LiveData 原理与 LiveData 总线

LiveData 是一种具有生命周期感知能力的可观察数据持有类,可以保证屏幕上的显示内容和数据一直保持同步。

2023-10-31 23:30:45 157

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除