RV1126+OPENCV在视频中添加LOGO图像

一.RV1126+OPENCV在视频中添加LOGO图像大体流程图

主要是利用RV1126的视频流结合OPENCV的API在视频流里面添加LOGO图像,换言之就是在RV1126的视频流里面叠加图片。大体流程我们来看上图,要完成这个功能我们需要创建两个线程(实际上还有初始化过程,这里先忽略了),第一个线程是opencv_vi_logo_handle_thread它主要是获取VI原始数据并有OPENCV转换成Mat矩阵然后添加LOGO图像,并把VI数据发送到VENC编码器。

第二个线程是get_venc_stream_thread它主要是获取H264的VENC码流数据,并且保存到H264文件

二.具体代码实现

上图我们已经说了大概的流程图,这部分我们重点讲解代码的实现


2.1. RV1126模块初始化并启动VI工作

2.2VENC模块初始化

我们之前的很多实战都没有使用这个函数开启视频流,那是因为很多时候VI模块我们都与其他模块绑定了,所以不需要,这里我们并没有和任何模块绑定,需要开启这个

上面代码是RV1126模块的初始化,包括VI模块的初始化(RK_MPI_VI_SetChnAttr)、使能VI模块(RK_MPI_VI_EnableChn)、VENC模块的初始化(RK_MPI_VENC_CreateChn)、启动VI工作(RK_MPI_VI_StartStream)。关于这方面的参数设置,我们就不详细说了,因为这方面的内容之前的课程已经详细说过。

2.3创建线程

2.4 创建opencv_vi_logo_handle_thread线程 

上面是opencv_vi_logo_handle_thread的具体实现。

1.我们要通过imread读取图片

2.把图片cvtColor转换成灰度图片

(由于VI模块的图像格式是NV12,所以我们的图片必须要以灰度图的方式进行添加)。

3.调用RK_MPI_SYS_GetMediaBuffer获取每一帧的VI视频原始数据

#4.使用OPENCV的API把每一个视频数据转换成Mat矩阵

具体的操作是:

Mat rv1126_img_mat = Mat(HEIGHT, WIDTH, CV_8UC1, RK_MPI_MB_GetPtr(mb)),

K_MPI_MB_GetPtr(mb) 是一个函数调用,返回一个指向内存块的指针

mb 是一个媒体缓冲区对象(Media Buffer)

这个构造函数直接使用外部内存,而不是为矩阵分配新内存

函数原型:
Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
参数含义:
rows:矩阵的行数(HEIGHT)
cols:矩阵的列数(WIDTH)
type:矩阵的数据类型(CV_8UC1)
data:指向数据的指针(RK_MPI_MB_GetPtr (mb))
step:每行数据的字节数(默认为 AUTO_STEP,自动计算)

通过Mat的构造器,就可以把RV1126的VI视频数据转换成Mat,转换成Mat之后,我们就需要对Mat进行图层叠加操作。

5.Mat叠加操作

需要分两步

第一步:先创建一个感兴趣区域

Mat rv1126_img_mat_roi=rv1126_img_mat(Rect(100,100, logo_img.cols, logo_img.rows))

这个感性区域的长宽要与logo图片的一致

第二步:利用copyTo函数把读取的图片拷贝到感兴趣区域rv1126_img_mat_roi

 具体代码是logo_img.copyTo(rv1126_img_mat_roi)

6.要把RV1126叠加过后的视频VI数据发送到H264的VENC编码器

调用的API是RK_MPI_SYS_SendMediaBuffer

2.4 创建get_venc_stream_thread线程 

上面是get_venc_stream_thread的具体实现,在这个线程里面要通过RK_MPI_SYS_GetMediaBuffer获取每一帧H264的编码数据,然后用fwrite写入。

2.5 输出结果:

经过上面的编码后,我们来看看输出的H264文件。可以看到这个H264文件,嵌入了JPG图片。这个效果就实现了用OPENCV图片叠加的功能对RV1126的视频流进行图片LOGO的添加
 

int ret;VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = CAMERA_PATH;        // Pathvi_chn_attr.u32Width = WIDTH;                 // Widthvi_chn_attr.u32Height = HEIGHT;               // Heightvi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;       // ImageTypevi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP; // BufTypevi_chn_attr.u32BufCnt = 3;                    // Cntvi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL; // Moderet = RK_MPI_VI_SetChnAttr(CAMERA_ID, CAMERA_CHN, &vi_chn_attr);if (ret){printf("Vi Set Attr Failed.....\n");return 0;}else{printf("Vi Set Attr Success.....\n");}ret = RK_MPI_VI_EnableChn(CAMERA_ID, CAMERA_CHN);if (ret){printf("Vi Enable Attr Failed.....\n");return 0;}else{printf("Vi Enable Attr Success.....\n");}
VENC_CHN_ATTR_S venc_chn_attr;memset(&venc_chn_attr, 0, sizeof(VENC_CHN_ATTR_S));venc_chn_attr.stVencAttr.u32PicWidth = WIDTH;venc_chn_attr.stVencAttr.u32PicHeight = HEIGHT;venc_chn_attr.stVencAttr.u32VirWidth = WIDTH;venc_chn_attr.stVencAttr.u32VirHeight = HEIGHT;venc_chn_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;venc_chn_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;venc_chn_attr.stVencAttr.u32Profile = 66;venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 25;venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = WIDTH * HEIGHT * 3;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;ret = RK_MPI_VENC_CreateChn(VENC_CHN, &venc_chn_attr);  if (ret){printf("ERROR: Create venc failed!\n");exit(0);}

三.小结

在做这个功能的时候遇到了挺多问题,比例提示什么gop数据过大啥的,然后一直在重复检查修改参数,但是还是不行,最后弄了一晚上也找不出哪里有问题。今天早上重新来弄的时候,先用了其他功能的代码在板子上运行,说vi模块无法打开,这时候才意识到是板子连接出现了问题,应该是网线接口不紧的问题。

所以遇到问题,首先检查代码是没问题的,如果检查了代码,代码的配置的每一步都与自己所用所学对得上,这时候就不要一股脑的找代码问题了,虽然报错是说代码哪里配置错误,但也有可能是硬件设备连接等问题的错误导致代码报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车制造通信革新:网关模块让EtherCAT成功对接CCLINK

‌在现代工业自动化生产领域,不同品牌和类型的设备往往采用不同的通信协议,这给设备之间的互联互通带来了挑战。某汽车制造企业的生产线上,采用了三菱FX5U PLC作为主站进行整体生产流程的控制和调度,同时配备了库卡机器人作为从站…

vue父类跳转到子类带参数,跳转完成后去掉参数

当通过路由导航的时候,由于父类页面带参数到子类,导致路径上面有参数 这样不仅不美观,而且在点击导航菜单按钮时还会有各种问题,这时我们只需要将路由后面的参数去掉就好了,在子页面mounted()函数里面获取到父类的参数…

纯 CSS 实现的的3种扫光效果

介绍一个比较常见的动画效果。 在日常开发中,为了强调凸显某些文本或者元素,会加一些扫光动效,起到吸引眼球的效果,比如文本的 或者是一个卡片容器,里面可能是图片或者文本或者任意元素 除此之外,还有那…

如何在FastAPI中构建一个既安全又灵活的多层级权限系统?

title: 如何在FastAPI中构建一个既安全又灵活的多层级权限系统? date: 2025/06/14 12:43:05 updated: 2025/06/14 12:43:05 author: cmdragon excerpt: FastAPI通过依赖注入系统和OAuth2、JWT等安全方案,支持构建多层级权限系统。系统设计包括基于角色的访问控制、细粒度权…

大模型_Ubuntu24.04安装RagFlow_使用hyper-v虚拟机_超级详细--人工智能工作笔记0251

因为之前使用dify搭建了一个知识库,但是dify的效果,尤其是在文档解析方面是非常不友好的,虽然测试了,纳米的效果非常好,但是纳米只能容纳2000个文件,如果 你的知识库中有代码,sql文件等等&…

LeetCode - LCR 173. 点名

题目 LCR 173. 点名 - 力扣(LeetCode) 思路 首先对数组进行排序,使学号按顺序排列 在排序后的数组中,如果没有缺失的学号,那么每个元素应该等于其索引值 使用二分查找找到第一个不等于其索引的元素位置&#xff1…

VSCode如何优雅的debug python文件,包括外部命令uv run main.py等等

debug程序的方式有很多种。每一种方式都各有缺点:有的方式虽然优雅,但是局限性很大;有的方式麻烦,但是局限性小。 常规方式: 优点:然后可以观察所有线程。一劳永逸。缺点:就是写参数很麻烦,但是你可以让chatgpt等大模型帮你写。最最最优雅的方式: 优点:就是需要在代码…

[调试技巧]VS Code如何在代理模式下使用 MCP 工具?

在开发环境调试MCP,通过agent模式与大模型对话,并不能保证每次均正确调用tool。在阅读官方文档之后,得知以下小技巧。 添加 MCP 服务器后,您可以在代理模式下使用它提供的工具。要在代理模式下使用 MCP 工具 打开聊天视图 (CtrlAl…

京东零售基于Flink的推荐系统智能数据体系 |Flink Forward Asia 峰会实录分享

京东推荐系统的数据体系极其复杂,从召回、模型到策略和效果评估,每个环节都需要强大的海量数据处理能力支撑。然而,在实际运行中,整个数据链路面临着诸多挑战:如实时与离线数据的埋点口径不一致、数仓模型存在偏差、计…

[学习] 牛顿迭代法:从数学原理到实战

牛顿迭代法:从数学原理到实战 ——高效求解方程根的数值方法 文章目录 牛顿迭代法:从数学原理到实战一、引言:为什么需要牛顿迭代法?二、数学原理:几何直观与公式推导1. **核心思想**2. **几何解释**3. **收敛性分析*…

使用 Git 将本地仓库上传到 GitHub 仓库的完整指南

使用 Git 将本地仓库上传到 GitHub 仓库的完整指南 一、引言 在现代软件开发中,版本控制工具 Git 已成为不可或缺的一部分。GitHub 作为全球最大的代码托管平台,为开发者提供了代码协作、项目管理和开源贡献的便捷方式。本文将详细介绍如何通过 Git 将本…

数据结构 - 栈与队列

栈:限定仅在表尾进行插入或删除操作的线性表。 表尾端有特殊含义,称为栈顶(top)。 相应的,表头端称为栈底(buttom)。不含元素的空表成为空栈。 栈又称为后进先出的线性表(Last In…

jojojojojo

《JOJO的奇妙冒险》是由日本漫画家荒木飞吕彦所著漫画。漫画于1987年至2004年在集英社的少年漫画杂志少年JUMP上连载(1987年12号刊-2004年47号刊),2005年后在集英社青年漫画杂志Ultra Jumphttps://baike.baidu.com/item/Ultra%20Jump/2222322…

统计学核心概念与现实应用精解(偏机器学习)

统计学听起来似乎很复杂,但其实它的核心就是两个概念:概率分布和期望。这两个概念就像是我们日常生活中的决策助手。 概率分布描述了随机事件各种可能结果出现的可能性大小。比如,掷骰子时每个点数出现的概率,这就是一个典型的概…

go-carbon v2.6.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。 carbon 目前已捐赠给 dromara 开源组织,已被 awesome-go 收录&am…

228永磁同步电机无速度算法--基于双重锁相环的滑模观测器

一、原理介绍 在传统的正交锁相环的基础上,利用前述滤波器、ZOH、代数环等非理想因素对电流信号进行延迟重构,进而得到一个与实际电流信号存在相位偏差的重构信号,且该相位偏差等同于初步估计位置信号与实际位置信号之间的相位偏差。将该重构…

零基础入门 线性代数

线性代数是一种代数结构,通俗来讲,向量空间是这个结构的基石,我们要在向量空间中研究向量与向量的关系 一 对象:向量 各位都有对象嘛?如果没有对象,想不想知道你们的天命之人是谁捏?如果有对象…

IO之cout格式控制

目录 简单了解cout是什么? 什么是字节流 默认格式控制 修改计数系统 调整字符宽度 填充字符 设置浮点数显示精度 打印末尾的0和小数点 其他格式控制符 right--->设置为右对齐,永久生效 left--->设置为左对齐,永久生效 fixed--…

探索铸铁试验平台在制造行业的卓越价值

铸铁试验平台在制造行业中具有重要的价值和作用。以下是铸铁试验平台在制造行业中的卓越价值: 提高产品质量:铸铁试验平台可以模拟各种生产条件和环境,并对铸铁产品进行精确的测试和评估。通过实验平台的测试,可以发现产品在不同条…

gpt3大模型蒸馏后效果会变差么

模型蒸馏(Model Distillation)是将复杂的 “教师模型”(如 GPT-3)的知识迁移到更轻量级的 “学生模型” 上的技术。蒸馏后的模型效果是否会变差,取决于多种因素,不能一概而论。以下是详细分析: …