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

RV1126通过创建多线程获取高低编码器的分辨率视频

效果高VENC低VENC占用空间高分辨率的是20几MB低分辨率是几MB编码流程一、VIVideo Input 视频输入模块初始化使能通道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(Video Input channel deploy failed ....\n); return -1; } else { printf(Video Input channel deploy success! ----------\n); } //Enable Channel ret RK_MPI_VI_EnableChn(PIPE_ID,VI_CHN_ID); if(ret) { printf(Enable Channel failed!....\n); return -2; } else { printf(Enable Channel success!--------\n); }二、RGA图像模块初始化//set RGA RGA_ATTR_S My_RGA_Init; //Input My_RGA_Init.stImgIn.u32Width 1920; My_RGA_Init.stImgIn.u32Height 1080; My_RGA_Init.stImgIn.u32HorStride 1920; My_RGA_Init.stImgIn.u32VirStride 1080; My_RGA_Init.stImgIn.imgType IMAGE_TYPE_NV12; My_RGA_Init.stImgIn.u32X 0; My_RGA_Init.stImgIn.u32Y 0; //Output My_RGA_Init.stImgOut.u32Width 1280; My_RGA_Init.stImgOut.u32Height 720; My_RGA_Init.stImgOut.u32HorStride 1280; My_RGA_Init.stImgOut.u32VirStride 720; My_RGA_Init.stImgOut.imgType IMAGE_TYPE_NV12; My_RGA_Init.stImgOut.u32X 0; My_RGA_Init.stImgOut.u32Y 0; My_RGA_Init.u16Rotaion 0; My_RGA_Init.bEnBufPool RK_TRUE; My_RGA_Init.u16BufPoolCnt 3; My_RGA_Init.enFlip RGA_FLIP_H; ret RK_MPI_RGA_CreateChn(RGA_CHN_ID,My_RGA_Init); if(ret) { printf(RGA_Channel create failed!....\n); return -3; } else { printf(RGA_Channel create success!--------\n); }三、配置高分辨率编码器//set high_venc VENC_CHN_ATTR_S My_High_venc; //set stVencAttr My_High_venc.stVencAttr.enType RK_CODEC_TYPE_H264; My_High_venc.stVencAttr.imageType IMAGE_TYPE_NV12; My_High_venc.stVencAttr.u32VirWidth 1920; My_High_venc.stVencAttr.u32VirHeight 1080; My_High_venc.stVencAttr.u32Profile 66; My_High_venc.stVencAttr.u32PicWidth 1920; My_High_venc.stVencAttr.u32PicHeight 1080; My_High_venc.stVencAttr.enRotation VENC_ROTATION_0; //SET stRcAttr My_High_venc.stRcAttr.enRcMode VENC_RC_MODE_H264CBR; My_High_venc.stRcAttr.stH264Cbr.u32Gop 25; My_High_venc.stRcAttr.stH264Cbr.u32SrcFrameRateDen 1; My_High_venc.stRcAttr.stH264Cbr.u32SrcFrameRateNum 25; My_High_venc.stRcAttr.stH264Cbr.fr32DstFrameRateDen 1; My_High_venc.stRcAttr.stH264Cbr.fr32DstFrameRateNum 25; My_High_venc.stRcAttr.stH264Cbr.u32BitRate 8388608; ret RK_MPI_VENC_CreateChn(HIGH_VENC_CHN,My_High_venc); if(ret) { printf(HIGH_VENC Create failed!....\n); return -4; } else { printf(HIGH_VENC Create success!--------\n); }四、设置低分辨率编码器//set low_venc VENC_CHN_ATTR_S My_Low_venc; //set stVencAttr My_Low_venc.stVencAttr.enType RK_CODEC_TYPE_H264; My_Low_venc.stVencAttr.imageType IMAGE_TYPE_NV12; My_Low_venc.stVencAttr.u32VirWidth 1280; My_Low_venc.stVencAttr.u32VirHeight 720; My_Low_venc.stVencAttr.u32Profile 66; My_Low_venc.stVencAttr.u32PicWidth 1280; My_Low_venc.stVencAttr.u32PicHeight 720; My_Low_venc.stVencAttr.enRotation VENC_ROTATION_0; //SET stRcAttr My_Low_venc.stRcAttr.enRcMode VENC_RC_MODE_H264CBR; My_Low_venc.stRcAttr.stH264Cbr.u32Gop 25; My_Low_venc.stRcAttr.stH264Cbr.u32SrcFrameRateDen 1; My_Low_venc.stRcAttr.stH264Cbr.u32SrcFrameRateNum 25; My_Low_venc.stRcAttr.stH264Cbr.fr32DstFrameRateDen 1; My_Low_venc.stRcAttr.stH264Cbr.fr32DstFrameRateNum 25; My_Low_venc.stRcAttr.stH264Cbr.u32BitRate 2097152; ret RK_MPI_VENC_CreateChn(LOW_VENC_CHN,My_Low_venc); if(ret) { printf(LOW_VENC_CHN Create failed!....\n); return -5; } else { printf(LOW_VENC_CHN Create success!--------\n); }五、绑定然后创建线程六、全部代码是这样的#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 *rags); void *rga_handle_thread(void *args); void *get_low_venc_thread(void *rags); 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(Video Input channel deploy failed ....\n); return -1; } else { printf(Video Input channel deploy success! ----------\n); } //Enable Channel ret RK_MPI_VI_EnableChn(PIPE_ID,VI_CHN_ID); if(ret) { printf(Enable Channel failed!....\n); return -2; } else { printf(Enable Channel success!--------\n); } //set RGA RGA_ATTR_S My_RGA_Init; //Input My_RGA_Init.stImgIn.u32Width 1920; My_RGA_Init.stImgIn.u32Height 1080; My_RGA_Init.stImgIn.u32HorStride 1920; My_RGA_Init.stImgIn.u32VirStride 1080; My_RGA_Init.stImgIn.imgType IMAGE_TYPE_NV12; My_RGA_Init.stImgIn.u32X 0; My_RGA_Init.stImgIn.u32Y 0; //Output My_RGA_Init.stImgOut.u32Width 1280; My_RGA_Init.stImgOut.u32Height 720; My_RGA_Init.stImgOut.u32HorStride 1280; My_RGA_Init.stImgOut.u32VirStride 720; My_RGA_Init.stImgOut.imgType IMAGE_TYPE_NV12; My_RGA_Init.stImgOut.u32X 0; My_RGA_Init.stImgOut.u32Y 0; My_RGA_Init.u16Rotaion 0; My_RGA_Init.bEnBufPool RK_TRUE; My_RGA_Init.u16BufPoolCnt 3; My_RGA_Init.enFlip RGA_FLIP_H; ret RK_MPI_RGA_CreateChn(RGA_CHN_ID,My_RGA_Init); if(ret) { printf(RGA_Channel create failed!....\n); return -3; } else { printf(RGA_Channel create success!--------\n); } //set high_venc VENC_CHN_ATTR_S My_High_venc; //set stVencAttr My_High_venc.stVencAttr.enType RK_CODEC_TYPE_H264; My_High_venc.stVencAttr.imageType IMAGE_TYPE_NV12; My_High_venc.stVencAttr.u32VirWidth 1920; My_High_venc.stVencAttr.u32VirHeight 1080; My_High_venc.stVencAttr.u32Profile 66; My_High_venc.stVencAttr.u32PicWidth 1920; My_High_venc.stVencAttr.u32PicHeight 1080; My_High_venc.stVencAttr.enRotation VENC_ROTATION_0; //SET stRcAttr My_High_venc.stRcAttr.enRcMode VENC_RC_MODE_H264CBR; My_High_venc.stRcAttr.stH264Cbr.u32Gop 25; My_High_venc.stRcAttr.stH264Cbr.u32SrcFrameRateDen 1; My_High_venc.stRcAttr.stH264Cbr.u32SrcFrameRateNum 25; My_High_venc.stRcAttr.stH264Cbr.fr32DstFrameRateDen 1; My_High_venc.stRcAttr.stH264Cbr.fr32DstFrameRateNum 25; My_High_venc.stRcAttr.stH264Cbr.u32BitRate 8388608; ret RK_MPI_VENC_CreateChn(HIGH_VENC_CHN,My_High_venc); if(ret) { printf(HIGH_VENC Create failed!....\n); return -4; } else { printf(HIGH_VENC Create success!--------\n); } //set low_venc VENC_CHN_ATTR_S My_Low_venc; //set stVencAttr My_Low_venc.stVencAttr.enType RK_CODEC_TYPE_H264; My_Low_venc.stVencAttr.imageType IMAGE_TYPE_NV12; My_Low_venc.stVencAttr.u32VirWidth 1280; My_Low_venc.stVencAttr.u32VirHeight 720; My_Low_venc.stVencAttr.u32Profile 66; My_Low_venc.stVencAttr.u32PicWidth 1280; My_Low_venc.stVencAttr.u32PicHeight 720; My_Low_venc.stVencAttr.enRotation VENC_ROTATION_0; //SET stRcAttr My_Low_venc.stRcAttr.enRcMode VENC_RC_MODE_H264CBR; My_Low_venc.stRcAttr.stH264Cbr.u32Gop 25; My_Low_venc.stRcAttr.stH264Cbr.u32SrcFrameRateDen 1; My_Low_venc.stRcAttr.stH264Cbr.u32SrcFrameRateNum 25; My_Low_venc.stRcAttr.stH264Cbr.fr32DstFrameRateDen 1; My_Low_venc.stRcAttr.stH264Cbr.fr32DstFrameRateNum 25; My_Low_venc.stRcAttr.stH264Cbr.u32BitRate 2097152; ret RK_MPI_VENC_CreateChn(LOW_VENC_CHN,My_Low_venc); if(ret) { printf(LOW_VENC_CHN Create failed!....\n); return -5; } else { printf(LOW_VENC_CHN Create 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; ret RK_MPI_SYS_Bind(vi_chn_s,high_chn_s); if(ret) { printf(My_High_venc bind failed!....\n); return -6; } else { printf(My_High_venc bind success!--------\n); } MPP_CHN_S rga_chn_s; rga_chn_s.enModId RK_ID_RGA; rga_chn_s.s32ChnId RGA_CHN_ID; ret RK_MPI_SYS_Bind(vi_chn_s,rga_chn_s); if(ret) { printf(rga_chn_s bind failed!....\n); return -7; } else { printf(rga_chn_s bind success!--------\n); } //create pthread pthread_t high_venc_pid; pthread_t low_venc_pid; pthread_t rga_pid; pthread_create(high_venc_pid,NULL,get_high_venc_thread,NULL); pthread_create(rga_pid,NULL,rga_handle_thread,NULL); 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; } void *get_high_venc_thread(void *rags) { 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 higt venc failed!....\n); } else { printf(get higt 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; } void *rga_handle_thread(void *args) { pthread_detach(pthread_self()); MEDIA_BUFFER mb; while(1) { mb RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA,RGA_CHN_ID,-1); if(!mb) { printf(rga handle failed!....\n); } else { printf(rga handle success!--------\n); RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, LOW_VENC_CHN, mb); RK_MPI_MB_ReleaseBuffer(mb); } } return NULL; } void *get_low_venc_thread(void *rags) { pthread_detach(pthread_self()); FILE *low_venc_file fopen(test_low_venc.h264,w); MEDIA_BUFFER mb; while(1) { mb RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC,LOW_VENC_CHN,-1); if(!mb) { printf(get low venc failed!....\n); } else { 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; }

相关文章:

RV1126通过创建多线程获取高低编码器的分辨率视频

效果高VENC低VENC占用空间高分辨率的是20几MB,低分辨率是几MB编码流程一、VI(Video Input 视频输入)模块初始化,使能通道int ret;RK_MPI_SYS_Init();// VI Init......VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode "…...

Nano-Banana在软件测试中的应用:自动化测试脚本生成

Nano-Banana在软件测试中的应用:自动化测试脚本生成 最近跟几个做测试开发的朋友聊天,发现他们都在为一个事儿头疼:UI自动化测试脚本的维护成本太高了。页面稍微改个按钮位置,或者加个新字段,之前写的脚本就得跟着改&…...

Sentry 9.1.2安装中PostgreSQL连接问题的排查与解决

1. Sentry 9.1.2安装中PostgreSQL连接问题现象 最近在部署Sentry 9.1.2版本时,遇到了一个典型的PostgreSQL连接问题。执行./install.sh安装脚本后,控制台报错显示: django.db.utils.OperationalError: could not translate host name "p…...

ABB机器人Profinet通信中Real类型数据的字节序处理技巧

1. 为什么需要关注Real类型数据的字节序? 在工业自动化领域,ABB机器人与PLC之间的Profinet通信已经成为标配。但很多工程师在实际配置时,经常会遇到一个看似简单却容易踩坑的问题:Real类型数据的传输错误。明明发送端的数据是正确…...

丹青识画应用场景:为非遗影像库自动生成文人雅趣描述文本

丹青识画应用场景:为非遗影像库自动生成文人雅趣描述文本 1. 引言:当科技遇见非遗,如何让影像“开口说话”? 想象一下,你是一位非遗保护工作者,面对一个庞大的数字影像库,里面存放着数千张珍贵…...

手把手教你在麒麟系统用Docker-Compose部署MySQL+ClickHouse联合作业环境

麒麟系统实战:Docker-Compose编排MySQLClickHouse混合数据库环境 在数据分析领域,OLTP(在线事务处理)与OLAP(在线分析处理)系统的协同工作已成为现代数据架构的标配。MySQL作为经典的关系型数据库&#xff…...

凸缺陷(convexityDefects)在图像处理中的5个实际应用场景(附OpenCV代码示例)

凸缺陷(convexityDefects)在图像处理中的5个实际应用场景(附OpenCV代码示例) 当你第一次听说"凸缺陷"这个概念时,可能会觉得它听起来像某种需要修复的错误。但实际上,在计算机视觉领域,凸缺陷是一种极其有用…...

SlowFast实战:手把手教你用AVA数据集训练行为识别模型(附最新v2.2标注文件处理技巧)

SlowFast实战:从AVA v2.2数据集处理到高效训练行为识别模型 行为识别技术正逐渐成为智能监控、人机交互等领域的核心技术之一。作为该领域的标杆算法,SlowFast网络凭借其双路径设计在精度与效率间取得了出色平衡。本文将带您从零开始,基于最新…...

告别PS!ComfyUI+Mixlab-Nodes实现电商产品图智能合成(含图层混合技巧)

电商设计革命:ComfyUIMixlab-Nodes智能合成全流程解析 在电商行业,产品图的视觉呈现直接影响转化率。传统Photoshop合成流程需要设计师手动完成背景分离、元素排版、调色匹配等繁琐操作,一套高质量商品图往往需要数小时打磨。而如今&#xff…...

Qwen Pixel Art零基础教程:无需代码,用浏览器生成专业级像素图

Qwen Pixel Art零基础教程:无需代码,用浏览器生成专业级像素图 你是不是也曾经羡慕过那些复古游戏里的像素风画面,或者想为自己独立游戏项目创作一些独特的像素美术,却苦于不会画画、不会代码?别担心,今天…...

Kook Zimage 真实幻想 Turbo效果分享:1024×1024下0.1mm级皮肤纹理与毛孔表现

Kook Zimage 真实幻想 Turbo效果分享:10241024下0.1mm级皮肤纹理与毛孔表现 想象一下,你描述了一个“月光下,皮肤泛着珍珠光泽的精灵少女”,AI生成的图片里,她的脸颊上不仅有细腻的光泽,甚至能看到几乎不可…...

ComfyUI工作流集成:SenseVoice-Small语音识别驱动AI图像生成

ComfyUI工作流集成:SenseVoice-Small语音识别驱动AI图像生成 你有没有想过,有一天动动嘴皮子,就能让电脑把你脑海里的画面画出来?比如,你对着麦克风说“一只戴着宇航员头盔的橘猫,在月球上喝咖啡”&#x…...

看FLUX.1如何生成高质量图片:SDXL风格预设效果实测

看FLUX.1如何生成高质量图片:SDXL风格预设效果实测 想看看FLUX.1模型到底能生成多惊艳的图片?今天我们不聊复杂的部署,直接带你走进ComfyUI,用SDXL Prompt Styler预设的各种风格,实测FLUX.1的文生图能力。从奇幻插画到…...

Gemma-3-12b-it极简UI使用教程:零配置启动图文混合对话(含代码实例)

Gemma-3-12b-it极简UI使用教程:零配置启动图文混合对话(含代码实例) 想体验一个能看懂图片、还能跟你流畅聊天的AI助手吗?今天给大家介绍一个基于Google Gemma-3-12b-it大模型开发的本地多模态交互工具。它最大的特点就是“简单”…...

[4个维度解决GitHub访问难题:开发者工具效率提升指南](https://gitcode.com/gh_mirrors/fa/Fast-GitHub)

4个维度解决GitHub访问难题:开发者工具效率提升指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub GitHub作为全球最大…...

CasRel关系抽取模型真实效果:法律判决书中‘原告-主张-被告’三元组

CasRel关系抽取模型真实效果:法律判决书中‘原告-主张-被告’三元组 1. 引言:从法律文书中自动提取关键信息 每天都有成千上万的法律判决书需要处理,法官、律师和法律研究者需要从这些冗长的文档中提取关键信息:谁起诉了谁&…...

GitHub访问优化新范式:开发者网络加速解决方案

GitHub访问优化新范式:开发者网络加速解决方案 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 在日常开发工作中&#…...

EcomGPT-7B在学术研究中的应用:自动化生成电商领域论文摘要与文献综述

EcomGPT-7B在学术研究中的应用:自动化生成电商领域论文摘要与文献综述 最近和几位做电商研究的朋友聊天,他们都在抱怨同一个问题:文献调研和论文写作的前期准备工作太耗时了。面对海量的中英文论文PDF,光是阅读、整理核心观点&am…...

免费AI视觉神器DAMO-YOLO部署教程:界面酷炫,功能强大

免费AI视觉神器DAMO-YOLO部署教程:界面酷炫,功能强大 1. 从零开始,10分钟拥有你的AI视觉大脑 想象一下,你有一双能瞬间看懂图片里所有东西的“眼睛”——行人、汽车、猫狗、手机,甚至一个水杯,它都能在毫…...

打工人上班摸魚小說-第二十四章 西行、夜车与后视镜里的眼睛

# 打工人上班摸魚小說-第二十四章 西行、夜车与后视镜里的眼睛---车往西开。窗外的天从黑变成灰,从灰变成白。太阳升起来的时候,林舟才发现自己靠窗户睡着了。脖子酸得厉害,他揉了揉,坐直了身子。车厢里人不多。前排坐着一个老人&…...

M2LOrder模型效果深度评测:不同参数下的生成质量对比

M2LOrder模型效果深度评测:不同参数下的生成质量对比 最近在星图GPU平台上部署了M2LOrder模型,用了一段时间后,我发现这个模型在不同参数设置下的表现差异还挺明显的。有些参数下生成的文本创意十足但逻辑性稍弱,有些参数下则严谨…...

Ubuntu 20.04 LTS下Pycharm专业版2023.3安装与激活全攻略(学生福利版)

Ubuntu 20.04 LTS下PyCharm专业版2023.3安装与激活全指南(学生专属方案) 作为一名长期在Linux环境下开发的工程师,我深刻体会到PyCharm专业版对Python项目开发的效率提升。特别是在Ubuntu 20.04 LTS这样的稳定系统上,合理配置开发…...

避坑指南:为什么你的Verilog pullup会编译失败?wire与logic的深度解析

避坑指南:为什么你的Verilog pullup会编译失败?wire与logic的深度解析 在数字电路设计中,Verilog作为硬件描述语言的代表,其数据类型的选择往往直接影响着电路的行为和仿真结果。许多初学者在使用pullup/pulldown时遭遇的编译错误…...

WeChatFerry:微信自动化处理的高效解决方案

WeChatFerry:微信自动化处理的高效解决方案 【免费下载链接】WeChatFerry 微信逆向,微信机器人,可接入 ChatGPT、ChatGLM、讯飞星火、Tigerbot等大模型。Hook WeChat. 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatFerry …...

CosyVoice Finetune 实战指南:从模型微调到生产环境部署

最近在做一个语音交互项目,需要将通用的语音合成模型适配到我们特定的业务场景中,比如客服语音播报。直接使用开箱即用的模型,总感觉音色和语调少了点“人情味”,不够贴合品牌形象。在尝试了几种方案后,我决定使用 Cos…...

农产品溯源系统毕设效率优化实战:从单体架构到高并发读写的设计演进

在完成农产品溯源系统这个毕设项目时,我最初的想法很简单:用个数据库把农产品的生产、加工、运输信息存起来,然后提供一个二维码查询页面就行了。但真正动手做起来,才发现“效率”是个大问题。想象一下,一个农产品从田…...

红外避障模块的5个创意应用场景,第3个你绝对想不到

红外避障模块的5个创意应用场景,第3个你绝对想不到 红外避障模块早已不再是机器人领域的专属配件。这个看似简单的电子元件,凭借其稳定的性能和灵活的可编程性,正在智能家居、互动艺术、安全防护等领域大放异彩。本文将带您探索五个突破常规的…...

每日10行代码79:openpyxl精准定位有效数据行数的实战技巧

1. 为什么max_row会"说谎"? 很多开发者第一次用openpyxl处理Excel时,都会遇到这样的困惑:明明表格里只有3行数据,为什么ws.max_row却返回了7?这个问题我当年也踩过坑,后来发现根源在于openpyxl的…...

3个技术民主化工具让用户实现Windows/Office正版化自由

3个技术民主化工具让用户实现Windows/Office正版化自由 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 您是否曾在安装Windows系统后,面对冗长的激活密钥望而却步?是否在…...

FireRed-OCR Studio应用场景:医疗检验报告解析→结构化JSON+Markdown双导出

FireRed-OCR Studio应用场景:医疗检验报告解析→结构化JSONMarkdown双导出 1. 医疗检验报告解析的行业痛点 医疗检验报告是临床诊疗的重要依据,但在实际工作中,医生和患者常常面临以下困扰: 格式混乱:不同医院、不同…...