首页 > 其他分享 >通过视频帧提取及批量取模转换实现基于STC32的点阵LED动画播放

通过视频帧提取及批量取模转换实现基于STC32的点阵LED动画播放

时间:2024-03-18 12:57:07浏览次数:17  
标签:取模 LED name img STC32 file path image 图片

项目摘要

通过视频帧图片提取,图片批量裁剪,转换为BMP文件并取模,获得显示屏代码,基于STC32单片机,在8x8点阵LED模块上实现动画播放。

项目方案

  1. 将目标动图或视频提取为帧图片,可通过 MATLAB 程序实现;

  2. 将帧图片裁剪为目标显示屏的像素比例,如 0.96 英寸 OLED 显示屏的像素为 128x64, 则需将帧图片按照 2:1 的宽高比进行裁剪、对于单个 8x8 点阵则需按照 1:1 进行裁剪,注意选择目标裁剪区域;

  3. 将裁剪过的帧图片转化为灰度图像(以便后面进行二值化),之后进行像素缩小操作,将图片调整至目标显示屏的像素分辨率,最后进行二值化处理,并将处理结果存储为 *.bmp 格式文件;

  4. 将批量保存的 BMP 文件按照帧顺序重命名为 1,2,3... ,之后使用批量取模工具生成相应的 16 进制代码,复制到程序中即可。

详见:哔哩哔哩 bilibili .

或者将帧图片像素缩小至目标显示屏像素,保持彩色状态,存储为 BMP 格式,使用批量取模工具,勾选 转换彩图,调整阈值至适当值(如66%),即可直接生成对应代码。

详见附录。该项目的STC代码见附件

附录

图片取模

  1. 提取视频或 GIF 动图的帧为图片,可使用 MATLABGIF Movie Gear 软件

  2. 使用 Image2Lcd 软件批量处理目标帧图片,并生成 BMP 格式图片,以便后面读取二值化数据;

这里推荐使用 广州灵派科技OledTools 软件对图片进行处理,可调整灰度阈值,对于像素点较少的情况,转换效果最佳;缺点是不能进行批量处理。

对于 128x64 像素的转换,各软件均可。批量转换推荐 PictureReader 软件,可批量生成 BMP 文件。

  1. 将BMP图片转化为数模,可使用 CopyLeft By Horse2000 (字模提取)或 PCtoLCD2018 软件.

详见:CSDN博客 . 吾爱破解 www.52pojie.cn .

一些有趣的资源:Wokwi OLED Animation Maker for Arduino 动态图标显示在 128x64 显示屏利用 Arduino 代码。

视频帧提取

clear;
video_file='test.mp4';
video=VideoReader(video_file);
frame_number=video.NumFrames;
for i = 1:5:frame_number
    image_name=strcat('test',num2str((i-1)/5+1)); % 每5帧取一张图
    image_name=strcat(image_name,'.jpg');
    I=read(video,i);  %读出图片
    imwrite(I,image_name,'jpg'); %写入图片
    I=[];
end

详见:知乎 (zhihu.com) .

MATLAB重命名文件的排序问题

可使用 sort_nat 函数解决,注意需要下载安装该函数。

file_path = '';
Tpath = 'Number\'; % target path
img_path_list = dir([file_path '*.bmp']);%图片路径
img_num = length(img_path_list);
sort_nat_name=sort_nat({img_path_list.name});
for k = 1:img_num
    image_name = sort_nat_name{k};%获取图片名称
    image = imread(strcat(file_path,image_name));%读取图片
    imwrite(image,strcat(Tpath,int2str(k),'.bmp'),'bmp'); 
end

详见:CSDN博客 . File Exchange - MATLAB .

图像裁剪

clear;clc;
file_path = ''; % 设定你存放图片的目录
img_path_list = dir(strcat(file_path, '*.jpg')); % 选后缀为 .jpg 的图片
img_num = length(img_path_list); %获得图片数量
for n = 1:img_num 
    image_name = img_path_list(n).name;
    image = imread(strcat(file_path, image_name));
    crop_image = imcrop(image, [323 0, 1080, 1080]); 
    imwrite(crop_image, strcat('Cut/Cut', image_name)); % 保存文件
end

图片像素调整

clear;clc;
numrows = 8; 
numcols = 8;
file_path = ''; % 设定你存放图片的目录 - 当前文件夹
img_path_list = dir(strcat(file_path, '*.jpg')); % 选后缀为 .jpg 的图片
img_num = length(img_path_list); %获得图片数量
for n = 1:img_num 
    image_name = img_path_list(n).name;
    image_n = image_name(1:end-4); % 删除文件后缀
    image = imread(strcat(file_path, image_name));
    RtG_image = rgb2gray(image); % rgb to gray
    RS_image = imresize(RtG_image,[numrows numcols]); 
    BNR_image = imbinarize(RS_image);
    imwrite(BNR_image,strcat('Resize8x8\RS',image_n,'.bmp'),'bmp'); 
end

转载请注明来源,谢谢!
如有任何问题请于本贴留言或联系作者,邮箱 [email protected]

标签:取模,LED,name,img,STC32,file,path,image,图片
From: https://www.cnblogs.com/Jin-Lei-Li/p/18080119

相关文章

  • Editing Factual Knowledge and Explanatory Ability of Medical Large Language Mode
    本文是LLM系列文章,针对《EditingFactualKnowledgeandExplanatoryAbilityofMedicalLargeLanguageModels》的翻译。医学大语言模型的编辑事实知识与解释能力摘要1引言2相关工作3方法4实验5结论6局限性摘要模型编辑旨在精确地修改大型语言模型......
  • Disentangled Contrastive Collaborative Filtering 论文阅读笔记
    DisentangledContrastiveCollaborativeFiltering论文阅读笔记Abstract存在的问题:大多数现有的基于gcl的CF模型仍然受到限制,因为忽略了用户-项目交互行为往往是由各种潜在意图因素驱动的(例如,为了家庭聚会购物,首选颜色或产品品牌)引入的非自适应增强技术容易受到噪声信息的......
  • Arduino RP2040 + SSD1306 I2C OLED +LittleFS存储GBK字库实现中文显示
    ArduinoRP2040+SSD1306I2COLED+LittleFS存储GBK字库实现中文显示......
  • C语言bringup LED
    参考文章:https://doc.embedfire.com/linux/imx6/driver/zh/latest/bare_metal/gcc_led.html LED灯源码程序包含两部分内容,第一部分在汇编文件中设置“栈地址”并执行跳转命令跳转到main函数执行C代码。第二部分在C文件中使led灯不断闪烁。将“汇编点亮led灯的源码led.S复制到......
  • 汇编bringup LED
    此节学习视频:https://www.bilibili.com/video/BV1yE411h7uQ?p=6&vd_source=432ba293ecfc949a4174ab91ccc526d6 在STM32上,.s就是汇编,cortexA一般不会提供汇编,必须自己写汇编文件,对于A系列,初始化ram,没办法用c初始化,必须先初始化一些外设,这些外设必须用汇编初始化,但是用到的汇编......
  • 【课设】/【毕设】ESP32上传温湿度至新版Onenet云平台并由新版Onenet云平台下发命令控
    一、uniapp设计  1、APP生成token秘钥:  1.1.下载HBuider软件:     直接搜索HBuider,进入官网下载软件:  2.新建项目-选择默认模版3.打开index.vue4.点击运行至内置浏览器;2.1获取Onenet云平台API接口 2.1.1进入Onenet云平台点击服务与支持-文档......
  • 线上关于SimpleDateFormat踩坑记录
    问题描述importjava.text.ParseException;importjava.text.SimpleDateFormat;publicclassTestSimpleDateFormat{publicstaticvoidmain(String[]args){System.out.println(isValidDate("0229","MMdd"));//falseSystem.o......
  • KGAT Knowledge Graph Attention Network for Recommendation
    目录概符号说明KGATEmbeddingLayerAttentiveEmbeddingPropagationLayers代码WangX.,HeX.,CaoY.,LiuM.andChuaT.KGAT:Knowledgegraphattentionnetworkforrecommendation.KDD,2019.概知识图谱for推荐系统.符号说明\(\mathcal{G}_1=\{(u,y_{ui}......
  • SourceTree提示Authentication failed for 如何解决
    sourcetree拉取失败提示Authenticationfailed(下图)1、关闭sourcetree;2、打开文件目录C:\Users\****\AppData\Local\Atlassian\SourceTree,删除passwd文件;3、打开sourcetree,点击拉取,就会弹出身份验证窗口,输入完成点击login即可拉取成功; ......
  • Write failed: Broken pipe > Couldn‘t read packet: Connection reset by peer SFTP
    如果你链接服务器的时候出现下面的提示:Writefailed:BrokenpipeCouldn’treadpacket:Connectionresetbypeer这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root,权限是750或者755。......