- 博客(113)
- 收藏
- 关注
原创 【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统
本文主要介绍我最近开发的一个个人实战项目,“基于深度学习的人脸门禁+ IPC 智能安防监控系统”,全程满帧流畅运行。这个项目我目前全网搜了一圈,还没发现有相关类型的开源项目。这个项目只要稍微改进下,就可以变成市面上目前流行的三款产品,人脸识别门禁系统、IPC 安防和 NVR。在最下面会有视频演示。
2025-02-08 09:03:24
2283
7
原创 在 Vscode 中搭建嵌入式 Linux 通用 windows、mac、linux 平台的 docker 容器开发环境
在日常工作中,由于各种原因,我们的电脑可能与同事的电脑存在一些差异,有时候是操作系统的差异(A 同事用的是 Linux,B 同事的是 Windows,而你用的是 Mac),有时候是依赖库环境的差异(A 同事安装了 opencv 1.2,B 同事安装了 opencv 2.3)。而解决这些差异性的问题就成为了重中之重,好在现在世界上最流行的 IDE Vscode 提供了基于 docker 容器的开发环境构建,可以让不同平台不同环境下的电脑在开发时都保持一致,得到同样的开发体验。
2025-02-08 09:00:00
931
原创 瑞芯微 Rockchip 系列 RK3588 部署 yolo11 模型推理教程
在上一篇文章中,我介绍了如何在瑞芯微 Rockchip 系列芯片将主流深度学习框架模型转换为 RKNN 模型。在这篇文章,我将介绍如何在瑞芯微 Rockchip 系列 RK3588 芯片上部署 yolo11 模型推理。本文章会使用到上一篇文章转换的 rknn 模型,因此如果还没看过上一篇文章的同学,建议优先阅读上一篇文章。本教程不仅适合 RK3588 平台,也适合其他 RK 系列平台,例如 RK3566、RK3568、RK3562 等。具体平台请参考RKNN-Toolkit2 文档。
2025-02-07 10:54:22
2256
2
原创 瑞芯微 Rockchip 系列 RK3588 主流深度学习框架模型转成 rknn 模型教程
在瑞芯微 Rockchip 芯片上进行 NPU 推理,需要先将模型文件转换成 rknn 模型文件,才能执行各种推理任务。本文将介绍如何安装各种工具,并最终实现将各种深度学习框架的模型文件转换成 rknn 文件。本教程不仅适合 RK3588 平台,也适合其他 RK 系列平台,例如 RK3566、RK3568、RK3562 等。具体平台请参考RKNN-Toolkit2 文档。本文介绍了如何在 RK3588 平台上进行主流深度学习框架模型转换,并提供了完整的示例代码。希望对大家有所帮助。
2025-02-07 09:00:00
2191
原创 FFmpeg 头文件完美翻译之 libswresample 模块
众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库。
2025-02-07 09:00:00
365
原创 FFmpeg 头文件完美翻译之 libavutil 模块
众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库。
2025-02-06 09:45:00
481
原创 FFmpeg 头文件完美翻译之 libavformat 模块
众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库,下载到本地慢慢品读
2025-02-06 09:30:00
868
原创 FFmpeg 头文件完美翻译之 libavdevice 模块
众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库。
2025-02-05 14:00:00
477
原创 FFmpeg 头文件完美翻译之 libavfilter 模块
众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库。
2025-02-05 14:00:00
518
原创 FFmpeg 头文件完美翻译之 libavcodec 模块
众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库,下载到本地慢慢品读
2025-01-22 09:43:54
1236
原创 瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 RGA 2D 图形操作硬件加速-代码版
在上一篇文章中,我介绍了 ffmpeg-rockchip MPP 硬编解码的代码实现方式。在这篇文章,我将介绍 ffmpeg-rockchip RGA 的代码实现方式。RGA 是一个用于图像缩放、旋转、bitBlt、alpha混合等常见的2D图形操作的硬件单元,它的应用场景很广泛,比如可以将 4k 视频缩小到 1080p,再比如可以用于 yolo 模型推理的预处理阶段,提高整个处理链路的效率。本文不仅适用于 RK3588,还适用于 RK 家族系列的芯片,具体的细节可查看官方 RGA 文档。下面分别介绍。
2025-01-13 09:07:34
1830
9
原创 瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版
在上一篇文章中,我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速,在这篇文章,我将讲解如何使用 ffmpeg-rockchip 用户空间库(代码)实现 MPP 硬件编解码。本文不仅适用于 RK3588,还适用于 RK 家族系列的芯片,具体的细节可查看官方 MPP 文档。
2025-01-13 09:02:14
3838
29
原创 瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 硬件编解码和 RGA 图形加速-命令版
最近使用 RK3588 在做音视频项目开发,过程中使用了该芯片提供的硬件编解码和 2D 图形加速能力,发现相比软编解码,硬编解码无论是处理速度、系统负载还是稳定性,都比软编解码强太多了。本文将分享如何使用 RK 提供的 FFmpeg + MPP + RGA,实现一个硬件编解码+2D图形加速的功能,全部使用命令行来完成。后面也会出一篇使用开发库实现的源码版。本文不仅适用于 RK3588,也还适用于其他 RK 系列的芯片,具体的细节出入请参考官方文档。
2025-01-06 08:59:50
6636
50
原创 瑞芯微 RK 系列 RK3588 CPU、GPU、NPU、VPU、RGA、DDR 状态查看与操作
本文介绍瑞芯微 RK 系列 RK3588 CPU、GPU、NPU、DDR、VPU、RGA 的查看与操作方式
2024-12-30 13:40:57
2927
原创 线程池浅析
线程池是一组预先初始化并准备执行任务的线程集合。与为每个任务反复创建线程并在之后销毁它们不同,线程池的做法是维护一组预先创建的线程,这些线程可以被重复利用来同时执行多个任务。通过这种方式,我们可以减少由于线程的创建和销毁所带来的开销。
2024-12-27 09:16:49
301
原创 一文搞懂 RGB 与 YUV
第一个 4 表示每个像素都有一个亮度分量(Y),第二个 4 表示每个像素都有一个 U 色度分量,第三个 4 表示每个像素都有一个 V 色度分量。4:2:0 表示第一个 4 表示每个像素都有一个亮度分量(Y),第二个 2 表示每两个像素共享一个 U 色度分量,第三个 0 表示每四个像素共享一个 V 色度分量(即每两个像素共享一个色度分量)。4:2:2,第一个 4 表示每个像素都有一个亮度分量(Y),第二个 2 表示每两个像素共享一个 U 色度分量,第三个 2 表示每两个像素共享一个 V 色度分量。
2024-12-25 09:31:03
1549
原创 V4L2 使用教程
V4L2,全称为 Video for Linux 2,是 Linux 操作系统上的一个内核框架,旨在支持视频设备。V4L2 是 V4L 的第二版,V4L2 修复了一些设计缺陷,并开始出现在 2.5.x 内核中。它提供了一组 API 和驱动接口,使得用户空间应用程序能够与摄像头和电视卡等各种视频设备进行交互。
2024-12-18 08:01:07
945
原创 用 docker 搭建一个统一的 buildroot 编译环境
之前在团队协同开发过程中,经常因为每个人开发环境不一致,导致 buildroot 编译有人成功有人失败。为了解决这个问题而进行了一些方案调研,最终选择 docker 这个方案,docker 的优点是轻量化、跨平台,无论是在 windows、linux 还是 mac,都能统一构建环境。本文将手把手教你如何构建一个 docker 镜像并运行容器来编译 buildroot。
2024-12-16 09:00:00
584
原创 WebRTC 详解
之前在做智能家居网关项目时,用到 WebRTC 技术,使用 C++ 实现了浏览器可以通过 WebRTC 直接观看摄像头的功能。这里分享下之前记录的 WebRTC 的笔记。2010 年 5 月,谷歌收购了 Global IP Solutions(简称 GIPS),这是一家专注于 VoIP 和视频会议软件的公司,已开发出 RTC 所需的多项关键组件,如编解码器和回声消除技术。谷歌随后将 GIPS 技术开源,并与 IETF 和 W3C 等标准机构合作,以确保行业共识。
2024-12-13 17:54:23
906
原创 Linux D-Bus 详解
在构建复杂应用或服务时,经常会遇到进程间通信的问题。DBus 提供了一个高效、可靠的解决方案,使得不同程序之间可以轻松地进行消息交换和远程调用。本篇文章将带你详细了解 DBus 的工作机制及如何在你的项目中有效利用这一技术。D-Bus是 Linux 及其他类 Unix 系统下的一种进程间通信机制(IPC)。那什么是进程间通信机制(IPC)呢?
2024-12-09 09:00:00
2451
原创 基于LVGL9.0、FFmpeg、OpenCV的Linux智能家居监控安防系统(含演示视频)
智能家居监控安防系统是一个集成监控、安防、人脸识别、环境监测、家居控制的一体化系统。视频监控:支持查看摄像头、拍照、录像、直播和检测到人体时自动拍照,支持同时开启或单个开启,支持浏览图片和视频文件;人脸识别:人脸前后比对检测,模拟人脸识别开门的场景;报警设置:检测到人体时自动报警,通过蜂鸣器模拟报警;环境检测:当前环境的温湿度检测,通过MQTT协议通信;家居控制:通过MQTT协议控制LED灯,模拟真实家居控制场景;
2024-07-25 13:51:19
1737
4
原创 基于LVGL9.0、V4L2的Linux相机项目(含演示视频)
Linux相机是一个基于V4L2驱动的项目,支持拍照、调整相机亮度参数、浏览图片、下载图片,提供了 GUI 的交互界面。
2024-07-22 09:00:00
1427
2
原创 Bash Shell 速查表 Cheat Sheet
合并 => foo1 foo2 A B C D# declare 语法Numbers+=(4 5) # 追加 => 1 2 3 4 5myfunc() {echo "你好 $1"# 同上(另一种语法)echo "你好 $1"
2024-07-11 08:55:33
476
原创 C++ 容器 API 速查表 Cheat Sheet
容器适配器(Container Adapters)是一种容器类,它们提供了特定用途的接口,通过限制和重新定义基础容器(如。是一个无序的关联容器,允许多个元素拥有相同的键,使用哈希函数来组织元素。是一个无序集合,允许多个元素拥有相同的键,使用哈希函数来组织元素。可以通过在模板参数中指定自定义哈希函数和比较函数来改变默认行为。可以通过在模板参数中指定自定义哈希函数和比较函数来改变默认行为。可以通过在模板参数中指定自定义哈希函数和比较函数来改变默认行为。是一个无序的关联容器,使用哈希函数来组织元素。
2024-07-10 08:55:20
665
原创 LVGL V9 加载中文字体教程
之前在使用 LVGL v9 进行项目开发过程中,发现默认情况下是不支持显示中文字体的,而我们常常需要在实际项目中显示中文字符,在阅读官方文档并进行一段时间的实践摸索后,最终解决了该问题。本篇文章将先讲解 LVGL 默认内置的几种字体,然后讲解如何更改内置字体引擎的字体,最后再讲解如何使用 freetype 字体引擎。废话不多说,马上进入正题。
2024-07-06 17:13:24
3369
4
原创 Makefile 速查表 Cheat Sheet
不使用$(eval)endefall:输出$ make使用$(eval)endefall:输出$ makelibfoo.solibbar.so。
2024-07-05 09:30:00
800
原创 LVGL V9 CMake构建源码刨析
最近在基于LVGL v9版本进行项目开发,在开发过程中顺便研究了整个项目的CMake构建原理,以可以支持更好的自定义。因此本篇文章将刨析LVGL v9项目的CMake构建原理,让我们对LVGL v9的项目框架有个更好的理解。通过上面的刨析,我们了解到其实LVGL项目的CMake构建原理也不过如此。CMake的出现是为了解决跨平台构建的问题,它很大程度上提升了搭建项目框架的效率,是一个非常值得掌握的小技能之一。
2024-07-04 14:15:00
3718
2
原创 Linux 中断机制详解
在日常的Linux驱动程序开发过程中,我们经常需要与中断机制打交道。这篇文章将从中断相关概念开始,并介绍Linux中的中断机制,最后以实现一个简单的按键中断驱动程序结束,话不多说,马上开始~
2024-06-28 11:35:47
1600
原创 CMake 实战入门教程
之前学习CMake是通过官方教程文档进行学习的,在学习中发现,CMake官方的教程文档没有详细介绍每个命令和变量的用法,这也导致学一半时会感觉一头雾水。但它也并不无优点,官方教程文档采用了渐进式的实战教程方式,非常注重学习过程中的实践,这一点是很可贵的。为了加深命令和变量的理解,我查阅了很多api文档才搞明白。因此,为了跟大家分享更好的CMake学习文档,本教程诞生了。
2024-06-25 10:09:13
1284
1
原创 C++ 11
移动语义通过右值引用实现,它允许对象的资源从一个对象转移到另一个对象,而不是进行拷贝。右值引用使用&&语法表示。// 42是一个右值,rref是一个右值引用右值引用是一种可以绑定到右值(临时对象或即将销毁的对象)的引用类型。右值引用的语法为T&&,其中T是某种数据类型。与传统的左值引用(T&)不同,右值引用专门用于捕获右值。// 42是一个右值,rref是一个右值引用转发引用是指在模板中,通过类型推导得到的右值引用。具体来说,当模板参数使用T&&
2024-06-22 09:37:31
935
原创 文件输入/输出(Input/output with files)
ofstreamifstreamfstream这些类直接或间接继承自istream和ostream类。cin是istream类的对象,cout是ostream类的对象。因此,我们已经在使用与文件流相关的类。实际上,我们可以像使用cin和cout一样使用我们的文件流,唯一的区别是我们必须将这些流与物理文件关联。这个代码创建一个名为的文件,并向其中插入一句话,就像我们用cout做的那样,但使用的是文件流myfile。
2024-06-21 09:08:17
932
原创 预处理指令(Preprocessor directives)
要定义预处理宏,可以使用#define。当预处理器遇到该指令时,它会在代码的其余部分中将所有identifier替换为。这个可以是一个表达式、语句、代码块或任何内容。预处理器不理解真正的 C++ 语法,它只是简单地将所有identifier替换为。100在预处理器替换了TABLE_SIZE#definea : ba : ba : ba : b?a : ba : b这将替换所有带有两个参数的getmax// 函数宏。
2024-06-21 09:06:37
1031
原创 异常(Exceptions)
异常提供了一种在程序中应对异常情况(如运行时错误)的方法,通过将控制转移到特殊函数(称为处理程序)来实现。要捕获异常,可以将一部分代码放在异常检查之下。这是通过将这部分代码放在try块中来实现的。当在该块中出现异常情况时,会抛出一个异常,将控制转移到异常处理程序。如果没有抛出异常,代码将正常继续执行,所有处理程序都将被忽略。异常通过在try块内使用throw关键字来抛出。异常处理程序使用关键字catch声明,必须紧接在try处理异常的代码被包裹在try块中。表达式接受一个参数(在本例中是整数值20。
2024-06-21 09:05:18
727
原创 类型转换(Type conversions)
可以在相关类的指针之间执行转换,不仅可以上转(从派生类指针转换为基类指针),还可以下转(从基类指针转换为派生类指针)。还可以将多态类(那些具有虚成员的类)从基类指针转换为派生类指针(即“下转”),前提是指向的对象是目标类型的完整对象。还可以执行指针之间的其他隐式转换:在指针类型之间(即使在不相关的类之间)转换空指针,以及将任何类型的指针转换为。将任何指针类型转换为任何其他指针类型,即使是不相关类的指针类型。不受限制的显式类型转换允许将任何指针转换为任何其他指针类型,而不考虑它们指向的类型。
2024-06-21 09:04:21
1065
原创 多态(Polymorphism)
抽象基类与上例中的Polygon类非常相似。它们是只能用作基类的类,因此允许有不带定义的虚成员函数(称为纯虚函数)。语法是将它们的定义替换为=0(等号和零):抽象基类Polygon// 抽象类 Polygonprotected:public:{ width=a;height=b;注意area没有定义;它被替换为=0,这使其成为纯虚函数。包含至少一个纯虚函数的类称为抽象基类。抽象基类不能用于实例化对象。因此,这个抽象基类版本的Polygon// 如果 Polygon 是抽象基类,则无法工作。
2024-06-21 09:02:44
630
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人