其他
毕业设计| 可拿满分的开源项目分享(资料自取)
不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我
之前的毕设项目案例分享,有小伙伴说太简单了,都赶不上我的课设的水平。
来,你出来,这个项目你挑战看看
这是一个妮姐觉得可以拿满分的毕业设计项目,先上演示视频:
视频中演示了两个项目来自工程师IAMLIUBO之手:badapple及人脸识别。今天就说说badapple这个项目:
badapple项目硬件
声明:本项目硬件来自稚晖。演示中使用的硬件开发板件名叫A-Eye(设计者达尔闻老朋友稚晖)。A-Eye主控是嘉楠的K210。
关于K210,达尔闻分享过一篇比较详细的介绍K210硬件与环境(传送门:嵌入式AI从入门到“放肆”【K210篇】)。K210虽然是MCU,但是在计算算力上还是非常突出的,所以非常适合智能算法的应用,如人脸、物品识别等。
LCD屏接口及麦克风音频接口
badapple软件分析
视频播放原理:
FFmpeg 抽取视频帧并转换成图片:
ffmpeg -i"badApple.mp4" -r 6 -f image2 badApple-images/%d.bmp
图片大小处理:
因为我们保存的图片的大小是480*360的,当然如果你有相同分辨率的屏幕就可以不用处理了,但是对于A-Eye来说,显然就大的很多了,所以这里我们需要对图片进行一下裁剪,据说在上面那条命令中可以选择保存的图片的大小,不过我也不是很熟悉,就没仔细研究,这里就使用python写了个简单的小脚本,来处理了:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# author: IAMLIUBO
import sys,os
import struct
from 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()
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:
基于STM32实现的温度/心率/步数设计
智能自动寻光循迹灭火小车
51单片机+HX711实现简易电子秤
DIY逗比的时钟,制作资料100%开源!
更多精彩内容: