通過視頻幀圖片提取,圖片批量裁剪,轉換為BMP文件並取模,獲得顯示屏代碼,基於STC32單片機,在8x8點陣LED模塊上實現動畫播放。 ...
項目摘要
通過視頻幀圖片提取,圖片批量裁剪,轉換為BMP文件並取模,獲得顯示屏代碼,基於STC32單片機,在8x8點陣LED模塊上實現動畫播放。
項目方案
-
將目標動圖或視頻提取為幀圖片,可通過 MATLAB 程式實現;
-
將幀圖片裁剪為目標顯示屏的像素比例,如 0.96 英寸 OLED 顯示屏的像素為 128x64, 則需將幀圖片按照 2:1 的寬高比進行裁剪、對於單個 8x8 點陣則需按照 1:1 進行裁剪,註意選擇目標裁剪區域;
-
將裁剪過的幀圖片轉化為灰度圖像(以便後面進行二值化),之後進行像素縮小操作,將圖片調整至目標顯示屏的像素解析度,最後進行二值化處理,並將處理結果存儲為
*.bmp
格式文件; -
將批量保存的 BMP 文件按照幀順序重命名為
1,2,3...
,之後使用批量取模工具生成相應的 16 進位代碼,複製到程式中即可。
詳見:嗶哩嗶哩 bilibili .
或者將幀圖片像素縮小至目標顯示屏像素,保持彩色狀態,存儲為 BMP 格式,使用批量取模工具,勾選 轉換彩圖
,調整閾值至適當值(如66%),即可直接生成對應代碼。
詳見附錄。該項目的STC代碼見附件。
附錄
圖片取模
-
提取視頻或 GIF 動圖的幀為圖片,可使用 MATLAB 或 GIF Movie Gear 軟體
-
使用 Image2Lcd 軟體批量處理目標幀圖片,並生成 BMP 格式圖片,以便後面讀取二值化數據;
這裡推薦使用 廣州靈派科技 的 OledTools 軟體對圖片進行處理,可調整灰度閾值,對於像素點較少的情況,轉換效果最佳;缺點是不能進行批量處理。
對於 128x64 像素的轉換,各軟體均可。批量轉換推薦 PictureReader 軟體,可批量生成 BMP 文件。
- 將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]