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[i:i + 8]
- 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[64];
- BYTE xdata UsbOutBuffer[64];
复制代码
一帧1024字节,所以分成16次传输
Python代码作用就是取一帧画面,变成黑白的,然后从左到右,从上到下,白的是1,黑的是0,写到一个名为“badapple_128_64.bin”的文件。
这个文件用HEX编辑器打开就是这样
CDC/串口发送文件如何用?
很简单,选好文件点发送就行
我们使用应答发送,就是单片机发个68,电脑就发64个字节的数据
也就是 68 是数据请求命令 64 是每个数据包的大小(字节)
然后串口波特率自己看着选 没事 我选10000000都能用
实际效果:
|