通过多线程分别获取高分辨率和低分辨率的H264码流

目录

一.RV1126 VI采集摄像头数据并同时获取高分辨率码流和低分辨率码流流程

​编辑

1.1初始化VI模块:

1.2初始化RGA模块:

1.3初始化高分辨率VENC编码器、 低分辨率VENC编码器:

1.4 VI绑定高分辨率VENC编码器,VI绑定RGA模块,伪代码如下:

1.5 创建多线程获取高分辨率编码数据:

1.6 创建多线程获取低分辨率数据并传输到编码器:

1.7.创建多线程获取低分辨率编码数据:

三.运行的效果:


一.RV1126 VI采集摄像头数据并同时获取高分辨率码流和低分辨率码流流程

RV1126利用多线程同时获取高分辨率编码文件、低分辨率编码文件,一般要分为上图8个步骤:VI模块初始化RGA图像模块初始化、高分辨率编码器的初始化、低分辨率编码器的初始化、VI绑定高分辨率VENC编码器、创建多线程获取高分辨率编码数据、创建多线程获取低分辨率数据并传输到编码器、创建多线程获取低分辨率编码数据。

1.1初始化VI模块:

VI模块的初始化实际上就是对VI_CHN_ATTR_S的参数进行设置、然后调用RK_MPI_VI_SetChnAttr设置VI模块并使能RK_MPI_VI_EnableChn,伪代码如下:

VI_CHN_ATTR_S  vi_chn_attr;

。。。。。。。。。。。。。。。(这里是设置VI的属性)

ret = RK_MPI_VI_SetChnAttr(CAMERA_ID, 0, &vi_chn_attr);

ret |= RK_MPI_VI_EnableChn(CAMERA_ID, 0);

1.2初始化RGA模块:

RGA主要的作用是缩放VI模块的分辨率,比方说:VI模块的分辨率1920 * 1080,经过RGA缩放后分辨率为1280 * 720,并利用RK_MPI_RGA_CreateChn创建RGA模块,伪代码如下:

RGA_ATTR_S rga_attr;

rga_attr.stImgIn.u32Width = 1920;

rga_attr.stImgIn.u32Height = 1080;

。。。。。。。。。

rga_attr.stImgOut.u32Width = 1280;

rga_attr.stImgOut.u32Height = 720;

。。。。。。。。。。。

RK_MPI_RGA_CreateChn(RGA_CHN_ID, &rga_attr);

这段代码的核心是输入图像(输入分辨率是原分辨率和VI模块一致)和输出分辨率(输出分辨率是自己设置的分辨率)的设置。比方说输入的分辨率是 : 1920*1080,那stImgIn.u32Width = 1920 、stImgIn.u32Height = 1080,输出图像成:1280 * 720,stImgOut.u32Width = 1280、stImgOut.u32Height = 720。

1.3初始化高分辨率VENC编码器、 低分辨率VENC编码器:

高分辨率编码器的初始化

VENC_CHN_ATTR_S high_venc_chn_attr;

high_venc_chn_attr.stVencAttr.u32PicWidth = 1920;

high_venc_chn_attr.stVencAttr.u32PicHeight = 1080;

high_venc_chn_attr.stVencAttr.u32VirWidth = 1920;

high_venc_chn_attr.stVencAttr.u32VirHeight = 1080;

................................

RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &high_venc_chn_attr);

低分辨率编码器的初始化

VENC_CHN_ATTR_S low_venc_chn_attr;

low_venc_chn_attr.stVencAttr.u32PicWidth = 1280;

low_venc_chn_attr.stVencAttr.u32PicHeight = 720;

low_venc_chn_attr.stVencAttr.u32VirWidth = 1280;

low_venc_chn_attr.stVencAttr.u32VirHeight = 720;

................................

RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &low_venc_chn_attr);

高分辨率和低分辨率最核心的设置就是分辨率的设置,高分辨率u32PicWidth = 1920、u32PicHeight = 1920,低分辨率u32PicWidth = 1280、u32PicHeight = 720

1.4 VI绑定高分辨率VENC编码器,VI绑定RGA模块,伪代码如下:

//VI模块绑定RGA模块

MPP_CHN_S vi_chn_s;

vi_chn_s.enModId = RK_ID_VI;

vi_chn_s.s32ChnId = CAMERA_CHN;

MPP_CHN_S rga_chn_s;

rga_chn_s.enModId = RK_ID_RGA;

rga_chn_s.s32ChnId = RGA_CHN_ID;

RK_MPI_SYS_Bind(&vi_chn_s, &rga_chn_s);

//VI模块绑定高分辨率VENC模块

MPP_CHN_S high_venc_chn_s;

high_venc_chn_s_s.enModId = RK_ID_VENC;

high_venc_chn_s_s.s32ChnId = HIGH_VENC_ID;

RK_MPI_SYS_Bind(&vi_chn_s, &high_venc_chn_s);

1.5 创建多线程获取高分辨率编码数据:

开启一个线程去采集每一帧高分辨率的VENC模块数据,使用的API是RK_MPI_SYS_GetMediaBuffer, 模块ID是RK_ID_VENC,通道号ID是高分辨率VENC创建的ID号:

while(1)

{

  .........................

  mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, HIGH_VENC_ID, -1);

  fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1,high_venc_id);

.......................

}

1.6 创建多线程获取低分辨率数据并传输到编码器:

开启一个线程去采集每一帧RGA低分辨率的数据,使用的API是RK_MPI_SYS_GetMediaBuffer, 模块ID是RK_ID_RGA,通道号ID是RGA的通道ID,采集完每一帧RGA数据则使用RK_MPI_SYS_SendMediaBuffer传输到低分辨率编码器这个API伪代码如下

while (1)

{

.........................................

mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, 0, -1);

    RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, LOW_VENC_ID, mb);

................................

}

下面我们来看看RK_MPI_SYS_SendMediaBuffer的具体实现

RK_S32 RK_MPI_SYS_SendMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, MEDIA_BUFFER buffer);

enModID:开发者需要传输的目的模块的ID号,比方说VI模块的数据传输到VENC模块,那么目的模块就是VENC,ID号就是RK_ID_VENC;比方说VI模块的数据传输到RGA模块,那么目的模块就是RGA,ID号就是RK_ID_RGA。

s32ChnID:目的模块的通道号

buffer:缓冲区数据MediaBuffer

1.7.创建多线程获取低分辨率编码数据:

开启一个线程去采集每一帧低分辨率的编码数据,使用的API是RK_MPI_SYS_GetMediaBuffer, 模块ID是RK_ID_VENC,通道号ID是低分辨率VENC创建的ID号这个API伪代码如下

while (1)

{

.........................................

mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, LOW_VENC_ID, -1);

fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, low_venc_file);

................................

}

二.代码实战

#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>// #include "common/sample_common.h"
#include "rkmedia_api.h"#define PIPE_ID 0
#define VI_CHN_ID 0#define RGA_CHN_ID 0#define HIGH_VENC_CHN 0
#define LOW_VENC_CHN 1//创建多线程获取高分辨率的编码码流
void *get_high_venc_thread(void *args)
{pthread_detach(pthread_self());FILE *high_venc_file = fopen("test_high_venc.h264", "w+");MEDIA_BUFFER mb;while (1){//获取每一帧高分辨率编码码流数据mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, HIGH_VENC_CHN, -1);if (!mb){printf("Get High Venc break.....\n");}printf("Get High Venc Success.....\n");fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, high_venc_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}//创建多线程获取RGA码流并发送到低分辨率编码器
void *rga_handle_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb;while (1){//获取每一帧RGA码流数据mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, RGA_CHN_ID, -1);if (!mb){printf("Get RGA break.....\n");}printf("Get RGA Success.....\n");//发送每一帧RGA数据到低分辨率编码器RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, LOW_VENC_CHN, mb);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}//创建多线程获取低分辨率编码码流
void *get_low_venc_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb;FILE * low_venc_file = fopen("test_low_venc.h264", "w+");while (1){//获取每一帧低分辨率编码码流mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, LOW_VENC_CHN, -1);if (!mb){printf("Get LOW VENC break.....\n");}printf("Get LOW VENC Success.....\n");fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, low_venc_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}int main(int argc, char *argv[])
{int ret;RK_MPI_SYS_Init();// VI Init......VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = "rkispp_scale0";//设置视频设备节点路径vi_chn_attr.u32Width = 1920;//设置分辨率的宽度vi_chn_attr.u32Height = 1080;//设置分辨率的高度vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;//设置图像类型vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP;//设置VI获取类型vi_chn_attr.u32BufCnt = 3;//设置缓冲数量vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;//设置VI工作类型ret = RK_MPI_VI_SetChnAttr(PIPE_ID, VI_CHN_ID, &vi_chn_attr);if (ret){printf("VI_CHN_ATTR Set Failed.....\n");return -1;}else{printf("VI_CHN_ATTR Set Success.....\n");}ret = RK_MPI_VI_EnableChn(PIPE_ID, VI_CHN_ID);if (ret){printf("VI_CHN_ATTR Enable Failed.....\n");return -1;}else{printf("VI_CHN_ATTR Enable Success.....\n");}// RGARGA_ATTR_S rga_info;/**Image Input ..............*/rga_info.stImgIn.u32Width = 1920;//设置RGA输入分辨率宽度rga_info.stImgIn.u32Height = 1080;//设置RGA输入分辨率高度rga_info.stImgIn.u32HorStride = 1920;//设置RGA输入分辨率虚宽rga_info.stImgIn.u32VirStride = 1080;//设置RGA输入分辨率虚高rga_info.stImgIn.imgType = IMAGE_TYPE_NV12;//设置ImageType图像类型rga_info.stImgIn.u32X = 0;//设置X坐标rga_info.stImgIn.u32Y = 0;//设置Y坐标/**Image Output......................*/rga_info.stImgOut.u32Width = 1280;//设置RGA输出分辨率宽度rga_info.stImgOut.u32Height = 720;//设置RGA输出分辨率高度rga_info.stImgOut.u32HorStride = 1280;//设置RGA输出分辨率虚宽rga_info.stImgOut.u32VirStride = 720;//设置RGA输出分辨率虚高rga_info.stImgOut.imgType = IMAGE_TYPE_NV12;//设置输出ImageType图像类型rga_info.stImgOut.u32X = 0;//设置X坐标rga_info.stImgOut.u32Y = 0;//设置Y坐标// RGA Public Parameterrga_info.u16BufPoolCnt = 3;//缓冲池计数rga_info.u16Rotaion = 0;//rga_info.enFlip = RGA_FLIP_H;//水平翻转rga_info.bEnBufPool = RK_TRUE;ret = RK_MPI_RGA_CreateChn(RGA_CHN_ID, &rga_info);if (ret){printf("RGA Set Failed.....\n");}else{printf("RGA Set Success.....\n");}// High Venc ParameterVENC_CHN_ATTR_S high_venc_attr;high_venc_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;//设置编码器类型high_venc_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;//设置编码图像类型high_venc_attr.stVencAttr.u32PicWidth = 1920;//设置编码分辨率宽度high_venc_attr.stVencAttr.u32PicHeight = 1080;//设置编码分辨率高度high_venc_attr.stVencAttr.u32VirWidth = 1920;//设置编码分辨率虚宽high_venc_attr.stVencAttr.u32VirHeight = 1080;//设置编码分辨率虚高high_venc_attr.stVencAttr.u32Profile = 66;//设置编码等级high_venc_attr.stVencAttr.enRotation = VENC_ROTATION_0;//设置编码的旋转角度//********* 设置码率控制属性  *******************//high_venc_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//设置H264的CBR码率控制模式high_venc_attr.stRcAttr.stH264Cbr.u32Gop = 25;//设置GOP关键帧间隔high_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;//设置源帧率分子high_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;//设置源帧率分母high_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;//设置目标帧率分子high_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;//设置目标帧率分母high_venc_attr.stRcAttr.stH264Cbr.u32BitRate = 8388608;//设置码率大小ret = RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &high_venc_attr);if (ret){printf("Set High Venc Attr Failed.....\n");}else{printf("Set High Venc Attr Success.....\n");}// Low Venc ParameterVENC_CHN_ATTR_S low_venc_attr;low_venc_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;//设置编码器类型low_venc_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;//设置编码图像类型low_venc_attr.stVencAttr.u32PicWidth = 1280;//设置编码分辨率宽度low_venc_attr.stVencAttr.u32PicHeight = 720;//设置编码分辨率高度low_venc_attr.stVencAttr.u32VirWidth = 1280;//设置编码分辨率虚宽low_venc_attr.stVencAttr.u32VirHeight = 720;//设置编码分辨率虚高low_venc_attr.stVencAttr.u32Profile = 66;//设置编码等级low_venc_attr.stVencAttr.enRotation = VENC_ROTATION_0;//设置编码的旋转角度//********* 设置码率控制属性  *******************//low_venc_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//设置H264的CBR码率控制模式low_venc_attr.stRcAttr.stH264Cbr.u32Gop = 25;//设置GOP关键帧间隔low_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;//设置源帧率分子low_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;//设置源帧率分母low_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;//设置目标帧率分子low_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;//设置目标帧率分母low_venc_attr.stRcAttr.stH264Cbr.u32BitRate = 8388608;//设置码率大小ret = RK_MPI_VENC_CreateChn(LOW_VENC_CHN, &low_venc_attr);if (ret){printf("Set Low Venc Attr Failed.....\n");}else{printf("Set Low Venc Attr Success.....\n");}MPP_CHN_S vi_chn_s;vi_chn_s.enModId = RK_ID_VI;vi_chn_s.s32ChnId = VI_CHN_ID;MPP_CHN_S high_chn_s;high_chn_s.enModId = RK_ID_VENC;high_chn_s.s32ChnId = HIGH_VENC_CHN;//VI绑定高分辨率VENC模块ret = RK_MPI_SYS_Bind(&vi_chn_s, &high_chn_s);if (ret){printf("VI Bind High Venc Failed.....\n");return -1;}else{printf("VI Bind High Venc Success.....\n");}MPP_CHN_S rga_chn_s;rga_chn_s.enModId = RK_ID_RGA;rga_chn_s.s32ChnId = RGA_CHN_ID;//VI绑定RGA模块ret = RK_MPI_SYS_Bind(&vi_chn_s, &rga_chn_s);if (ret){printf("VI Bind RGA Failed.....\n");return -1;}else{printf("VI Bind RGA Success.....\n");}pthread_t high_venc_pid;pthread_t rga_pid;pthread_t low_venc_pid;pthread_create(&high_venc_pid, NULL, get_high_venc_thread, NULL); //创建多线程获取高分辨率的编码码流 pthread_create(&rga_pid, NULL, rga_handle_thread, NULL);//创建多线程获取RGA码流并发送到低分辨率编码器pthread_create(&low_venc_pid, NULL, get_low_venc_thread, NULL);//创建多线程获取低分辨率编码码流while (1){sleep(1);}RK_MPI_SYS_UnBind(&vi_chn_s, &high_chn_s);RK_MPI_SYS_UnBind(&vi_chn_s, &rga_chn_s);RK_MPI_RGA_DestroyChn(RGA_CHN_ID);RK_MPI_VENC_DestroyChn(HIGH_VENC_CHN);RK_MPI_VENC_DestroyChn(LOW_VENC_CHN);RK_MPI_VI_DisableChn(PIPE_ID, VI_CHN_ID);return 0;
}

三.运行的效果:

分别用ffplay播放器分别播出高分辨率H264文件(test_high_venc.h264),低分辨率(test_rga_venc.h264)

ffplay test_high_venc.h264

ffplay test_rga_venc.h264

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

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

相关文章

postman请求后端接受List集合对象

后端集合 post请求&#xff0c;即前端请求方式

TMS320F28P550SJ9学习笔记1:CCS导入工程以及测试连接单片机仿真器

学习记录如何用 CCS导入工程以及测试连接单片机仿真器 以下为我的CCS 以及驱动库C2000ware 的版本 CCS版本&#xff1a; Code Composer Studio 12.8.1 C2000ware &#xff1a;C2000Ware_5_04_00_00 目录 CCS导入工程&#xff1a; 创建工程&#xff1a; 添加工程&#xff1a; C…

MySQL——DQL、多表设计

目录 一、DQL 1.基本查询 2.条件查询 3.分组查询 4.排序查询 5.分页查询 二、多表设计 1.一对多 2.一对一 3.多对多 一、DQL 1.基本查询 注意&#xff1a; *号代表查询所有字段&#xff0c;在实际开发中尽量少用&#xff08;不直观、影响效率&#xff09; 2.条件查询…

千里科技亮相吉利AI智能科技发布会,共启“AI+车”新纪元

今天&#xff0c;在三亚举行的吉利AI智能科技发布会上&#xff0c;千里科技董事长印奇发表了主题为《从“车AI”到“AI车”》的演讲。印奇重点分享了对于“AI车”未来趋势的判断&#xff0c;并重点介绍了在吉利AI科技生态体系下&#xff0c;围绕智驾、智舱等领域的创新合作。基…

rust学习笔记11-集合349. 两个数组的交集

rust除了结构体&#xff0c;还有集合类型&#xff0c;同样也很重要&#xff0c;常见的有数组&#xff08;Array&#xff09;、向量&#xff08;Vector&#xff09;、哈希表&#xff08;HashMap&#xff09; 和 集合&#xff08;HashSet&#xff09;字符串等&#xff0c;好意外呀…

.net8 使用 license 证书授权案例解析

创建 webapi 项目 使用 .NET CLI 创建一个 ASP.NET Core Web API 应用&#xff0c;并添加指定的 NuGet 包&#xff0c;可以按照以下步骤操作&#xff1a; 创建 ASP.NET Core Web API 项目&#xff1a; dotnet new webapi -n WebAppLicense cd WebAppLicense添加 Standard.Li…

QT-自定义参数设计框架软件

QT-自定义参数设计框架软件 Chapter1 QT-自定义参数设计框架软件前言一、演示效果二、使用步骤1.应用进行参数注册2.数据库操作单例对象3.参数操作单例对象 三、下载链接 Chapter2 Qt中管理配置参数&#xff08;QSettings、单例模式&#xff09;1 前言2 QSettings类ini文件写in…

vue实例

// vue应用通过createApp函数创建一个新的应用实例&#xff0c;相当于根组件 import { createApp } from vue import App from ./App.vue // 在一个vue项目当中&#xff0c;有且只有一个vue的实例对象 const appcreateApp(App) // App:根组件 // 实例必须调用了.mount&am…

数据库设计理论与实践

设计理论 数据库范式 与反范式 ER模型 最小值 与最大值 | | &#xff1a;最小一个&#xff0c;最多一个 设计数据库我们只需要关心&#xff1a;一对一&#xff0c;一对多&#xff0c;多对多 。** 多的最小值 可以 不关注** ** 多对多 &#xff1a;我们可以 建立第三张表&am…

不用写代码,批量下载今日头条文章导出excel和pdf

前几天有人问我怎么批量抓取今日头条某个号的所有文章数据&#xff0c;需要文章链接&#xff0c;标题和时间&#xff0c;但是不会写代码&#xff0c;于是我写了个简单的教程 这里以渤海小吏为例 首先用edge浏览器安装web-scraper浏览器扩展 然后打开浏览器控制台&#xff0c;找…

FakeApp 技术浅析(二):生成对抗网络

生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;简称 GANs&#xff09;是 FakeApp 等深度伪造&#xff08;deepfake&#xff09;应用的核心技术。GANs 由 生成器&#xff08;Generator&#xff09; 和 判别器&#xff08;Discriminator&#xff09; 两个…

DeepSeek本地接口调用(Ollama)

前言 上篇博文&#xff0c;我们通过Ollama搭建了本地的DeepSeek模型&#xff0c;本文主要是方便开发人员&#xff0c;如何通过代码或工具&#xff0c;通过API接口调用本地deepSeek模型 前文&#xff1a;DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注&#xff1a;本文不仅…

JavaWeb后端基础(4)

这一篇就开始是做一个项目了&#xff0c;在项目里学习&#xff0c;我主要记录在学习过程中遇到的问题&#xff0c;以及一些知识点 Restful风格 一种软件架构风格 在REST风格的URL中&#xff0c;通过四种请求方式&#xff0c;来操作数据的增删改查。 GET &#xff1a; 查询 …

deepseek本地部署:deepseek-r1-distill-llama-70b应用实践

DeepSeek本地部署之deepseek-r1-distill-llama-70b 本地部署与 AI 应用实践 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;的快速发展为企业数字化带来了前所未有的机遇。然而&#xff0c;中小企业在使用诸如 GPT-4 这类云端大模型服务时&#xff0c;往往面临数…

8. Pandas : Matplotlib 的使用方法

一 Matplotlib 介绍 Matplotlib 原本是为静态图表设计的&#xff0c;因而没有提供 Web 页面上的交互式体验。Plotly 是专为 Web 设计的。&#xff08;第9节&#xff09; 支持 2D 和部分 3D 绘图。涵盖折线图、散点图、热力图、3D 图等 20 余种图表。 二 导入库 import matplotl…

医疗AR眼镜:FPC如何赋能科技医疗的未来之眼?【新立电子】

随着科技的飞速发展&#xff0c;增强现实&#xff08;AR&#xff09;技术在医疗领域的应用逐渐成为焦点。医疗AR眼镜作为一种前沿的智能设备&#xff0c;正在为医疗行业带来深刻的变革。它不仅能够提升医生的工作效率&#xff0c;还能改善患者的就医体验&#xff0c;成为医疗科…

pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码

PySide6的QtCharts类支持绘制各种型状的图表&#xff0c;如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等&#xff0c;下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果&#xff0c;实际使用时参照代码中示例数据的格式将实际数据替换即可…

C/C++中函数指针和指针函数的原理和区别是什么,分别通过用例说明。

文章目录 函数指针和指针函数的区别函数指针指针函数区别 总结 函数指针和指针函数的区别 在C/C中&#xff0c;函数指针和指针函数是两个不同的概念&#xff0c;它们的用途和定义方式也有所不同。 函数指针 定义&#xff1a; 函数指针是一个指向函数的指针&#xff0c;它存储…

获取哔站评论

一、文章立论 哔哩哔哩&#xff08;B站&#xff09;是当前年轻人十分喜爱的视频分享平台&#xff0c;以其丰富多样的内容、互动性强的社区氛围以及独特的弹幕文化深受用户喜爱。在该平台上&#xff0c;用户不仅可以观看各种类型的视频&#xff0c;如动画、游戏、科技、生活、影…

MySQL-表

存储在表中的数据是一种类型的数据&#xff0c;不同类型的数据应放到不同的表中&#xff0c;否则会使以后的检索和访问很困难。数据库中的每个表都有一个名字&#xff0c;用来标识自己。此名字是唯一的&#xff0c; 这表示数据库中没有其他表具有相同的名字。表由一个或多个列组…