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

瑞芯微RV1126——人脸识别源码分析

本节内容主要分为3部分,第一部分是流程结构图;第二部分为人脸识别代码流程;第三部分为具体的代码分析。

1.流程结构图

2.人脸识别代码流程

1、人脸数据的初始化:

init_all_rockx_face_data();init_face_data();

2、创建rtsp会话,这里包括发送码流数据,得客户端,也就是我们在windows上用ffplay去拉流得时候,才会发送码流数据给客户端:

create_rtsp_demo(554);
rtsp_new_session
rtsp_set_video
rtsp_sync_video_ts

**
3、初始化vi通道属性**

 VI_CHN_ATTR_S vi_chn_attr;

4、初始化视频处理属性

RGA_ATTR_S stRgaAttr;

5、初始化编码通道属性:

VENC_CHN_ATTR_S venc_chn_attr;

6、绑定数据源:

RK_MPI_SYS_Bind

7、开始捕获码流:

RK_MPI_VI_StartStream

8、执行三个对应的线程:

  • pthread_create(&rockx_pid, NULL, rockx_vi_detect_thread, NULL);
  • pthread_create(&venc_pid, NULL, rockx_vi_face_recognize_venc_thread, NULL);
  • pthread_create(&rtsp_pid, NULL, rockx_venc_rtsp_thread, NULL);

**9、销毁申请的系统资源; **

3.核心代码分析

初始化vi通道属性;初始化视频处理属性;初始化编码通道属性;绑定数据源;开始捕获码流:

//初始化vi通道属性VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = pDeviceName;vi_chn_attr.u32BufCnt = u32BufCnt;vi_chn_attr.u32Width = u32Width;vi_chn_attr.u32Height = u32Height;//你的摄像头分辨率大小不要超过vencvi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP;vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;ret = RK_MPI_VI_SetChnAttr(s32CamId, 0, &vi_chn_attr);//设置vi通道属性ret |= RK_MPI_VI_EnableChn(s32CamId, 0);//使能vi通道属性,让其生效if (ret){printf("ERROR: create rkisp0 VI[0] error! ret=%d\n", ret);return 0;}//初始化rga属性RGA_ATTR_S stRgaAttr;stRgaAttr.bEnBufPool = RK_TRUE;stRgaAttr.u16BufPoolCnt = 2;stRgaAttr.u16Rotaion = 0;stRgaAttr.stImgIn.u32X = 0;stRgaAttr.stImgIn.u32Y = 0;stRgaAttr.stImgIn.imgType = IMAGE_TYPE_NV12;stRgaAttr.stImgIn.u32Width = u32Width;stRgaAttr.stImgIn.u32Height = u32Height;stRgaAttr.stImgIn.u32HorStride = u32Width;stRgaAttr.stImgIn.u32VirStride = u32Height;stRgaAttr.stImgOut.u32X = 0;stRgaAttr.stImgOut.u32Y = 0;stRgaAttr.stImgOut.imgType = IMAGE_TYPE_NV12;stRgaAttr.stImgOut.u32Width = disp_width;stRgaAttr.stImgOut.u32Height = disp_height;stRgaAttr.stImgOut.u32HorStride = disp_width;stRgaAttr.stImgOut.u32VirStride = disp_height;ret = RK_MPI_RGA_CreateChn(0, &stRgaAttr);//rga通道if (ret){printf("ERROR: Create rga[0] falied! ret=%d\n", ret);return -1;}//初始化编码属性VENC_CHN_ATTR_S venc_chn_attr;memset(&venc_chn_attr, 0, sizeof(VENC_CHN_ATTR_S));venc_chn_attr.stVencAttr.u32PicWidth = disp_width;venc_chn_attr.stVencAttr.u32PicHeight = disp_height;venc_chn_attr.stVencAttr.u32VirWidth = disp_width;venc_chn_attr.stVencAttr.u32VirHeight = disp_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 = 30;venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = disp_width * disp_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(0, &venc_chn_attr);//创建编码通道if (ret){printf("ERROR: Create venc failed!\n");exit(0);}//初始化mpp通道MPP_CHN_S vi_chn;MPP_CHN_S rga_chn;vi_chn.enModId = RK_ID_VI;vi_chn.s32ChnId = 0;rga_chn.enModId = RK_ID_RGA;rga_chn.s32ChnId = 0;ret = RK_MPI_SYS_Bind(&vi_chn, &rga_chn);//绑定vi和rga通道if (ret != 0){printf("[VI] vi id: %d bind venc id: %d, ret: %d error\n", vi_chn.s32ChnId, rga_chn.s32ChnId, ret);return -1;}

初始化三个线程

  //初始化三个线程idpthread_t rockx_pid;pthread_t venc_pid;pthread_t rtsp_pid;//创建人脸检测线程pthread_create(&rockx_pid, NULL, rockx_vi_detect_thread, NULL);//人脸识别线程pthread_create(&venc_pid, NULL, rockx_vi_face_recognize_venc_thread, NULL);//人脸编码rtsp传输线程pthread_create(&rtsp_pid, NULL, rockx_venc_rtsp_thread, NULL);

人脸检测线程

void *rockx_vi_detect_thread(void *args)
{//自动释放线程资源pthread_detach(pthread_self());//创建一个类对象thread_mapS_THREAD_MAP thread_map;//对thread_map进行初始化get_thread_map(0, &thread_map);//定义了一个map类型database_face_map对象map<string, rockx_face_feature_t> database_face_map = thread_map.thread_map;//定义迭代器database_itermap<string, rockx_face_feature_t>::iterator database_iter;//定义一个缓冲区MEDIA_BUFFER src_mb = NULL;//人脸模式枚举变量定义rockx_module_t data_version;data_version = ROCKX_MODULE_FACE_DETECTION_V2;//定义一个人脸执行返回结果变量rockx_ret_t rockx_ret;//定义人脸检测处理指针变量rockx_handle_t face_det_handle;//定义人脸识别特征提取处理指针变量rockx_handle_t face_recognize_handle;//定义人脸特征点定位处理指针变量rockx_handle_t face_5landmarks_handle;//定义了人脸标记检测处理指针变量rockx_handle_t face_masks_det_handle;//定义人脸配置结构体指针变量rockx_config_t *config = rockx_create_config();//获取人脸配置值//添加配置人脸模型存放路径,这里是存放在共享目录下:/mnt/nfs/rockx_data/rockx_add_config(config, ROCKX_CONFIG_DATA_PATH, "/mnt/nfs/rockx_data/");//创建使用人脸模型数据,来处理人脸检测rockx_ret = rockx_create(&face_det_handle, data_version, config,sizeof(rockx_config_t));//判断是否创建使用人脸模型数据 来处理人脸检测是否成功                         if (rockx_ret != ROCKX_RET_SUCCESS){printf("init face_detect error %d\n", rockx_ret);return NULL;}//使用人脸模型数据来人脸识别特征提取rockx_ret = rockx_create(&face_recognize_handle, ROCKX_MODULE_FACE_RECOGNIZE,config, sizeof(rockx_config_t));//识别是否成功                         if (rockx_ret != ROCKX_RET_SUCCESS){printf("init face_recognize error %d\n", rockx_ret);return NULL;}//使用模型算法数据来做人脸特征点定位处理rockx_ret = rockx_create(&face_5landmarks_handle,ROCKX_MODULE_FACE_LANDMARK_5, config, 0);//判断是否处理成功                         if (rockx_ret != ROCKX_RET_SUCCESS){printf("init rockx module ROCKX_MODULE_FACE_LANDMARK_68 error %d\n",rockx_ret);}// rockx_handle_t face_masks_det_handle;进行标记处理rockx_ret = rockx_create(&face_masks_det_handle,ROCKX_MODULE_FACE_MASKS_DETECTION, config, 0);if (rockx_ret != ROCKX_RET_SUCCESS){printf("init rockx module ROCKX_MODULE_FACE_MASKS_DETECTION error %d\n",rockx_ret);}//定义人脸图片结构体变量,并进行成员赋值rockx_image_t input_image;input_image.width = 1920;input_image.height = 1080;input_image.pixel_format = ROCKX_PIXEL_FORMAT_YUV420SP_NV12;bool is_recognize = false;string predict = "";//rockx_face_result_t face_result;int ret;//做轮询操作while (!quit){
#if 1//从指定通道中获取数据缓冲区src_mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI, 0, -1);if (!src_mb){printf("ERROR: RK_MPI_SYS_GetMediaBuffer get null buffer!\n");break;}//从指定的MEDIA_BUFFER中获取缓冲区数据大小input_image.size = RK_MPI_MB_GetSize(src_mb);input_image.data = (unsigned char *)RK_MPI_MB_GetPtr(src_mb);//从指定的MEDIA_BUFFER中获取缓冲区数据指针
#endif#if 1//rockx_face_result_group_t face_result_group;//memset(&face_result_group, 0, sizeof(face_result_group));//定义人脸处理结果结构体变量rockx_object_array_t face_array;memset(&face_array, 0, sizeof(face_array));//开始人脸检测rockx_ret = rockx_face_detect(face_det_handle, &input_image, &face_array, NULL);if (rockx_ret != ROCKX_RET_SUCCESS){printf("rockx_face_detect ERROR %d\n", rockx_ret);}//进行互斥处理set_rockx_face_array(face_array);//判断检测人脸特征数量值是否大于0if (face_array.count > 0){//rockx_queue->putRockxFaceArray(face_array);printf("face_count : %d\n", face_array.count);for (int i = 0; i < face_array.count; i++){if (1){int is_false_face;//进行人脸过滤处理ret = rockx_face_filter(face_5landmarks_handle, &input_image,&face_array.object[i].box, &is_false_face);if (ret != ROCKX_RET_SUCCESS){printf("rockx_face_filter error %d\n", ret);}if (is_false_face)continue;}
#if 1//人脸检测结果(包括人脸、车牌、头部、物体等)变量定义rockx_object_t max_face;rockx_object_t cur_face = face_array.object[i];//进行人脸区域计算处理操作int cur_face_box_area = (cur_face.box.right - cur_face.box.left) *(cur_face.box.bottom - cur_face.box.top);int max_face_box_area = (max_face.box.right - max_face.box.left) *(max_face.box.bottom - max_face.box.top);if (cur_face_box_area > max_face_box_area){max_face = cur_face;}//检测输出处理rockx_image_t out_img;memset(&out_img, 0, sizeof(rockx_image_t));//进行面部矫正对齐ret = rockx_face_align(face_5landmarks_handle, &input_image,&(max_face.box), NULL, &out_img);if (ret != ROCKX_RET_SUCCESS){printf("face_align failed\n");}//人脸特征结果变量定义rockx_face_feature_t out_feature;//获取人脸特征rockx_face_recognize(face_recognize_handle, &out_img, &out_feature);for (database_iter = database_face_map.begin();database_iter != database_face_map.end(); database_iter++){float similarity;//比较两个人脸特征的相似性ret = rockx_face_feature_similarity(&database_iter->second,&out_feature, &similarity);printf("simple_value = %lf\n", similarity);//判断预测精度if (similarity <= 1.0){is_recognize = true;//predict_name_bak = database_iter->first;predict = database_iter->first;break;}else{is_recognize = false;predict = "";continue;}}if (is_recognize == true){predict = database_iter->first;}else{predict = "";}set_rockx_prdict_name(predict);#endif}}
#endif//释放缓冲区RK_MPI_MB_ReleaseBuffer(src_mb);src_mb = NULL;}//释放相关人脸处理数据模块rockx_destroy(face_det_handle);rockx_destroy(face_recognize_handle);rockx_destroy(face_5landmarks_handle);return NULL;
}

人脸识别线程

void *rockx_vi_face_recognize_venc_thread(void *args)
{pthread_detach(pthread_self());//线程资源自动释放MEDIA_BUFFER mb = NULL; //媒体缓存区int ret;float x_rate = (float)1280 / 1920;float y_rate = (float)720 / 1080;while (!quit){//从指定通道中获取数据缓冲区mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, 0, -1);if (!mb){printf("ERROR: RK_MPI_SYS_GetMediaBuffer get null buffer!\n");break;}//获取人脸处理结果rockx_object_array_t face_array = get_rockx_face_array();//创建mat对象,并创建了720x1080的像素块,每个像素每个通道的位数都是8位,一个字节的。上述CV_8UC3中的8表示8位、UC表示uchar类型、1表示1个通道Mat tmp_img = Mat(720, 1280, CV_8UC1, RK_MPI_MB_GetPtr(mb));
#if 1//对人脸x,y,w,h进行处理for (int i = 0; i < face_array.count; i++){int x = face_array.object[i].box.left * x_rate;int y = face_array.object[i].box.top * y_rate;int w = (face_array.object[i].box.right - face_array.object[i].box.left) * x_rate;int h = (face_array.object[i].box.bottom - face_array.object[i].box.top) * y_rate;if (x < 0)x = 0;if (y < 0)y = 0;while ((uint32_t)(x + w) >= 1280){w -= 16;}while ((uint32_t)(y + h) >= 720){h -= 16;}//获取人脸预测名字string predict_name = get_rockx_prdict_name();printf("predict_name = %s\n", predict_name.c_str());nv12_border((char *)RK_MPI_MB_GetPtr(mb), 1280, 720, x, y, w, h, 255, 0, 255);int baseline;//计算人脸名字文本大小Size text_size = getTextSize(predict_name, 2, 2, 2, &baseline);Point origin;origin.x = tmp_img.cols / 4 - text_size.width / 4;origin.y = tmp_img.rows / 4 + text_size.height / 4;//把名字字符填充到文本框里面去cv::putText(tmp_img, predict_name, origin, cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 0, 255), 3);}
#endif//释放对应的资源RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, 0, mb);RK_MPI_MB_ReleaseBuffer(mb);mb = NULL;}return NULL;
}

人脸编码rtsp传输线程

void *rockx_venc_rtsp_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb = NULL;while (!quit){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, 0, -1);if (!mb){printf("ERROR: RK_MPI_SYS_GetMediaBuffer get null buffer!\n");break;}//rtsp来传输码流rtsp_tx_video(g_rtsp_session, (unsigned char *)RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), RK_MPI_MB_GetTimestamp(mb));RK_MPI_MB_ReleaseBuffer(mb);rtsp_do_event(g_rtsplive);}return NULL;
}

相关文章:

瑞芯微RV1126——人脸识别源码分析

本节内容主要分为3部分&#xff0c;第一部分是流程结构图;第二部分为人脸识别代码流程;第三部分为具体的代码分析。 1.流程结构图 2.人脸识别代码流程 1、人脸数据的初始化&#xff1a; init_all_rockx_face_data();init_face_data();2、创建rtsp会话&#xff0c;这里包括发…...

springboot 两个相同类型的Bean使用@Resouce加载

问题描述 有两个相同类型的Bean 使用Service等注解注入或者Bean注入启动以后报错&#xff1a; qualifying bean of type com.fasterxml.jackson.databind.ObjectMapper available: expected single matching bean but found 2提示有相同的类型两个。 解决 * 每个Bean Resour…...

代码随想录算法跟练 | Day3 | 链表Part1

个人博客主页&#xff1a;http://myblog.nxx.nx.cn 代码GitHub地址&#xff1a;https://github.com/nx-xn2002/Data_Structure.git Day3 203.移除链表元素 题目链接&#xff1a; https://leetcode.cn/problems/remove-linked-list-elements/ 题目描述&#xff1a; 给你一个…...

虚拟化技术[1]之服务器虚拟化

文章目录 虚拟化技术简介数据中心虚拟化 服务器虚拟化服务器虚拟化层次寄居虚拟化裸机虚拟化VMM无法直接捕获特权指令解决方案 服务器虚拟化底层实现CPU虚拟化内存虚拟化I/O设备虚拟化 虚拟机迁移虚拟机动态迁移迁移内容&#xff1a;内存迁移迁移内容&#xff1a;网络资源迁移迁…...

WPF之容器标签之Canvas布局标签

Canvas: 定义一个区域&#xff0c;可在其中使用相对于 Canvas 区域的坐标以显式方式来定位子元素。 实例 可以在子标签使用Canvas属性设置定位 <Canvas Width"500" Height"300"><StackPanel Width"100" Height"100"Backgro…...

AIGC绘画设计基础-建筑设计应用

一、AI及AIGC 对于AI大家都不陌生&#xff0c;但是AIGC这个概念好多人其实不大清楚。“AI”是指人工智能技术本身&#xff0c;而“AIGC”是指基于人工智能技术而生成的内容。 生成式人工智能——AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;&…...

Pinia:状态管理库

Pinia 为vue设计的一个现代化的状态管理库,vue3生态系统中的一个核心组件, 专为利用Vue3的新特性设计,替代Vuex称为Vue应用的状态管理标准,提供了更简洁的API,更好的类型安全,以及易于调试的功能 状态管理 在前端应用开发中,用来集中管理和协调应用程序状态的一种工具.在这…...

Mokito的一些API

Mockito是一个Java单元测试框架&#xff0c;它允许开发者创建和配置模拟对象&#xff08;mock objects&#xff09;&#xff0c;以便在隔离的环境中测试代码&#xff0c;尤其是当实际对象难以构造或其行为不确定时。下面是一些核心的Mockito API及其使用场景和代码示例。 基础…...

前端已死? Bootstrap--CSS组件

目录 Bootstrap 下载 Bootstrap--全局CSS样式 栅格系统 栅格参数 正常显示 实例 代码演示: 排版 代码演示 表格 代码演示 表单 代码演示 等等...(文档很清晰了) Bootstrap--组件 结合演示:(页面) Bootstrap Bootstrap v3 中文文档 Bootstrap 是最受欢迎的 HT…...

codewars check_same_case 题解

题目 编写一个函数来检查两个给定的字符是否大小写相同。 如果任何字符不是字母&#xff0c;则返回-1如果两个字符大小写相同&#xff0c;则返回1如果两个字符都是字母且大小写不同&#xff0c;则返回0 例子 a并g返回1A并C返回1b并G返回0B并g返回00并?返回-1题解 1 此题主…...

【Text2SQL 经典模型】X-SQL

论文&#xff1a;X-SQL: reinforce schema representation with context ⭐⭐⭐⭐ Microsoft, arXiv:1908.08113 X-SQL 与 SQLova 类似&#xff0c;使用 BERT style 的 PLM 来获得 representation&#xff0c;只是融合 NL question 和 table schema 的信息的方式不太一样&#…...

蓉耀·时尚双子星------Yestar艺星首家星美学概念院璀璨启航

在医美行业的璀璨星空中&#xff0c;一颗新星于蓉城冉冉升起&#xff0c;点亮了求美者的道路。5月21日&#xff0c;蓉耀•时尚双⼦星--Yestar艺星首家星美学概念院在成都复城国际璀璨启幕&#xff0c;标志着Yestar艺星全球战略布局在蓉城迈出了重要一步&#xff0c;也意味着其在…...

Undet for SketchUp 2023.3 点云建模软件 支持支持草图大师sketchup2021-2022-2023

1.Undet for sketchup 2023.3支持草图大师sketchup2021-2022-2023。支持机载雷达扫描、车载扫描还是地面扫描&#xff0c;对AEC行业用户来说&#xff0c;真正需要的是如何将这些数据快速处理为三维模型&#xff0c;这样才能将这些信息延展到BIM领域发挥效用。因此面对这些海量的…...

CHI dataless 传输——CHI(4)

上篇介绍了read的操作类型&#xff0c;本篇我们来介绍一下dataless 目录 一、dataless操作概览 二、Non-CMO (Non-Cache Maintenance Operation) 1、CleanUnique 2、StashOnce and StashOnceSep 3、Evict 三、CMO (Cache Maintenance Operation) 一、dataless操作概览 名…...

vue3第三十节(vue3 vite中使用sass)

引言&#xff1a;什么是Sass? Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;是一种CSS预处理器&#xff0c;它扩展了CSS的功能&#xff0c;提供了更高级的语法和特性&#xff0c;例如变量、嵌套、混合、继承和颜色功能等&#xff0c;这些特性可以帮助开发…...

blender 烘焙渲染图片,已经导出fbx,导出贴图。插件生成图片

1.新建一个模型。选择资产浏览器的材质&#xff0c;并拖动到模型身上&#xff0c;如下图。资产浏览器的材质可以网上找。 2.打开着色器面板。正下方着色器窗口中&#xff0c;点击空白取消选择&#xff0c;然后右击-添加-着色器-原理化BSDF&#xff0c;右击-添加-纹理-图像纹理。…...

ASO行业面临洗牌,苹果应用商店加搜索广告!

苹果公司全球市场营销高级副总裁菲尔席勒(Phil Schiller),在全球开发者大会开幕前(WWDC)透露了一些应用商店方面的消息。重点包括:1.应用商店搜索中加入广告;2.应用审核加快;3.新的商业模式。 一、 Search Ads搜索广告 这是最令人惊讶的改变,苹果在App Store平台的搜索结果中加…...

Labelme自定义数据集COCO格式【实例分割】

参考博客 labelme标注自定义数据集COCO类型_labelme标注coco-CSDN博客 LabelMe使用_labelme中所有的create的作用解释-CSDN博客 1制作自己的数据集 1.1labelme安装 自己的数据和上面数据的区别就在于没有.json标签文件&#xff0c;所以训练自己的数据关键步骤就是获取标签文…...

【网络安全】Linux 应急响应-溯源-系统日志排查知识点

Linux 应急响应-溯源-系统日志排查知识点汇总 1. 查看当前已经登录到系统的用户 (w 命令) w2. 查看所有用户最近一次登录 (lastlog 命令) lastlog lastlog | grep -v "Never logged in"3. 查看历史登录用户以及登录失败的用户 (last 和 lastb 命令) last lastb4. …...

Spark项目实训(一)

目录 实验任务一&#xff1a;计算级数 idea步骤分步&#xff1a; 完整代码&#xff1a; linux步骤分布&#xff1a; 实验任务二&#xff1a;统计学生成绩 idea步骤分布&#xff1a; 完整代码&#xff1a; linux步骤分步&#xff1a; 实验任务一&#xff1a;计算级数 请…...

爬虫基础1

一、爬虫的基本概念 1.什么是爬虫&#xff1f; 请求网站并提取数据的自动化程序 2.爬虫的分类 2.1 通用爬虫&#xff08;大而全&#xff09; 功能强大&#xff0c;采集面广&#xff0c;通常用于搜索引擎&#xff1a;百度&#xff0c;360&#xff0c;谷歌 2.2 聚焦爬虫&#x…...

vlan综合实验

1、实验拓扑 2、实验要求 1、pc1和pc3所在接口为access;属于vlan 2; pc2/pc4/pc5/pc6处于同一网段&#xff1b;其中pc2可以访问pc4/pc5/pc6&#xff1b; pc4可以访问pc6&#xff1b;pc5不能访问pc6&#xff1b; 2、pc1/pc3与pc2/pc4/pc5/pc6不在同一网段; 3、所有pc通过DHC…...

如何使用ffmpeg 实现10种特效

相关特效的名字 特效id 特效名 1 向上移动 2 向左移动 3 向下移动 4 颤抖 5 摇摆 6 雨刷 7 弹入 8 弹簧 9 轻微跳动 10 跳动 特效展示(同时汇总相关命令) pad背景显示 pad背景透明 相关命令(一会再讲这些命令&#xff0c;先往下看) # 合成特效语音 ffmpeg -y -loglevel erro…...

C语言如果变量全部在全局内存空间会怎么样

结论先行 应该根据内存使用的生命周期&#xff0c;选择合适的内存空间应该尽量使用连续内存如果不想在设计封装性上付出太多代价&#xff0c;全部放入全局空间也比较可取 空间类型特点全局空间生命周期最久&#xff0c;空间连续&#xff0c;变量分配紧致&#xff0c;但存在浪…...

【YOLO改进】换遍MMPretrain主干网络之ConvNeXt-Tiny(基于MMYOLO)

ConvNeXt-Tiny ConvNeXt-Tiny 是一种改进的卷积神经网络架构&#xff0c;其设计目的是在保持传统卷积神经网络优势的同时&#xff0c;借鉴了一些Transformer架构的成功经验。 ConvNeXt-Tiny 的优点 架构优化&#xff1a; ConvNeXt-Tiny 对经典ResNet架构进行了多种优化&#…...

【数据库】MySQL

文章目录 概述DDL数据库操作查询使用创建删除 表操作创建约束MySqL数据类型数值类型字符串类型日期类型 查询修改删除 DMLinsertupdatedelete DQL基本查询条件查询分组查询分组查询排序查询分页查询 多表设计一对多一对一多对多设计步骤 多表查询概述内连接外连接 子查询标量子…...

JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解

文章目录 1. 查看默认GC2. Serial GC : 串行回收3. ParNew GC&#xff1a;并行回收4. Parallel GC&#xff1a;吞吐量优先 1. 查看默认GC -XX:PrintCommandLineFlags&#xff1a;查看命令行相关参数&#xff08;包含使用的垃圾收集器&#xff09;使用命令行指令&#xff1a;ji…...

The Missing Semester of Your CS Education(计算机教育中缺失的一课)

Shell 工具和脚本(Shell Tools and Scripting) 一、shell脚本 1.1、变量赋值 在bash中为变量赋值的语法是foobar&#xff0c;访问变量中存储的数值&#xff0c;其语法为 $foo。 需要注意的是&#xff0c;foo bar &#xff08;使用空格隔开&#xff09;是不能正确工作的&…...

如何为ChatGPT编写有效的提示词:软件开发者的指南

作为一名软件开发者&#xff0c;特别是使用Vue进行开发的开发者&#xff0c;与ChatGPT等AI助手高效互动&#xff0c;可以极大地提升你的开发效率。本文将深入探讨如何编写有效的提示词&#xff0c;以便从ChatGPT中获取有用的信息和帮助。 1. 明确目标 在编写提示词之前&#…...

angular插值语法与属性绑定

在 Angular 中&#xff0c;您提供的两种写法都是用来设置 HTML 元素的 title 属性&#xff0c;但它们的工作方式有所不同&#xff1a; 插值语法 (Interpolation) <h1 title"{{ name }}">我的名字</h1> 属性绑定 (Property Binding) <h1 [title]&q…...