- 博客(142)
- 收藏
- 关注
原创 ROCKX+RV1126人脸识别推流项目
本项目主要呈现的功能是通过采集摄像头的视频数据,并通过人脸识别把名称显示到VI数据,并推送到流媒体服务器上面。这个项目运用的功能很多,包括了rockx人脸检测、识别功能,sqlite3数据库存储人脸功能,rkmedia的VENC编码功能,rkmedia的VI采集功能,ffmpeg推流、OPENCV画框描绘文字功能。这个项目大部分功能都和第一阶段的功能点很像,包括vi采集数据、VENC编码、 FFMPEG推流等功能。所以我们这个项目的特色是在第一阶段推流的基础上添加了rockx。
2026-08-19 10:44:46
218
原创 OPENCV——ROCKX+RV1126实现1->N人脸识别功能
主流程是先读取单张图片的图像并提取人脸特征值,然后死循环获取VI的码流数据,然后用rockx的人脸检测模块RV1126的VI数据是否有人脸,如果有人脸则调用rockx的人脸识别模块识别出RV1126视频流的人脸数据并且提取出来。rockx_create的传参第一个参数rockx_handle_t结构体指针、 第二个参数rockx_module_t是。上面是rockx模块的初始化,这里我们要初始化两个rockx模块,分别是人脸检测rockx模块和人脸识别rockx模块。首先要创建OPENCV的矩阵。
2026-07-03 14:38:05
171
原创 OPENCV——ROCKX+RV1126检测人脸并进行拍照
获取每一帧VI模块的数据,并把每一帧VI模块的缓冲区和长度传输给rockx_image_t。具体的代码是rv1126_rockx_image.data = (uint8_t *)RK_MPI_MB_GetPtr(mb)(把每一帧VI缓冲区数据赋值到rockx_image_t的data)、rv1126_rockx_image.size = RK_MPI_MB_GetSize(mb)(把每一帧VI大小赋值到rockx_image_t的size)RV1126模块的初始化,拍照功能只需要初始化VI模块,并调用。
2026-07-02 17:19:22
283
原创 OPENCV——ROCKX+RV1126视频流检测人脸
具体的代码是rv1126_rockx_image.data = (uint8_t *)RK_MPI_MB_GetPtr(mb)(把每一帧VI缓冲区数据赋值到rockx_image_t的data)、rv1126_rockx_image.size = RK_MPI_MB_GetSize(mb)(把每一帧VI大小赋值到rockx_image_t的size)上图是rockx+rv1126的大体流程,首先要初始化模块包括VI模块、VENC模块、并启动VI模块采集视频流、rockx模块的初始化。
2026-07-02 14:03:11
616
原创 ROCKX——读取单张图片并检测图片内人脸的矩形
必须写绝对路径,不能写相对路径;路径要指到rockx_data根目录,不要指到face_det子目录里;确认目录下有对应算法的模型文件,权限正常可读。
2026-07-02 00:00:19
425
原创 OPENCV——RV1126+OPENCV在视频中添加时间戳
, 1+p->tm_mon(gmtime返回的月份是从0开始,换言之就是第一个月对应的索引值是0而不是1,所以我们要得到真正的月份都需要加1),p->tm_mday(日的输出,正常输出就行),8 + p->tm_hour(由于格林威治获取的小时和北京时间有8个小时的时差,因此我们要获取当前的本地时间需要+8小时才能够得到真实的小时),p->tm_min(分钟的输出,正常输出),p->tm_sec(输出秒数)。做完上述步骤后,把每一帧经过处理后的VI原始数据发送到H264的VENC编码器,调用的API是。
2026-06-30 17:17:18
307
原创 OPENCV——RV1126+OPENCV对视频流进行膨胀、腐蚀
线程的具体实现,首先我们要通过RK_MPI_SYS_GetMediaBuffer获取每一帧的VI视频原始数据,然后把每一帧的原始数据通过OPENCV转换成Mat矩阵。它的主要功能是获取VI原始数据并用OPENCV转换成Mat矩阵然后用dilate对其VI数据进行膨胀,然后把VI数据发送到VENC编码器。然后调用erode的对其Mat矩阵进行腐蚀,这里的膨胀参数我们设置成矩形和Size(15,15),具体的(关于这方面的参数设置,我们就不详细说了,因为这方面的内容之前的课程已经详细说过。
2026-06-30 13:10:32
290
原创 OPENCV——RV1126+OPENCV在视频中添加LOGO图像
前面我们学的都是在图片上进行操作,但是在真正用的时候都是在视频上,下面就是在视频上处理。
2026-06-29 23:13:06
377
原创 OPENCV——cvtColor和putText
这个代码里面我们分别读取两种图片,一种是RGB图片、另外一种是YUV灰度图像、分别用cvtColor把RGB图像转换成YUV图像、把YUV灰度图像转换成RGB图像、最后用imwrite保存两种图片。调用cvtColor把三通道的RGB图像转换为YUV的灰度图像,这里使用的是COLOR_RGB2YUV。是OPENCV中常见的功能,他主要的功能是在Mat矩阵里面显示显示文字,像下图。调用cvtColor把单通道的图像转换成RGB图像,调用的选项使用的是。读取YUV的灰度图像,这张图片是一张灰度的汽车图像。
2026-06-29 17:18:33
286
原创 OPENCV——形态学基础之膨胀、腐蚀
erode是OPENCV实现腐蚀效果的API第一个参数:src的类型是InputArray,它指的是输入图像,它可以是Mat类的数据。图像的通道数可以是任意数,但是图像的深度一般是CV_8UCV_16UCV_16SCV_32FCV_64F第二个参数:dst的类型是OutputArray,它指的是目标图像,值得注意的是输出图像的尺寸、类型要和输入图像是一致的。第三个参数:InputArray类型的kernel,膨胀操作的核。当这个值为NULL的时候,表示使用的核参考点默认是3*3。
2026-06-29 01:20:52
251
原创 OPENCV——图像面积计算
前两节课我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天这节课我们主要结合轮廓检测的API去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的API如等等。
2026-06-27 22:01:11
657
原创 OPENCV——查找图形轮廓
在OPENCV中通常使用findContours函数去寻找图片的轮廓,也是OPENCV中处理轮廓最重要的函数之一,它常用于找到二值图像中所有物体的轮廓。它的实现原理是通过扫描一张二值图像,然后找到所有的轮廓,并把所有的数据存储在向量里面。下面我们来看看findContours的函数定义。
2026-06-26 22:30:27
630
原创 OPENCV——图像叠加
图像叠加顾名思义就是在原图像里面,添加一些其他图像数据,最常见的就是在原图像中添加一些水印图像。这些水印图像可以是:时间戳、LOGO图像等等。如上图,原图像是山的背景,在这个图像的左上角叠加绿色的LOGO标志,然后两个图像就可以融合在一起。上面这个例子,就是最经典的图像叠加案例。
2026-06-25 16:31:22
368
原创 OPENCV——at函数遍历图像像素
AT函数是OPENCV中重要的函数之一,它的作用是修改Mat的矩阵某个像素值。换言之,我们需要修改图像中的像素点就需要利用AT函数去获取并且修改,AT函数的修改一般需要循环cols和rows然后对每个像素点进行修改,如上图。uchar类型的数组,长度为2, 它表示的是二维图像的位置信息、尺寸等等uchar类型的数组,长度为3,它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是uchar类型。
2026-06-24 16:14:05
368
原创 OPENCV——简介、交叉编译和Makefile
CC:C 语言交叉编译器,专门生成 ARM 架构二进制文件(不是 Ubuntu 本机 x86 编译器)CXX:C++ 交叉编译器,OpenCV 是 C++ 库,你的.cpp文件必须用这个编译ECHO:打印文字用,最后输出Build Done提示编译完成。
2026-06-23 17:15:36
271
原创 RV1126+FFMPEG多路码流监控项目——测试
执行这个命令,启动 nginx 后,程序会持续监听 1935 端口,接收 RV1126 发过来的 H.264 视频码流,把视频数据缓存到服务器内部。前面几章奖这个项目的代码都写完了,现在可以进行编译,放进板子里面测试了,编译烧录步骤我这里就不再赘述了,VI模块内容详细说了。同样新建规则,TCP 1935 端口,放行出站,保证 ffplay 播放器向外拉流不受拦截。,点击「Windows PowerShell」打开,手动切换到 nginx 目录。此时板子的终端,准备好执行命令,开始执行之后,
2026-06-22 02:03:05
415
原创 C++队列的使用
std::queue是 C++ 标准库提供的、只能在,不支持随机访问中间元素,非常适合任务排队、数据缓冲、生产者 - 消费者解耦等场景,本次推流项目中的码流缓存队列,本质就是基于这个数据模型实现的。在实际开发中队列发挥着巨大的作用,比方说多线程数据传输、缓存数据的存储、中间件的设计等等。从上面这张图我们可以看到,队尾入队了三个元素分别是1,2,3。1号数据最早入队、2号数据第二入队、3号数据最后入队。出队的时候,1号最早出队(pop1)、2号排在1号数据后面(pop2)、3号最后出队(pop3)。
2026-06-21 02:40:05
549
原创 RV1126+FFMPEG多路码流监控项目——高低分辨率码流推送流媒体
本章的内容主要是讲解如何通过高低分辨率队列的每一帧数据,并且通过FFMPEG推流器分别传输到高低码流分辨率流媒体服务器,本章节代码在rkmedia_assignment_manage.cpp和rkmedia_data_process.cpp里面。低分辨率编码码流推送的过程和高分辨率编码码流的推送的过程基本上一致,唯一的区别在于分辨率的设置。
2026-06-20 16:53:05
353
原创 FFMPEG——时间戳、时间基、时间转换
时间基与时间戳是 FFmpeg 音视频同步、有序播放的核心机制,也是推流开发中最容易踩坑的环节。所有音视频帧的播放顺序、音画对齐、封装传输,都依赖统一的时间刻度规则与转换逻辑。时间基也称之为时间基准,它代表的是每个刻度是多少秒。比方说:视频帧率是那它的时间刻度是{1,25}。相当于1s内划分出25个等分,也就是每隔1/25秒后显示一帧视频数据。具体的如下图所示:在FFMPEG中时间基准都是用它是的缩小,代表的是分子它是的缩小,代表的是分母。在视频时间基都是以帧率为单位,比方说25帧。FFMPEG就以。
2026-06-19 23:00:58
713
原创 FFMPEG——RTMP协议
传输基础:运行在 TCP 协议之上,面向连接、可靠传输,天然保证数据包不丢失、不乱序,适合公网稳定传输。格式绑定:RTMP 的音视频数据载荷原生承载 FLV Tag 格式数据,二者一一对应,这也是推流必须先把 H.264/AAC 封装成 FLV 的根本原因。协议变体RTMP:标准明文协议,默认 1935 端口,最常用;RTMPS:基于 TLS/SSL 加密的 RTMP,用于安全传输场景;RTMPT:封装在 HTTP 中的 RTMP,用于穿透防火墙。核心能力。
2026-06-19 01:51:04
238
原创 FFMPEG——FLV复合流
FLV 全称是美国公司推出来的一种流媒体协议。FLV流媒体格式的特点是封装过后的音视频数据非常小、并且封装的规范相对更加简单,所以FLV流媒体格式非常适合网络传输。但是FLV格式是Adobe公司的私有协议,所以它支持的网络传输协议比较有限:如RTMP、HTTP-FLV。
2026-06-18 23:19:26
446
原创 FFMPEG推流器——输出模块初始化
上一章了解了FFMPEG的重要结构体,这一章是对输出模块的初始化,输出模块的最大作用是对音视频推流模块进行初始化让其能够正常工作起来,RV1126的码流通过FFMPEG进行推流,输出模块一般由几个步骤。分别由。
2026-06-18 21:54:10
340
原创 FFMPEG推流器——重要结构体
FFmpeg 就是一套免费开源的音视频工具,被称作音视频领域的“瑞士军刀”,普通人能直接敲命令用,程序员能把它嵌进自己软件里调用。能干的事说白了就几类:市面上绝大多数播放器、直播软件、剪辑工具底层都靠它,不用自己从零写音视频处理代码,省事还兼容几乎所有音视频格式。在这个项目里,FFMPEG主要的作用是进行视频推流的功能,就是把RV1126编码的视频码流利用FFMPEG框架推送到流媒体服务器。FFMPEG中有六个比较重要的结构体,分别是AVFormatContext、AVOutputFormat、 AVStr
2026-06-18 12:14:39
447
原创 RV1126+FFMPEG多路码流监控项目——多线程获取高低分辨率码流
在ffmpeg_video_queue.cpp中对数据包结构体进行定义// 自定义视频数据包结构体,用于封装单帧编码后的码流数据// 码流数据存储缓冲区,定义最大缓存长度// 当前帧码流有效数据长度// 帧标记位,区分I关键帧 / P预测帧。
2026-06-17 22:20:48
280
原创 RV1126+FFMPEG多路码流监控项目——硬件模块初始化
以上就依次完成了VI、高分辨率VENC、RGA、低分辨率VENC四大核心硬件模块的配置与初始化,也是本项目视频数据流的前置基础。下面对整个硬件初始化流程、分工与运行逻辑做整体梳理,方便衔接后续多线程读取码流、处理数据与推流的内容。各模块核心分工VI 模块:作为整个项目的数据源头,驱动 CMOS 摄像头采集原始 1920×1080 NV12 格式视频画面,通过硬件缓冲区保障画面连续输出。高分辨率 VENC(通道 0)
2026-06-17 01:53:58
196
原创 RV1126+FFMPEG多路码流监控项目
本项目采用的是易百纳RV1126开发板和CMOS摄像头,使用的推流框架是FFMPEG开源项目。这个项目的工作流程如下(如上图):通过采集摄像头的VI模块,再通过硬件编码VENC模块进行H264/H265的编码压缩,并把压缩后的数据通过FFMPEG传输到两个流媒体服务器(如同时推送到流媒体服务器:rtmp://xxx.xxx.xx.xxx:1935/live/01和rtmp://xxx.xxx.xx.xxx:1935/live/02)。
2026-06-16 20:37:21
271
原创 RV1126——获取AAC码流
RV1126的AENC模块是音频编码模块,主要是对AI模块进来的数据进行音频编码压缩处理,并输出对应的音频压缩码流,下面是AENC模块在RV1126里面和AI模块的关系。
2026-06-16 02:23:42
402
原创 RV1126——多线程获取音频AI的pcm数据
头文件作用提供文件操作、内存分配、sleep 系统调用;线程头文件pthread.h:实现后台音频采集子线程;信号头文件signal.h:捕获 Ctrl+C 实现优雅退出;:瑞芯微 RKMedia 多媒体 SDK 总头文件,所有音视频接口依赖此文件。宏定义说明AUDIO_PATH:ALSA 声卡设备节点标识,原代码写default存在适配问题,修改为hw:0,0,匹配你板子arecord -l查询到的;AI_CHN:RKMedia 音频输入通道号,RV1126 单麦克风场景固定使用通道 0。
2026-06-15 22:19:14
191
原创 RV1126——OSD模块和SDL_TTF结合输出H264文件
字体文件fzlth.ttf必须放在程序同级目录,否则字体打开失败;SDL 1.2 无 Alpha 通道、无新版格式接口,只能手动构造;pitch行跨度是水印花屏的核心根源,必须逐行拷贝;RK OSD 位图强制16 字节对齐,对齐函数不可省略;所有、SDL 资源、媒体 Buffer 都必须手动释放。问题:水印区域出现彩色噪点 / 花屏原因:宽高、坐标未做 16 对齐;结构体未memset清零产生脏数据。解决:统一使用函数,所有局部结构体强制清零。问题:文字颜色错乱、重影、变色原因:未做。
2026-06-13 22:32:42
953
原创 RV1126——交叉编译 SDL_TTF库并渲染文字
SDL_TTF 是一款轻量级、跨平台的 TrueType 字体渲染开源库,必须依赖 SDL 基础图形库运行。它底层调用 FreeType2 内核解析.ttf.ttc等主流字体文件,开发者无需手动编写字体点阵、轮廓绘制逻辑,仅调用简单 API 就能快速渲染出不同字号、颜色的文字。程序调用 SDL_TTF 加载自定义字体文件;渲染时间、设备编号、通道名称等文本,生成标准位图数据;将位图数据传入 RV1126 RKMedia OSD 接口,由硬件完成画面叠加。
2026-06-13 15:21:57
431
原创 RV1126——OSD模块
初始化 VI 视频采集通道 → 开启采集;初始化 VENC 编码通道 → 开启编码;调用初始化 OSD 模块;绑定 VI 与 VENC 数据流;启动业务线程:渲染文字 / 图片,生成像素数据;填充BITMAP_S结构体;循环调用刷新 OSD 图层;程序退出:解除绑定 → 销毁 VENC → 关闭 VI。
2026-06-12 23:27:17
391
原创 RV1126——GOP模式调节画面质量
NormalP 普通模式:通用性最强、零延迟、兼容性最好。适合常规室内监控、固定录像、基础预览,是新手开发、基础实验的默认首选。SMARTP 智能模式:监控场景最优解。静态省码率、动态保画质,兼顾清晰度和存储带宽,是商用 IPC 设备的主流方案。TSVC 分层模式:弱网专属。主打网络自适应、抗卡顿,专门用于无线、移动、4G/5G 等不稳定网络环境。RV1126中设置GOP模式的结构体和API1.5 RV1126的GOP属性结构体。
2026-06-10 23:26:38
342
原创 RV1126——视频编码增强模块QP调节
纯 CBR 模式一定要加 QP 限制:不管码率设置多高,都建议配置 MaxQp,防止复杂场景下画质崩塌,一般监控场景 MaxQp 设置在 28~32 之间比较合适;I 帧 QP 区间可以单独调低:I 帧作为关键帧,画质会影响整个 GOP 的画面,建议把 MaxIQp 设置得比普通帧更低,比如普通帧 MaxQp=30,I 帧 MaxIQp=25,保证关键帧的清晰度;根据场景调整 QP 区间:本地录像场景可以把 QP 区间设得更低(MaxQp=25),保证画质;
2026-06-10 18:27:10
670
原创 RV1126——多线程获取高分辨率和低分辨率的H264码流
掌握了嵌入式摄像头高低双分辨率的标准工程架构;理解 RGA 硬件缩放 + 双 VENC 并行编码的核心原理;通过多线程隔离,实现两路码流同时稳定获取、同时保存;这套架构是后续双路 RTSP 推流、双路 MP4 录像、预览 + 录像分离的底层基础。
2026-06-09 11:55:59
197
原创 RV1126——多线程分别获取H264码流和H265码流
RKMedia 框架下,H264、H265 取流逻辑完全通用,仅需修改编码类型参数即可切换;多线程取流是 VENC 码流获取的标准写法,能有效避免主线程阻塞、丢帧问题;H265 压缩率更高,适合存储录像场景;H264 兼容性强,适合直播推流场景;取流后必须释放缓存,是保证编码器长期稳定运行的关键。
2026-06-08 13:53:20
238
原创 RV1136——获取VENC的H264码流
在 RKMedia 架构里,VENC 是负责硬件编码的模块。它会把 VI 采集、RGA 缩放后的图像,自动压缩成 H.264 码流。但有一个关键点:编码出来的 H.264 数据,不能直接在主线程里读,必须开一个独立线程去取。主线程要负责模块初始化、链路管理;取码流是一个阻塞等待的过程;如果不放线程里,会导致整个程序卡住,甚至丢帧。所以这一章的核心就是:初始化 VENC → 绑定 RGA 与 VENC → 开线程循环取 H.264 数据 → 保存文件。
2026-06-06 23:37:54
831
原创 RV1126——视频编码原理
码率控制指的是利用编码中的一些特殊手段控制图像的压缩比例,使其画面质量在不同的场景中保持一个最优的状态。RV1126的码率控制方式,总共分为三种:分别是CBR固定码率控制模式、VBR可变码率控制模式、AVBR码率控制模式。5.2.1 CBR控制码率详解。
2026-06-05 23:58:48
248
原创 RV1126——获取RGA模块的数据
RGA_INFO_S(输入 / 输出图像描述)(单幅图像信息)// 图像格式:NV12/NV21/RGB888等// 裁剪起始X坐标(左上角)// 裁剪起始Y坐标// 有效图像宽// 有效图像高// 行跨度(内存宽度,≥u32Width)// 列跨度(内存高度,≥u32Height)RGA_ATTR_S(创建 RGA 通道入参)// 输入端图像配置(来自VI)// 输出端图像配置(缩放后)// 旋转角度:0/90/180/270。
2026-06-05 15:19:50
609
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1