8.RV1126-OPENCV 视频中添加LOGO - 指南

news/2025/10/7 20:17:35/文章来源:https://www.cnblogs.com/ljbguanli/p/19128837

8.RV1126-OPENCV 视频中添加LOGO - 指南

一.视频中添加 LOGO 图像大体流程

        首先初始化VI,VENC模块并使能,然后创建两个线程:1.把LOGO灰度化,然后获取VI原始数据,其次把VI数据Mat化并创建一个感兴趣区域,最终把LOGO放感兴趣区域里并把数据发送给VENC。2.专门获取VENC数据,并存储素材到文件里。

二.代码具体实现

// Copyright 2020 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.// Use of this source code is governed by a BSD-style license that can be// found in the LICENSE file. #include //#include #include #include #include #include #include #include #include #include #include #include  // #include "common/sample_common.h"#include "rkmedia_api.h" #include // #include #include #include  using namespace cv;using namespace std;  #define CAMERA_PATH "rkispp_scale0"#define CAMERA_ID 0#define CAMERA_CHN 0#define VENC_CHN 0#define WIDTH 1920#define HEIGHT 1080 //opencv的Logo处理VI线程void *opencv_vi_logo_handle_thread(void *args){  pthread_detach(pthread_self());   MEDIA_BUFFER mb = NULL;  Mat logo_img = imread("zjl.jpg");//读取LOGO图片编码Mat矩阵  cvtColor(logo_img, logo_img, COLOR_RGB2GRAY); //cvtColor把彩色图像转换成灰度图   while (1)  {    mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI, CAMERA_CHN, -1);//获取VI模块的数据    if (!mb)    {      printf("Get vi break....\n");      break;    }     printf("Get vi success...\n");     Mat rv1126_img_mat = Mat(HEIGHT, WIDTH, CV_8UC1, RK_MPI_MB_GetPtr(mb));//把VI数据转换成Mat矩阵    Mat rv1126_img_mat_roi = rv1126_img_mat(Rect(100, 100, logo_img.cols, logo_img.rows));//在Mat矩阵里面获取感兴趣区域    logo_img.copyTo(rv1126_img_mat_roi);//把Logo的矩阵拷贝到可感兴趣区域    RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, VENC_CHN, mb);//把处理后的VI数据传输给VENC编码器    RK_MPI_MB_ReleaseBuffer(mb);//释放资源  }   return NULL;}  //专门获取上面处理好的数据并保存到文件里void *get_venc_stream_thread(void *args){  pthread_detach(pthread_self());  MEDIA_BUFFER mb = NULL;  FILE * h264_opencv_logo_file = fopen("test_opencv_logo.h264", "w+"); //   while (1)  {    mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, VENC_CHN, -1);//获取VENC编码器数据    if(!mb)    {       printf("Get venc break.....\n");       break;    }     fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1 , h264_opencv_logo_file);//保存数据    RK_MPI_MB_ReleaseBuffer(mb);//释放资源  }   return NULL;} int main(){  int ret;  VI_CHN_ATTR_S vi_chn_attr;  vi_chn_attr.pcVideoNode = CAMERA_PATH;        // Path  vi_chn_attr.u32Width = WIDTH;                 // Width  vi_chn_attr.u32Height = HEIGHT;               // Height  vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;       // ImageType  vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP; // BufType  vi_chn_attr.u32BufCnt = 3;                    // Cnt  vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL; // Mode  ret = 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);  }   ret = RK_MPI_VI_StartStream(CAMERA_ID, CAMERA_CHN);  if (ret)  {    printf("start vi failed....\n");  }  else  {    printf("start vi success....\n");  }   pthread_t pid1, pid2;  pthread_create(&pid1, NULL, opencv_vi_logo_handle_thread, NULL);  pthread_create(&pid2, NULL, get_venc_stream_thread, NULL);   while (1)  {    sleep(2);  }   RK_MPI_VENC_DestroyChn(VENC_CHN);  RK_MPI_VI_DisableChn(CAMERA_ID, CAMERA_CHN);   return 0;}

 三.效果图

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

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

相关文章

学习记录:响应式系统、文件通知与游戏输入机制的异同

引言 在学习前端开发和系统编程的过程中,我们常常会遇到“自动响应变化”的现象:Vue/React 中数据更新后 UI 自动刷新 删除文件后文件管理器图标立即消失 游戏中按下按键角色立刻移动这些现象看似都体现了“响应式”…

虎丘做网站价格个人网页设计作业总结

目录 写在开头1.了解情感分析的概念及其在实际应用中的重要性1.1 情感分析的核心概念1.1.1 情感极性1.1.2 词汇和上下文1.1.3 情感强度1.2 实际应用中的重要性 2. 使用情感分析库进行简单的情感分析2.1 TextBlob库的基本使用和优势2.1.1 安装TextBlob库2.1.2 文本情感分析示例2…

oppoR9m刷Linux系统: 制作 scatter.txt 和 导出手机preloader

前言全局说明COM、VCOM、9008模式备份系统与基带IMEI/NVRAM/QCN 前面两篇文章,用不同方式备份,这次用 MTK 自带的 COM、VCOM 方式备份。注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机…

做百科专用参考链接的网站仿站多少钱

前段时间,业务的虚机上安装了symantec Endpoint Protection(正版), 发现虚机运行一段时间就会失去响应死机,并且有些安装symantec的虚机3389端口无法使用,怎么折腾都不行。最后决定卸载它。一、是否可以用停止服务和终止进程再卸载的方式卸载…

详细介绍:ASR技术(自动语音识别)深度解析

详细介绍:ASR技术(自动语音识别)深度解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

1.1 采样问题 Sampling and Bandits

n臂bandits(n-armed bandits) n臂bandits(multi-armed bandit)是最简单的试错式学习形式。学习与动作选择都发生在同一个状态中,在该状态下有 \(n\) 个可用动作,每个动作对应不同的奖励分布。目标是通过试错的方…

升级下载:进阶版(二级单工序)

升级下载:进阶版(二级单工序)Posted on 2025-10-07 20:09 EXLman 阅读(0) 评论(0) 收藏 举报. 当前款式:进阶版(二级单工序) . 文件名称:PXCtwobom.dll . 升级方法:下载解压后,直接替换该文件 .

绵阳 网站建设百度官网网址

最近接触一个新的传统项目,在联调过程中,查看日志特别不方便,既无trackId,即无接口耗时,所以写了该博客。话不多说,直接上代码 1、实体类user package com.yk.domain;import lombok.Data;Data public cla…

UCB-CS70_离散数学_个人笔记:至少和至多 - Zeeh

有趣的命题 在note1中,提出了两个关于“至少”和“至多”的命题:There are at least three distinct integers x that satisfy P(x). 有 最多 三个不同的整数x这满足p(x)。对于这两个命题,可以分别用下面两个式子…

太原网站制作开发域名怎么实名认证

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 找镜像: docker search nexus2. 拉取镜像:(我已经拉取过,不选择版本时,默认…

模板做的网站 怎么提升排名商标设计公司推荐

冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越…

10.7 NOIP 模拟赛 T2. 中心极限定理

思路 发现吃马不好维护, 考虑直接状态压缩马的存活情况, 可以做到 \(\mathcal{O} (n^2 2^m)\) 考虑进一步处理, 发现由于你的棋子不能回头, 吃掉一个马后, 最多走三步就跳出了马的范围, 所以我们可以直接把前两步的路线…

【题解】10.6 国庆中秋 提高组 热身赛

1.栅栏密码 题目传送门题目大意: 给定高度 h 和一行使用栅栏密码加密的密文字符串 s,请你输出一行明文字符串 plain。 即把明文排列成若干个 \/\/\/ 的形状,然后再逐行按从左到右的顺序取出字符,形成密文。STEP 1.…

深圳手机网站建设牛商网购物网站的排版

简介: 先说下什么是人脸识别系统:举个例子,公司门口有个人脸识别系统,员工站到门口,看着摄像头,大屏幕上会抓拍到你的人脸,然后和公司的员工照片库里的照片比对,比对成功就提示&…

深入解析:pikachu通关教程-File Inclusion

深入解析:pikachu通关教程-File Inclusion2025-10-07 20:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

UCB-CS70个人笔记:至少和至多 - Zeeh

有趣的命题 在note1中,提出了两个关于“至少”和“至多”的命题:There are at least three distinct integers x that satisfy P(x). 有 最多 三个不同的整数x这满足p(x)。对于这两个命题,可以分别用下面两个式子…

几个重要的偏微分方程

几个重要的偏微分方程1. 弦振动方程

虚拟机器人学习自然语言指令技术解析

介绍两项创新性研究,通过视觉与语言理解技术提升虚拟环境中机器人任务完成能力。包含DialFRED对话增强框架和感知可用性神经SLAM模型,在模拟环境中实现超过20%的性能提升。虚拟机器人学习自然语言指令技术解析 研究背…

vr技术在网站建设的应用南京浦口网站建设

🤖 与ChatGPT亲密接触 🤖 ChatGPT!它就是一款强大的聊天型人工智能模型,可以与你进行各种有趣的对话,就像我们在这里一样。不论你想聊天、提问、寻求建议,还是只是想找个伙伴一起闲聊,ChatGPT都…

题解:换乘旅行

换乘旅行 题目描述 小明来到了一座著名的旅游城市,这座城市有一个包含\(n\)个站点的公共交通网络。该网络的运行方式非常独特。每个站点\(i\)都有一个按顺序排列的摆渡车出发队列。每辆摆渡车都有一个固定的、预先设定…