视频拼接融合产品的产品与架构设计(四)分布式GPU运算合并单元

上一篇如下
视频拼接融合产品的产品与架构设计(三)内存和显存单元数据迁移

视频合并单元说明

对下面这张图做些说明,视频接入是比较常见,可以说是普通,但是做到接入后随即进行比较重的算法运算,这个在视频领域并不多见,可以说做得好的几乎没有,而要做到在分布式上再把视频接入再进行合并,是比较难的,我们的选择也都在前面几章里面,就是把视频在gpu上处理,在没有nvlink或者其他显卡合并数据的方式下,通过gpu方式下放到内存进行合并。
在这里插入图片描述

嵌入式说明

如果不是x86 架构的模式下,不一定存在显存,即:不是拥有单独分配的显存而是使用共享内存

1 英伟达nvidia的内存体系里面,他是有一体化内存这个概念的,只要查询以下这个api,就可以得到更多信息

#include <cuda_runtime.h>int main() {float* data;cudaMallocManaged(&data, size, cudaMemAttachGlobal);// ...return 0;
}

2 rk3588
RK3588芯片集成的是ARM Mali G610 GPU,该GPU并没有独立的显存(dedicated video RAM),而是采用共享系统内存(Unified Memory Architecture,UMA)的设计。这意味着GPU与CPU共享同一块物理内存(通常是LPDDR4x或LPDDR5)

3 华为昇腾310b4
也是一样没有显存单元,这个时候都是利用其他方式去操作硬件。这是我的另外一篇文章,可以参考一下
华为昇腾CANN使用opencv4.9

编码预置

接下来我们还是说在有显存的情况下,我们必须下放到内存去合并,
我们依然使用ffmpeg去编码,由于使用分布式方式处理图像,并且涉及到多个gpu 设备合并数据,合并单元单独成为一个block, 我们创建好AVFrame,并且直接从gpu 把数据down到AVFrame内存单元中,注意他们各自的linesize, 由于需要硬件编码,我们采用nv12 的数据下载,因此涉及到NV12 的两个平面,Y品面和UV平面,相应的,ffmpeg的数据同样涉及data[0] 和data[1]

AVFrame* NV12Init(int w, int h)
{AVFrame* frame = av_frame_alloc(); // 分配 AVFrame 结构体内存frame->format = AV_PIX_FMT_NV12; // 设置像素格式为 YUV420Pframe->width = w; // 设置图像宽度frame->height = h; // 设置图像高度if (!frame) {return NULL;}int ret = av_frame_get_buffer(frame, 0); // 分配图像数据内存if (ret < 0) {av_frame_free(&frame); // 释放 AVFrame 结构体内存return NULL;}return frame;
}

转换测试

AVFrame* CreateNV12_2_BGR24Frame(int w1, int h1, int w2, int h2, AVFrame* src_frame)
{int w = w1 + w2;int h = h1 > h2 ? h1 : h2;// 创建SwsContextstruct SwsContext* sws_ctx = sws_getContext(w, h, AV_PIX_FMT_NV12, // 源格式、宽度、高度w, h, AV_PIX_FMT_BGR24, // 目标格式、宽度、高度SWS_BILINEAR, NULL, NULL, NULL); // 选择缩放算法等if (!sws_ctx) {// 错误处理return NULL;}// 创建目标AVFrame用于BGR24数据AVFrame* dst_frame = av_frame_alloc();dst_frame->format = AV_PIX_FMT_BGR24;dst_frame->width = w;dst_frame->height = h;if (av_frame_get_buffer(dst_frame, 0) < 0) {// 错误处理sws_freeContext(sws_ctx);return NULL;}// 执行转换sws_scale(sws_ctx, src_frame->data, src_frame->linesize,0, src_frame->height, dst_frame->data, dst_frame->linesize);sws_freeContext(sws_ctx);return dst_frame;}

单元测试

int main()
{cv::cuda::setDevice(0);cv::Mat image1 = cv::imread("d:/left.jpg");cv::Mat image2 = cv::imread("d:/right.ipg");if (image1.empty() || image2.empty()) {std::cerr << "Failed to load input image!" << std::endl;return -1;}int w1 = image1.cols;int h1 = image1.rows;int w2 = image2.cols;int h2 = image2.rows;cv::cuda::GpuMat g1;g1.upload(image1);cv::cuda::GpuMat g2;g2.upload(image2); void* c1 = createNV12Context(w1, h1, 0);void* c2 = createNV12Context(w2, h2, 0);swscale_gpu(c1, g1.data, g1.step);swscale_gpu(c2, g2.data, g2.step);w2 = 0;h2 = 0;AVFrame* frame  = NV12Init(w1+w2, h1>h2?h1:h2);download_gpu(c1, NULL, frame->data[0], frame->linesize[0], frame->data[1], frame->linesize[1]);AVFrame* dst_frame = CreateNV12_2_BGR24Frame(w1, h1, w2, h2, frame);// 创建cv::Mat对象,注意:OpenCV使用BGR通道顺序cv::Mat image(dst_frame->height, dst_frame->width, CV_8UC3, dst_frame->data[0], dst_frame->linesize[0]);cv::Mat imdst;cv::resize(image, imdst, cv::Size(image.cols / 4, image.rows / 4), 0, 0, cv::INTER_LINEAR);cv::imshow("BGR Image", imdst);//av_freep(&frame->data[0]);av_frame_free(&frame);//av_freep(&dst_frame->data[0]);av_frame_free(&dst_frame);cv::waitKey(0);}

后续的改变

后面我会改变产品形态,准备写视频湖仓一体平台,着手创建这个产品,视频拼接和融合只是一个小功能,也不打算自己做这种产品了,而是做出工具来让其他专业或者非专业的人来做,以插件的模式来提供便利。

在这里插入图片描述

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

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

相关文章

Makefile学习笔记14|u-boot顶层Makefile00

Makefile学习笔记14|u-boot顶层Makefile00 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长&#xff0c;谢谢。 这里是目录 本系列文章分析使用的Makefile # SPDX-License-Identifier: GPL-2.0VERSION 2024 PATCHLEVEL 01 SUBLEVEL EXTRAVERSION -rc4 N…

评估SV模型的预测效果和性能因素

评估SV模型的预测效果和性能通常涉及多个方面的考量,以下是一些关键的评估方法和指标: 均方误差(Mean Squared Error, MSE):MSE衡量了模型预测值与实际值之间差异的平方的均值。较小的MSE值意味着模型预测更为准确。 均方根误差(Root Mean Squared Error, RMSE):RMSE是…

SDN简介

一、SDN 定义与概念 SDN&#xff08;Software-defined Networking&#xff0c;软件定义网络&#xff09;是一种新型网络管理方法&#xff0c;支持动态可编程的网络配置&#xff0c;提高了网络性能和管理效率&#xff0c;使网络服务能够像云计算一样提供灵活的定制能力。SDN 将…

软件项目详细设计说明书实际项目参考(word原件下载及全套软件资料包)

系统详细设计说明书案例&#xff08;直接套用&#xff09; 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件开发全文档下载&#xff08;下面链接或者本文末个人名片直接获取)&#xff1a;软件开发全套资料-…

C++ 常用UI库

AWTK github gitee doc scons 类似RT-Thread element github C Cross platfrom C GUI libraries&#xff0c;QT可替代方案。调试包 SDL GUI cegui 创作不易&#xff0c; 小小的支持一下吧&#xff01;

泛型...

定义&#xff1a;在编译过程中约束操作的数据类型。&#xff08;统一数据类型&#xff09; 格式&#xff1a;<数据类型> 泛型中不能写基本数据类型。 泛型类 在一个类中&#xff0c;某个变量的数据类型不确定时&#xff0c;可以定义带有泛型的类。 泛型的底层是Obje…

电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载

电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1vlCtC3LGFMzYpSUUDY-tEg 提取码&#xff1a;8110

十四天学会Vue——Vue核心(理论+实战)(第一天)上篇

&#xff01;&#xff01;&#xff01;声明必看&#xff1a;由于本篇开始就写了Vue&#xff0c;内容过多&#xff0c;本篇部分内容还有待完善&#xff0c;小编先去将连续更新的js高阶第四天完成~本篇部分待完善内容明日更新 一、Vue核心&#xff08;上篇&#xff09; 热身top…

vue3+electron+typescript 项目安装、打包、多平台踩坑记录

环境说明 这里的测试如果没有其他特别说明的&#xff0c;就是在win10/i7环境&#xff0c;64位 创建项目 vite官方是直接支持创建electron项目的&#xff0c;所以&#xff0c;这里就简单很多了。我们已经不需要向开始那样自己去慢慢搭建 yarn create vite这里使用yarn创建&a…

外企也半夜发布上线吗?

0 别把问题想得太复杂 如果有灰度发布的能力&#xff0c;最好白天发布&#xff1b;如果没有灰度发布&#xff0c;只能在半夜发布。 即使有灰度发布能力&#xff0c;也不要沾沾自喜&#xff0c;好好反思一下你们的灰度发布是否真的经得起考验&#xff0c;还是仅仅是装装样子。…

golang创建式设计模式---工厂模式

创建式设计模式—工厂模式 目录导航 创建式设计模式---工厂模式1)什么是工厂模式2)使用场景3)实现方式4)实践案例5)优缺点分析 1)什么是工厂模式 工厂模式(Factory Method Pattern)是一种设计模式&#xff0c;旨在创建对象时&#xff0c;将对象的创建与使用进行分离。通过定义…

深度学习中的多GPU训练(Pytorch 20)

一 多GPU训练 下面详细介绍如何从零开始并行地训练网络&#xff0c;这里需要运用小批量随机梯度下降算法。后面我还讲介绍如何使用高级API并行训练网络。 我们从一个简单的计算机视觉问题和一个稍稍过时的网络开始。这个网络有多个卷积层和汇聚层&#xff0c;最后可能 有几个…

picamera配opencv做发现移动物体后录像50秒

本来是想配合上一篇写的测距传感器数据打开摄像头录制个50秒实时画面&#xff0c;后来这个测距传感器&#xff08;因为我是歪用&#xff0c;用来识别范围内的移动物体&#xff09;给的数据&#xff0c;false alarming还是太高了。于是想到使用本人之前深恶痛绝的opencv来试一试…

在linux中配置关于GFS创建各种卷以及卷组--配置实验

服务器的相关信息 服务器的相关信息 卷名称 卷类型 空间大小 Brick dis-volume 分布式卷 12 Node1(/e6)、node2(/e6) Stripe-volume 条带卷 10 Node1(/d5)、node2(/d5) Rep-volume 复制卷 5 Node3(/d5)、node4(/d5) Dis-stripe 分布式条带卷 12 Node1(/b3)、node2(/b3)、node(…

【编译原理--- 汇编、编译、解释系统】

汇编、编译、解释系统 1.编译方式和解释方式 程序种类是否生成目标程序是否参与程序的运行过程程序执行速度可移植性编译程序生成不参与快差解释程序不生成参与慢好 编译方式过程&#xff1a;词法分析、语法分析、语义分析、&#xff08;中间代码生成、代码优化、&#xff0…

python中异常操作的处理总结

Python 中 执行一些可能引发异常的操作时&#xff0c;我们通常使用try-except-else-finally 来补货异常 1. **try-except 场景**: - 当你执行一些可能会引发异常的操作时,使用 try-except 来捕获和处理这些异常非常有用。 - 比如读取文件、连接数据库、调用 API…

GNU/Linux - date命令

Linux 中的日期命令是一个多功能的强大工具&#xff0c;用于显示和设置系统的日期和时间。它允许用户以各种格式检索当前日期和时间&#xff0c;自定义输出&#xff0c;甚至出于脚本、日志和系统维护等不同目的操作日期和时间值。 下面是日期命令的简要概述&#xff1a; The da…

如何解决mfc110udll丢失的问题,7个方法可解决mfc110udll丢失

mfc110u.dll是一个动态链接库文件&#xff0c;属于Microsoft Visual C 2012 Redistributable Package的一部分。它是Microsoft Foundation Classes (MFC) 库的一个版本&#xff0c;专门用于支持基于MFC开发的应用程序运行。MFC是一个用于Windows操作系统上使用C进行本机应用程序…

VS+QT连接mysql

1.将mysql安装目录中的库文件拷贝到qt的bin目录下&#xff0c;windows下拷贝dll后缀&#xff0c;linux拷贝lib后缀 2.在qt模块中添加sql模块 或者在.pri文件中加上 QT sql 3.代码连接数据库 #include <QtSql>QSqlDatabase DB; DB QSqlDatabase::addDatabase(&…

反弹shell详细易懂讲解,看这一篇就够了

文章目录 反弹shell详细易懂讲解&#xff0c;看这一篇就够了一: 基础shell知识什么是shell&#xff0c;bash与shell的区别?通俗解释类型功能常见命令 二: 什么是反弹shell三: 反弹shell类型bash反弹shellNetcat 一句话反弹curl反弹shell正确姿势 wget方式反弹awk反弹 Shellsoc…