查看原文
其他

毕业设计| 可拿满分的开源项目分享(资料自取)

IAMLIUBO&妮mo 达尔闻说 2022-04-25

不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我


之前的毕设项目案例分享,有小伙伴说太简单了,都赶不上我的课设的水平。

来,你出来,这个项目你挑战看看

这是一个妮姐觉得可以拿满分的毕业设计项目,先上演示视频:

视频中演示了两个项目来自工程师IAMLIUBO之手:badapple及人脸识别。今天就说说badapple这个项目:

badapple项目硬件

声明:本项目硬件来自稚晖。演示中使用的硬件开发板件名叫A-Eye(设计者达尔闻老朋友稚晖)。A-Eye主控是嘉楠的K210。

关于K210,达尔闻分享过一篇比较详细的介绍K210硬件与环境(传送门:嵌入式AI从入门到“放肆”【K210篇】)。K210虽然是MCU,但是在计算算力上还是非常突出的,所以非常适合智能算法的应用,如人脸、物品识别等

K210 A-Eye尺寸比市面上其他K210开发板小了很多倍。虽然小,但是该有的性能一定都不少。先看下原理图都有哪些功能,除K210主控,及电源管理部分,A-Eye上还包含了一些通用接口:
Type-C 接口

TF卡
AI应用怎么少得了摄像头

LCD屏接口及麦克风音频接口

A-Eye整版PCB布局:

badapple软件分析

视频播放原理:

小学就学过知识,人眼是有短暂的视觉停留的,正是利用这一人性的弱点,我们才得以欣赏到各种各样的视频。所谓的视频其实就是一些图片组合在快速不停的播放,所以这里我利用FFmpeg这个强大的工具,将下载到的视频按照一定帧率转换成了一系列连续的图片,然后再通过K210不断的往屏幕上刷新图片,这样就会形成播放视频的效果了,不过有部分细节还是要处理一下的。

FFmpeg 抽取视频帧并转换成图片:

ffmpeg -i"badApple.mp4" -r 6 -f image2 badApple-images/%d.bmp
这里比较简单,一句命令就可以了,当然这不是唯一的方式,你也可以选择其它的方式,因为我平常都在Ubuntu下工作,所以就图个简单了,执行完成后你会在badApple-images文件夹下看到非常多的图片,而且都是按照顺序排好的,没错这些就是我们一会要用到的图片,这里要注意的是命令中的-r 6这个参数的含义,这里表示一秒保存几帧图片,这个很关键,因为你需要将所有图片刷新完成的总时间与歌曲对应起来,不然就会让人感觉卡顿的感觉,我实际测试中感觉6是最合适的,所以这里就用了6.(FFmpeg的安装自己Google,Bing一下吧,别问为什么没有百度!)

图片大小处理:

因为我们保存的图片的大小是480*360的,当然如果你有相同分辨率的屏幕就可以不用处理了,但是对于A-Eye来说,显然就大的很多了,所以这里我们需要对图片进行一下裁剪,据说在上面那条命令中可以选择保存的图片的大小,不过我也不是很熟悉,就没仔细研究,这里就使用python写了个简单的小脚本,来处理了:

#!/usr/bin/python3 # -*- coding: utf-8 -*-# author: IAMLIUBO
import sys,osimport structfrom PIL import Image

# 30PS 6752# 15PS 3287# 8PS 1574# 7PS 1535# 6PS 1316# 4PS 878
def to565(pixel): r = pixel[0] g = pixel[1] b = pixel[2] return ((r & 0x00F8) << 8) | ((g & 0x00FC) << 3) | ((b & 0x00F8) >> 3)

for x in range(1,1316): image = Image.open("./badApple-images/" + str(x) + ".bmp") image = image.resize((240, 135), Image.ANTIALIAS) image.save("./badApple-images-resize/" + str(x) + ".bmp", "BMP")

# f_bin = open("badapple.bin","wb")
for x in range(1,1316):
image = Image.open("./badApple-images-resize/" + str(x) + ".bmp") imgdata = list(image.getdata())
f_bin = open("./badApple-images-resize-bin/" + str(x) + ".bin","wb")
for x in range(0,len(imgdata)): pixel = to565(imgdata[x]) pixel_byte = struct.pack('H', pixel ) f_bin.write(pixel_byte)
    f_bin.close()  
代码写的很简单,第一个for循环是将图片的尺寸重新保存为240*135大小的,当然保存在了另一个文件夹下,然后第二个for循环是将图片的像素数据直接保存为了二进制文件,因为这样我们在刷新的时候可以不用对bmp图片进行deconde操作,直接将图片数据按照顺序读到buffer里就可以了,处理完成后就可以将得到的bin文件copy到内存卡中了。

K210 代码简单分析:

k210的代码就相对简单了,基本上我们初始好内存卡和显示屏后就可以直接播放起来了:
/* .... */ /* SD卡初始化 */ if (sdcard_init()) { printf("SD card err\n"); return -1; } /* 文件系统初始化 */ if (fs_init()) { printf("FAT32 err\n"); return -1; }  /* LCD屏初始化 */ lcd_init(); lcd_set_backlight(0.2); lcd_clear(WHITE); lcd_draw_string(85, 65, "Bad Apple", BLACK); sleep(1);
/* 刷新图片,开始前读了写系统时间,刷新完成后可以计算下帧率 */ uint64_t time_start = sysctl_get_time_us(); for (size_t i = 1; i < 1316; i++) { uint64_t draw_start_time = sysctl_get_time_us(); sprintf(filename_buffer, "BadApple6PS/%d.bin", 61); /* 我这里在SD卡中新建了文件夹存放文件 */ if ((ret = f_open(&file, filename_buffer, FA_READ)) == FR_OK) { ret = f_read(&file, (void *)frame_data, 64800, &v_ret_len); f_close(&file); }
lcd_draw_picture(0, 0, A_EYE_IMAGE_WIDTH, A_EYE_IMAGE_HEIGHT, frame_data); while ((sysctl_get_time_us() - draw_start_time) < 153000) { /* 有的图片刷的速度过快,这里我们停顿下,为了让整体效果更好 */ ; } } /* 结束后获取系统时间 */ uint64_t time_end = sysctl_get_time_us(); uint16_t time_s = (time_end - time_start) / 1000000; char buffer[64]; lcd_clear(BLACK); lcd_draw_string(45, 40, "Bad Apple with K210", WHITE); sprintf(buffer, "Total time: %ds FPS: %dHz", time_s, 1316 / time_s); lcd_draw_string(15, 90, buffer, WHITE); /* .... */

badapple项目使用的硬件A-Eye开源了原理图PDF版和PCB源文件,badapple代码也分享给大家学习。获取方法:“达尔闻说”微信回复:AEye,也可访问稚晖的GitHub:

github.com/david-pzh/A-Eye
人脸识别项目这就不在给大家详解了,感兴趣的小伙伴自行根据代码学习,代码获取方法同上。开源A-Eye项目还在更新中,最新进程可关注稚晖的GitHub、B站,达尔闻也会在第一时间分享。
达尔闻毕设交流2000人大群即将满员,抓住最后机会入群,QQ群号:657307701
END

毕设系列:

基于STM32实现的温度/心率/步数设计

智能自动寻光循迹灭火小车

51单片机+HX711实现简易电子秤

稚晖的往期回顾:
新手想玩嵌入式硬件,用单片机还是树莓派好?
如何自制一块“树莓派”-DIY ARM-Linux卡片电脑
你有什么用单片机或开源硬件做的有意思的作品吗?
毕业设计做磁悬浮装置可行?PID算法加持更稳
如何自制1个超迷你的语音助手?

DIY逗比的时钟,制作资料100%开源!

在STM32上跑神经网络做手势识别
嵌入式AI从入门到“放肆”【K210篇】-- 硬件与环境

更多精彩内容:

项目分享 | 电赛系列 | 人工智能 | 考研 
必考知识点 | 毕业设计 | 开关电源 求职

我们是妮mo,达尔闻创始人,只讲技术不撩汉的小姐姐。达尔闻在线教育平台旨在服务电子行业专业人士,提供技能培训视频,覆盖各细分领域热门话题,比如嵌入式,FPGA,人工智能等。并针对不同人群量身定制分层级学习内容,例如常用知识点,拆解评测,电赛/智能车/考研等,欢迎关注。
官网:www.darwinlearns.com
B站:达尔闻
QQ群:群1:786258064(已满),
          群2:1057755357

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存