![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
NDK
文章平均质量分 96
Android NDK 文章
tmacfrank
这个作者很懒,什么都没留下…
展开
-
OpenGL 入门(四)—— 贴纸与美颜滤镜
本篇我们来介绍贴纸效果与美颜滤镜的实现。原创 2024-05-08 20:00:48 · 1034 阅读 · 0 评论 -
OpenGL 入门(三)—— OpenGL 与 OpenCV 共同打造大眼滤镜
从本篇开始,会在上一篇搭建的滤镜框架的基础上,介绍具体的滤镜效果该如何制作。本篇会先介绍大眼滤镜,先来看一下效果,原图如下:使用手机后置摄像头对眼部放大后的效果:下面让我们一步步来实现这个效果吧。原创 2024-05-08 19:53:06 · 1251 阅读 · 2 评论 -
OpenGL 入门(二)—— 渲染摄像头采集的预览画面
Android 通过 OpenGL 绘制图像以及滤镜添加原创 2024-05-06 16:57:23 · 1174 阅读 · 1 评论 -
OpenCV 入门(七)—— 身份证识别
利用 OpenCV 实现身份证识别 Demo 效果:实际上身份证识别、银行卡识别都是相同的思路。原创 2024-05-06 16:48:40 · 1972 阅读 · 1 评论 -
OpenCV 入门(六) —— Android 下的人脸识别
本篇我们来介绍在 Android 下如何实现人脸识别。上一篇我们介绍了如何在 Windows 下通过 OpenCV 实现人脸识别,实际上,在 Android 下的实现的核心原理是非常相似的,因为 OpenCV 部分的代码改动不大,绝大部分代码可以直接移植到 Android 上。最主要的区别是,Android 摄像头采集图像的代码要复杂一些,而 Windows 下几行代码就搞定了。我们会介绍 Camera1 和 CameraX 两种方式。原创 2024-05-04 22:59:41 · 3341 阅读 · 3 评论 -
OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别
人脸识别需要人脸模型(特征集合)的支持,人脸定位的速度与准确度取决于模型。OpenCV 提供了已经训练好的模型,无论是 Windows 版本还是 Android 版本的 SDK,都在 etc 目录下提供了两种级联分类器模型:Haarcascades 基于 Haar-like 特征(哈尔特征)的级联分类器。Haar-like 特征是一种基于像素差值的特征描述方法,通过计算图像中不同区域的像素值之和的差异,来捕捉图像中的纹理和形状信息。原创 2024-05-04 12:17:17 · 3627 阅读 · 1 评论 -
OpenCV 入门(四)—— 车牌号识别
OpenCV车牌识别原创 2024-05-03 12:13:39 · 2952 阅读 · 2 评论 -
OpenCV 入门(三)—— 车牌筛选
支持向量机(Support Vector Machine,SVM)是一类按监督学习(Supervised Learning)方式对数据进行二元分类的广义线性分类器。用通俗的话来讲,就是用来分类,或者说挑选东西的。对于车牌识别而言,车牌定位的候选车牌图可以分为两类:车牌与非车牌。SVM 可以对候选图进行测评,告诉我们图中的是不是车牌,相似程度是多少。当然,SVM 可以进行分类的前提还是我们使用正负样本对其进行了训练。原创 2024-05-03 11:37:06 · 1315 阅读 · 2 评论 -
OpenCV 入门(二)—— 车牌定位
车牌定位:从整张图片中识别出牌照,主要操作包括对原图进行预处理、把车牌从整图中抠出字符分割:将牌照中的字符进行切割字符识别:识别单个字符,然后拼接成字符串本节是 OpenCV 车牌识别的第一节课,主要完成了车牌定位的工作。为了找出图像中的蓝色部分,需要检查 RGB 分量中的 Blue 分量就可以了。原创 2024-05-02 14:24:14 · 2819 阅读 · 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 · 2314 阅读 · 3 评论 -
OpenGL 入门(一)—— OpenGL 基础
OpenGL(Open Graphics Library)是图形领域的工业标准,是一套跨编程语言、跨平台、专业的图形编程(软件)接口。它用于二维、三维图像,是一个功能强大,调用方便的底层图形库。它与硬件无关,可以在不同的平台如 Windows、Linux、Mac、Android、IOS 之间进行移植。因此,支持 OpenGL 的软件具有很好的移植性,可以获得非常广泛的应用(比如 PS 在部分功能和操作中使用 OpenGL 加速,以提高图像处理和渲染的性能)。对于 Android 系统而言,它支持的是 Ope原创 2024-05-01 23:41:17 · 4580 阅读 · 0 评论 -
RTMP 直播推流 Demo(二)—— 音频推流与视频推流
上一节我们对项目进行了配置,并且实现了摄像头预览,摄像头采集到的图像数据已经可以通过 LivePusher 传递到 Native 层,接下来就可以开始音视频编码与推流了。原创 2024-05-01 22:35:31 · 1869 阅读 · 0 评论 -
RTMP 直播推流 Demo(一)—— 项目配置与视频预览
RTMP 直播推流 Demo(二)—— 音频推流与视频推流前面的视频播放器 Demo 是在拉流端进行音视频解码,接下来介绍的 RTMP 直播推流的 Demo 是推流端进行音视频编码。Android 设备作为推流端将摄像头拍摄的图像上传至服务器,在 PC 端通过 FFmpeg 提供的 ffplay 工具或者 EVPlayer 拉流播放视频。原创 2024-04-30 22:06:14 · 2009 阅读 · 4 评论 -
Android 音视频播放器 Demo(二)—— 音频解码与音视频同步
本篇会介绍音频的解码与渲染、音视频同步以及进度条的实现。原创 2024-04-30 21:38:31 · 2163 阅读 · 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 · 1695 阅读 · 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 · 1347 阅读 · 1 评论 -
NDK 编译(三)—— CMake 原生构建工具
在 Android Studio 2.2 及以上,构建原生库的默认工具是 CMake。CMake 是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的 makefile 或者 project 文件。CMake 并不直接构建出最终的软件,而是产生其他工具的脚本(如 makefile),然后再依据这个工具的构建方式使用。原创 2024-04-28 17:32:52 · 806 阅读 · 0 评论 -
NDK 编译(二)—— NDK 编译与集成 FFmpeg
在使用 NDK 进行音视频开发时,势必会用到 FFmpeg,因此我们要知道如何编译 FFmpeg 并将其集成到 Android 项目中。原创 2024-04-28 17:31:54 · 1969 阅读 · 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 · 954 阅读 · 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 · 936 阅读 · 0 评论 -
NDK 入门(二)—— 调音小项目
FMOD Ex 声音系统是为游戏开发者准备的革命性音频引擎,像 cocos2d,unity3d 游戏引擎默认就集成了 fmod。如今采用了 FMOD 作为音频引擎的游戏包括 Far Cry(孤岛惊魂)、Tom Clancy's Ghost Recon(幽灵行动),甚至著名的 World Of Warcraft(魔兽争霸)。原创 2024-04-28 16:42:21 · 1294 阅读 · 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 · 1455 阅读 · 2 评论 -
NDK 入门(四)—— 静态缓存与 Native 异常
throw "我报废了";// 更加简单的写法 自定义异常public:return "自定义";Student s;throw s;try {// 抛的是 const char *,因此捕获也是这种类型cout原创 2024-04-28 16:41:14 · 1863 阅读 · 0 评论 -
NDK 基础(五)—— C++ 高级特性2
在 C++ 中,左值(lvalue)和右值(rvalue)是用于描述表达式的术语,它们与赋值操作和内存中对象的生命周期有关。**左值(lvalue)**是指可以出现在赋值操作符左侧的表达式,它通常具有持久的身份(identity)和内存位置。左值可以是变量、对象、函数或表达式,它们具有可寻址(addressable)的属性,可以获取其地址。例如:**右值(rvalue)**是指不能出现在赋值操作符左侧的表达式,它通常是临时的、没有持久身份的值。右值可以是字面量、临时对象、表达式的结果等。右值不能直接获取其原创 2024-04-27 22:26:01 · 1088 阅读 · 1 评论 -
NDK 基础(四)—— C++ 高级特性1
STL(Standard Template Library)译为标准模板库,它是一套强大的标准库,是 C++ 标准库的一部分,在 iostream 中。STL 提供了包括容器在内的许多常用的数据结构和算法,以及用于操作这些数据结构的迭代器。STL 被分为 STL 包、算法包和迭代器,是为了提供更好的模块化和可扩展性:将 STL 划分为 STL 包、算法包和迭代器的主要目的是提供模块化的设计,并促进代码的重用和扩展。这种划分使得开发人员可以根据具体的需求选择性地使用STL的不同部分,同时也使得 STL 的设计原创 2024-04-27 22:18:17 · 695 阅读 · 0 评论 -
NDK 基础(三)—— C++ 语言基础与特性2
C++ 中的可变参数(Variadic Parameters)是一种特性,允许函数接受可变数量的参数。这使得我们可以定义接受不同数量或不同类型参数的通用函数。可变参数的处理是通过使用特殊的语法和标准库中的相关功能来实现的。原创 2024-04-27 22:11:29 · 639 阅读 · 0 评论 -
NDK 基础(二)—— C++ 语言基础与特性1
当我们显式定义拷贝构造函数后,默认的会被覆盖掉。// 使用常量引用作为参数,避免修改原对象cout原创 2024-04-27 21:52:40 · 907 阅读 · 0 评论 -
NDK 基础(一)—— C 语言知识汇总
过往的例子中有很多代码因为 IDE 不同致使写法也不同,在结构体上体现的尤为明显。但是在 VS 中就不用写 struct 关键字。为了避免一份代码放在不同的 IDE 中可能无法运行的情况,可以使用 typedef 关键字定义类型别名来解决这个问题。在 C 语言中,typedef关键字用于为已有的数据类型创建新的类型别名。它的作用是使代码更易读、更具可维护性,并提供了一种简化和抽象数据类型的方式,是 C 语言中非常有用的特性之一。通过使用typedef。原创 2024-04-27 21:40:09 · 764 阅读 · 0 评论