当前位置: 首页 > news >正文

在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。

B站配套视频:https://www.bilibili.com/video/BV1or421T74f
在这里插入图片描述

前言

在实际生产过程中,有很多时候不光是通过网络获取rtsp视频流,通常会采用在板子上插上USB摄像头获取画面。
今天我将向搭建演示该如何通过USB获取画面后推流出RTSP视频流。

本课程相关代码以开源在V8的项目中,有开源链接的朋友可以重新拉取一下代码。

前期准备

首先我们需要确定一下基本原理,usb的获取和推流到rtsp是这里面存在编码不一致的问题。

通常我们会采用opencv获取usb摄像头的画面然后进行推理,这时候图像是RGB编码的。

而推流到RTSP中就变成了YUV编码,那自然就会想到RK3588的固有能力,硬件编码器MPP。

那RTSP的推流我们就选择官方推荐的ZLMediakit来实现。正题结构如下所示:

opencv
yolo
mpp
mpp
ZLMediakit
USB
RGBimg
推理画面
YUVimg
RTSP

下载和编译zlmediakit、mpp

代码讲解查看视频 https://www.bilibili.com/video/BV1or421T74f](https://www.bilibili.com/video/BV1or421T74f

cd ZLMediaKit
git submodule init
git submodule update
cmake . -B build && cmake --build build -j4
cd ../mpp
cmake . -B build && cmake --build build -j4
cp ./submodules/mpp/build/utils/libutils.a libs/
cp ./submodules/ZLMediaKit/release/linux/Debug/libmk_api.so libs/

源码核心部分

int process_video_file(rknn_app_context_t *ctx, const char *video_path)
{// 读取视频cv::VideoCapture cap(video_path);if (!cap.isOpened()){printf("Failed to open video file: %s", video_path);}// 获取视频尺寸、帧率int cap_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);int cap_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);int fps = cap.get(cv::CAP_PROP_FPS);ctx->media = mk_media_create("__defaultVhost__", ctx->push_path_first.c_str(), ctx->push_path_second.c_str(), 0, 0, 0);codec_args v_args = {0};mk_track v_track = mk_track_create(MKCodecH264, &v_args);mk_media_init_track(ctx->media, v_track);mk_media_init_complete(ctx->media);mk_media_set_on_regist(ctx->media, on_mk_media_source_regist_func, ctx);// 初始化编码器MppEncoder *mpp_encoder = new MppEncoder();MppEncoderParams enc_params;memset(&enc_params, 0, sizeof(MppEncoderParams));enc_params.width = cap_width;enc_params.height = cap_height;enc_params.fmt = MPP_FMT_YUV420SP;enc_params.type = MPP_VIDEO_CodingAVC;mpp_encoder->Init(enc_params, ctx);ctx->encoder = mpp_encoder;// mpp编码配置void *mpp_frame = NULL;int mpp_frame_fd = 0;void *mpp_frame_addr = NULL;int enc_data_size;int frame_index = 0;int ret = 0;// 画面cv::Mat img;while (true){// 读取视频帧cap >> img;if (img.empty()){printf("Video end.");break;}frame_index++;// 结束计时auto end_time = std::chrono::high_resolution_clock::now();// 将当前时间点转换为毫秒级别的时间戳auto millis = std::chrono::time_point_cast<std::chrono::milliseconds>(end_time).time_since_epoch().count();mpp_frame = ctx->encoder->GetInputFrameBuffer();mpp_frame_fd = ctx->encoder->GetInputFrameBufferFd(mpp_frame);mpp_frame_addr = ctx->encoder->GetInputFrameBufferAddr(mpp_frame);rga_buffer_t src = wrapbuffer_fd(mpp_frame_fd, cap_width, cap_height, RK_FORMAT_YCbCr_420_SP);int enc_buf_size = ctx->encoder->GetFrameSize();char *enc_data = (char *)malloc(enc_buf_size);rga_buffer_t rgb_img = wrapbuffer_virtualaddr((void *)img.data, cap_width, cap_height, RK_FORMAT_BGR_888);// 将RGB图像复制到src中imcopy(rgb_img, src);if (frame_index == 1){enc_data_size = ctx->encoder->GetHeader(enc_data, enc_buf_size);}// 内存初始化memset(enc_data, 0, enc_buf_size);enc_data_size = ctx->encoder->Encode(mpp_frame, enc_data, enc_buf_size);ret = mk_media_input_h264(ctx->media, enc_data, enc_data_size, millis, millis);if (ret != 1){printf("mk_media_input_frame failed\n");}}cap.release();
}

代码讲解查看视频https://www.bilibili.com/video/BV1or421T74f

相关文章:

在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 前言…...

TCP/IP协议栈详解及其在现代网络中的应用

在当今数字化时代&#xff0c;网络已成为我们生活中不可或缺的一部分。无论是社交、工作还是娱乐&#xff0c;网络都在背后发挥着至关重要的作用。而这一切的实现&#xff0c;都离不开TCP/IP协议栈。本文将详细介绍TCP/IP协议栈的结构、各层功能以及它在现代网络中的应用。 什…...

亚信安全荣获“2024年网络安全优秀创新成果大赛”优胜奖

近日&#xff0c;由中央网信办网络安全协调局指导、中国网络安全产业联盟&#xff08;CCIA&#xff09;主办的“2024年网络安全优秀创新成果大赛”评选结果公布。亚信安全信舱ForCloud荣获“创新产品”优胜奖&#xff0c;亚信安全“宁波市政务信息化网络数据安全一体化指挥系统…...

如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧

如何从硬盘恢复已删除/丢失的文件&#xff1f;本教程将教您如何使用专业硬盘恢复软件从内置或外置硬盘恢复数据&#xff0c;或不使用软件从硬盘恢复已删除的文件。 “有人知道如何从外部硬盘恢复文件吗&#xff1f;当我将外部硬盘插入计算机时&#xff0c;我错误地删除了一些文…...

[Linux]:权限

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. Linux权限的基本概念 1.1 root与普通用户 在Linux系统中&#xff0c;存在…...

启动Spring Boot报错

一、遇到的问题 启动Spring Boot报错 Unable to close ApplicationContext org.springframework.boot.SpringApplication: Application run failed java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.cache.CacheAutoCo…...

部署project_exam_system项目——及容器的编排

&#xff08;一&#xff09;安装docker、编辑daemon.json文件、安装docker-compose编排容器、启动docker 1.环境准备 [rootdocker--1 ~]# rz -Erz waiting to receive.[rootdocker--1 ~]# lsanaconda-ks.cfg docker.sh[rootdocker--1 ~]# source docker.sh [rootdocker--1 ~…...

网络工程师学习笔记——无线通信网

移动通信 从1G到3G都是针对语音通话设计的&#xff0c;只有4&#xff27;才可以与Internet衔接 1978年美国贝尔实验室开发了高级移动电话系统&#xff08;AMPS&#xff09;&#xff0c;可以随时随地的进行通信&#xff0c;采用蜂窝技术解决了公用通信系统所面临的大容量要求和…...

Vue(十三) 路由、路由嵌套、query、param传参、propos、replace属性。编程式路由导航,特有的生命周期函数,路由守卫

文章目录 路由1. 基本使用2. 多级(嵌套)路由3. 路由query传参4. 命名路由5. 路由param传参6. propos属性7. replace属性8. 编程式路由导航9. 缓存路由组件10. actived&#xff0c;deactived生命周期函数11. 路由守卫1、全局路由2、独享路由3、组件内路由守卫 12. 路由器工作的两…...

ArgoUML与StarUML的安装

ArgoUML与StarUML的安装 说明&#xff1a; 首次发表日期&#xff1a;2024-09-07ArgoUML 官网&#xff1a; https://argouml-tigris-org.github.io/tigris/argouml/StarUML 官网&#xff1a; https://staruml.io/ ArgoUML 以下内容基于&#xff1a; https://blog.csdn.net/h…...

828华为云征文|华为云服务器Flexus X搭建悟空crm管理系统——助力企业云上管理(解决APP Referer校验失败问题)

1、为什么我们企业会选择Flexus云服务器X实例来部署自己的CRM管理系统&#xff1f; 因为基于华为云Flexus X实例搭建CRM管理平台&#xff0c;可以从容面对企业内部瞬息万变的业务压力变化 2、华为云服务器Flexus X方案及优势&#xff1a; 灵活伸缩 搭配弹性伸缩服务AS及负载均…...

计算机毕业设计选题推荐-健康健身追踪系统-运动健身系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

FPGA开发:初识FPGA × 开发环境

FPGA是什么&#xff1f; FPGA的全称是现场可编程门阵列&#xff08;Field Programmable Gate Array&#xff09;&#xff0c;一种以数字电路为主的集成芯片&#xff0c;属于可编程逻辑器件PLD的一种。简单来说&#xff0c;就是能用代码编程&#xff0c;直接修改FPGA芯片中数字…...

电脑驱动分类

电脑驱动程序&#xff08;驱动程序&#xff09;是操作系统与硬件设备之间的桥梁&#xff0c;用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类&#xff1a; 1. 设备驱动程序 显示驱动程序&#xff1a;控制显卡和显示器的显示功能&#xff0c;负责图形渲染和…...

理解C++全局对象析构顺序与 IPC 资源管理:避免 coredump

文章目录 0. 概述1. 问题背景2. 问题分析3. 解决方案&#xff1a;手动释放资源4. 深入剖析&#xff1a;为什么手动调用 reset() 有效&#xff1f;5. 延伸思考&#xff1a;如何避免全局对象带来的问题&#xff1f;6. 总结 0. 概述 在编写 C 程序时&#xff0c;使用全局或静态对…...

云计算之大数据(下)

目录 一、Hologres 1.1 产品定义 1.2 产品架构 1.3 Hologres基本概念 1.4 最佳实践 - Hologres分区表 1.5 最佳实践 - 分区字段设置 1.6 最佳实践 - 设置字段类型 1.7 最佳实践 - 存储属性设置 1.8 最佳实践 - 分布键设置 1.9 最佳实践 - 聚簇键设置 1.10 最佳实践 -…...

硬件工程师笔试面试知识器件篇——二极管

目录 4、二极管 4.1、基础 二极管原理图 二极管实物图 4.1.1、基本特性 4.1.2、常见类型 4.1.3、工作原理 4.1.4、应用领域 4.2、相关问题 4.2.1、二极管的PN结是如何形成的? 4.2.2、发光二极管(LED)的工作原理是什么? 4.2.3、在电子电路中,二极管通常如何应用?…...

操作系统安全保护

操作系统安全概述 概念&#xff1a;满足安全策略要求&#xff0c;具有响应安全机制及安全功符合特定安全标准&#xff0c;在一定约束条件下 能抵御常见网络安全威胁&#xff0c;保障自身安全运行及资源安全 安全等级&#xff1a;根据安全功能和安全保障要求分为 用户自主保护…...

STM32硬件篇:W25Q64

W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单&#xff08;使用SPI通信协议&#xff09;的非易失性&#xff08;掉电不丢失&#xff09;存储器&#xff0c;常用于数据存储、字库存储、固件程序存储等场景。 【注意】W25Qxx芯片只支持SPI的模式0和模式3。 存储介质&am…...

uni-app 获取当前位置的经纬度以及地址信息

文章目录 uni.getLocation(objc)获取经纬度和地址调试结果问题 uni-app 获取当前位置的经纬度以及地址信息 uni.getLocation(objc) uni-app官方文档定位API: uni.getLocation(OBJECT) uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&…...

OpenClaw移动端适配:通过飞书调用Kimi-VL-A3B-Thinking多模态服务

OpenClaw移动端适配&#xff1a;通过飞书调用Kimi-VL-A3B-Thinking多模态服务 1. 为什么需要移动端适配 作为一个长期依赖OpenClaw进行本地自动化任务的用户&#xff0c;我最近遇到了一个痛点&#xff1a;当我在户外或出差时&#xff0c;无法方便地使用OpenClaw的强大功能。虽…...

Wan2.2-I2V-A14B效果展示:支持语义分割引导的多对象独立运动控制

Wan2.2-I2V-A14B效果展示&#xff1a;支持语义分割引导的多对象独立运动控制 1. 惊艳的视频生成能力 Wan2.2-I2V-A14B模型带来了令人惊叹的视频生成效果&#xff0c;特别是其独特的语义分割引导和多对象独立运动控制能力。想象一下&#xff0c;你只需要用文字描述一个场景&am…...

OpenClaw跨平台控制:Kimi-VL-A3B-Thinking远程执行多模态任务方案

OpenClaw跨平台控制&#xff1a;Kimi-VL-A3B-Thinking远程执行多模态任务方案 1. 为什么需要跨平台远程控制&#xff1f; 上周五晚上11点&#xff0c;我正躺在沙发上刷手机&#xff0c;突然想起有个紧急的竞品分析报告需要处理。电脑在书房&#xff0c;实在懒得起身。这时我意…...

G-Helper终极指南:华硕笔记本轻量级控制工具完全教程

G-Helper终极指南&#xff1a;华硕笔记本轻量级控制工具完全教程 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sca…...

【Python内存管理终极指南】:20年专家亲授智能内存优化策略与OOM报错秒级修复方案

第一章&#xff1a;Python智能体内存管理策略Python智能体&#xff08;如基于LLM的Agent、ReAct框架实例或自主任务规划器&#xff09;在运行过程中常面临对象生命周期动态、引用关系复杂、中间状态缓存频繁等挑战。其内存管理不能仅依赖CPython默认的引用计数与循环垃圾回收&a…...

Docker快速部署Nacos

生成数据目录sudo mkdir -p /app/nacos/logs sudo mkdir -p /app/nacos/data sudo chmod -R 777 /app/nacos生成一个随的 Base64 密钥&#xff1a;openssl rand -base64 32nacos启动命令docker run --name nacos-server \-e MODEstandalone \-v /app/nacos/logs:/home/nacos/lo…...

实时操作系统(RTOS)核心特性与工业实践解析

1. 实时操作系统核心特性解析实时操作系统&#xff08;RTOS&#xff09;的核心设计理念在于"确定性响应"&#xff0c;这与我们日常使用的通用操作系统有着本质区别。我曾参与过工业控制系统的开发&#xff0c;深刻体会到RTOS在关键任务场景下的不可替代性。以数控机床…...

MCP3302/MCP3304 13位差分ADC驱动开发与硬件协同设计指南

1. MCP330X库深度解析&#xff1a;面向嵌入式工程师的13位差分ADC驱动开发指南MCP330X系列Arduino库是专为Microchip MCP3302与MCP3304高精度模数转换器设计的底层驱动框架。该库并非简单封装&#xff0c;而是基于对SPI协议时序、ADC采样原理及嵌入式资源约束的深刻理解所构建的…...

贾龙栋与鸽姆智库:贾子哲学思想理论体系的构建、创新与全球影响 —— 基于跨学科视角的深度研究

贾龙栋与鸽姆智库&#xff1a;贾子哲学思想理论体系的构建、创新与全球影响 —— 基于跨学科视角的深度研究引言在人工智能技术迅猛发展与全球治理体系深刻变革的时代背景下&#xff0c;人类文明正面临前所未有的认知挑战与价值重构。一方面&#xff0c;技术能力的指数级增长与…...

2026届学术党必备的五大AI辅助写作网站推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下这个学术写作的场景范围里&#xff0c;论文AI工具已然变成辅助研究者去完成文献梳理的…...