找回密码
 立即注册
查看: 42|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 156 天

    [LV.7]常住居民III

    24

    主题

    130

    回帖

    401

    积分

    中级会员

    积分
    401
    发表于 2024-3-18 11:05:47 | 显示全部楼层 |阅读模式
    本帖最后由 lijinlei 于 2024-3-18 12:11 编辑

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


    项目内容
    具体操作如下:
    • 将目标动图或视频提取为帧图片,可通过 MATLAB 程序实现(见附录);
    • 将帧图片裁剪为目标显示屏的像素比例,如 0.96 英寸 OLED 显示屏的像素为 128x64, 则需将帧图片按照 2:1 的宽高比进行裁剪、对于单个 8x8 点阵则需按照 1:1 进行裁剪,注意选择目标裁剪区域(代码见附录);
    • 将裁剪过的帧图片转化为灰度图像(以便后面进行二值化),之后进行像素缩小操作,将图片调整至目标显示屏的像素分辨率,最后进行二值化处理,并将处理结果存储为 *.bmp 格式文件;
    • 将批量保存的 BMP 文件按照帧顺序重命名为 1,2,3... ,之后使用批量取模工具生成相应的 16 进制代码,复制到程序中即可。






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

    该项目的STC代码见附件。

    附录
    图片取模方案如下
    • 提取视频或 GIF 动图的帧为图片,可使用 MATLABGIF Movie Gear 软件
    • 使用 Image2Lcd 软件批量处理目标帧图片,并生成 BMP 格式图片,以便后面读取二值化数据;
    这里推荐使用的 OledTools 软件对图片进行处理,可调整灰度阈值,对于像素点较少的情况,转换效果最佳;缺点是不能进行批量处理。
    对于 128x64 像素的转换,各软件均可。批量转换推荐 PictureReader 软件,可批量生成 BMP 文件。

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


    详见:CSDN . www.52pojie.cn .

    视频帧提取
    1. clear;
    2. video_file='test.mp4';
    3. video=VideoReader(video_file);
    4. frame_number=video.NumFrames;
    5. for i = 1:5:frame_number
    6.     image_name=strcat('test',num2str((i-1)/5+1)); % 每5帧取一张图
    7.     image_name=strcat(image_name,'.jpg');
    8.     I=read(video,i);  %读出图片
    9.     imwrite(I,image_name,'jpg'); %写入图片
    10.     I=[];
    11. end
    复制代码
    详见:知乎 (zhihu.com) .

    MATLAB重命名文件的排序问题
    可使用 sort_nat 函数解决,注意需要下载安装该函数。
    1. file_path = '';
    2. Tpath = 'Number\'; % target path
    3. img_path_list = dir([file_path '*.bmp']);%图片路径
    4. img_num = length(img_path_list);
    5. sort_nat_name=sort_nat({img_path_list.name});
    6. for k = 1:img_num
    7.     image_name = sort_nat_name{k};%获取图片名称
    8.     image = imread(strcat(file_path,image_name));%读取图片
    9.     imwrite(image,strcat(Tpath,int2str(k),'.bmp'),'bmp');
    10. end
    复制代码

    图像裁剪

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

    图片像素调整
    1. clear;clc;
    2. numrows = 8;
    3. numcols = 8;
    4. file_path = ''; % 设定你存放图片的目录 - 当前文件夹
    5. img_path_list = dir(strcat(file_path, '*.jpg')); % 选后缀为 .jpg 的图片
    6. img_num = length(img_path_list); %获得图片数量
    7. for n = 1:img_num
    8.     image_name = img_path_list(n).name;
    9.     image_n = image_name(1:end-4); % 删除文件后缀
    10.     image = imread(strcat(file_path, image_name));
    11.     RtG_image = rgb2gray(image); % rgb to gray
    12.     RS_image = imresize(RtG_image,[numrows numcols]);
    13.     BNR_image = imbinarize(RS_image);
    14.     imwrite(BNR_image,strcat('Resize8x8\RS',image_n,'.bmp'),'bmp');
    15. end
    复制代码

    转载请注明来源,谢谢!
    如有任何问题请于本贴留言或联系作者,邮箱 lijinlei0907@163.com



    STC8H.c

    2.77 KB, 下载次数: 1

    STC8H

    STC32G.c

    2.76 KB, 下载次数: 0

    STC32G

    MCU开发者和爱好者
    回复 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-29 17:04 , Processed in 0.059181 second(s), 32 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表