AI8051U, LCD12864, 播放BadApple 超简单
AI8051U, LCD12864, 播放BadApple 超简单实现原理:
使用AIapp-ISP软件中的CDC/串口发送文件,将图片发送到单片机,单片机进行显示
代码
while(1)
{
for(i=0;i<16;i++){
USB_SendData("h",1);
usb_OUT_done(); //接收
while(!bUsbOutReady);//等接收数据
memcpy(gImage_picture1 + (i * 64),UsbOutBuffer,OutNumber);//拷贝
}
LCDClear();
DisplayImage(gImage_picture1);
}import cv2
output_path = 'badapple_128_64.bin'# 输出文件的路径和文件名称
video_path = 'badapple_320240_xvid.mp4'# 视频
interval = 2# 帧率间隔 越大画面越流畅 所占内存越大
bytes_data = []
if __name__ == '__main__':
video_capture = cv2.VideoCapture(video_path)# 读取视频文件
video_capture.set(cv2.CAP_PROP_POS_FRAMES, 50 - 1)# 跳过开头50帧
i = 0# 视频帧数
j = 0# 截取帧数
while True:
success, frame = video_capture.read()
if success:
i += 1
if i % interval == 0:# 判断帧率间隔保存帧
j += 1
print('正在处理第 %s 帧' % j)
frame = cv2.resize(frame, (128, 64), interpolation=cv2.INTER_LINEAR)
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, binary_frame = cv2.threshold(gray_frame, 127, 255, cv2.THRESH_BINARY)
# 将二值化图像转换为一维数组 从左到右 从上到下
flat_binary = binary_frame.flatten()
# 将像素值转换为一维的0和1序列
binary_string = ''.join(['1' if pixel == 255 else '0' for pixel in flat_binary])
for i in range(0, len(binary_string), 8):
byte = binary_string
bytes_data.append(int(byte, 2))
else:
print('转换成功,开始写入文件')
# 将字节列表转换为字节对象
binary_data = bytes(bytes_data)
with open(output_path, 'wb') as f:
f.write(binary_data)
f.close()
print('已生成%s帧' % j)
break代码解释:
单片机通过虚拟串口接收一帧图像,为啥有个 for(i=0;i<16;i++) ?
因为官方给的串口有限制64字节
BYTE xdata UsbInBuffer;
BYTE xdata UsbOutBuffer;一帧1024字节,所以分成16次传输
Python代码作用就是取一帧画面,变成黑白的,然后从左到右,从上到下,白的是1,黑的是0,写到一个名为“badapple_128_64.bin”的文件。
这个文件用HEX编辑器打开就是这样
CDC/串口发送文件如何用?
很简单,选好文件点发送就行
我们使用应答发送,就是单片机发个68,电脑就发64个字节的数据
也就是 68 是数据请求命令 64 是每个数据包的大小(字节)
然后串口波特率自己看着选 没事 我选10000000都能用
实际效果:
实际效果:
速度分析:
传一帧 + 清屏 + 显示花15*0.015 + 0.03 = 0.255
也就是255毫秒3.9帧 真么高的波特率,理论上应该不止3.9帧 {:4_250:}
用stc15配合st7567玩过这个,波特率到961200
但是没您这个这么复杂,bin文件直接串口发,发了就不用管了
程序内部串口接收一次1024就显示,不做任何判断也成功了。 wnagming 发表于 2024-8-31 07:33
原来Python这么好用
写一下脚本很方便
页:
[1]