使用OLED0561制作一个视频播放器

60 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

www.bilibili.com/video/BV1xF…

在学习完USART串口,I2C控制OLED显示屏后想做个小作品练练手,一开始想着转码一个电影用OLED播放下看看,写着写着就跑题了,其实做一个能播放摄像头视频数据的播放器也不错。

import cv2 as cv
from PIL import Image
import numpy as np
import serial
import time

def convert2bitmap(img):
    # 将图像转换成灰度图
    black_img = img.convert("L")
    bdata_list = list(black_img.getdata())
    threshold = 128
    # 将灰度图转换为单色位图,值小于128的转换为0,其他的转换为1
    bvalue_list = [0 if i < threshold else 1 for i in bdata_list]
    arr = np.array(bvalue_list)
    # 将数组数据转换成64行128列的矩阵
    arr = arr.reshape((64, 128))
    data = []
    # 转换成OLED0561可显示的数据(左上到右下,高位在下边)
    for m in range(0, 8):
        for i in range(0, 128):
            col = arr[:, i]
            a = 0
            for j in range(0, 8):
                a |= col[m*8+j] << j
            data.append(a)
    return data

def worker():
    # 初始化串口(串口号需要根据实际值进行修改)
    s = serial.Serial("COM10", 115200)

    # 打开默认摄像头设备
    capture = cv.VideoCapture(0)

    while True:
        # 读取摄像头一帧数据
        ret, frame = capture.read()
        # 将图像设置为128 * 64大小(OLED屏幕为128 * 64)
        frame = cv.resize(frame, (128, 64))
        # 将帧数据转换成图像数据
        img = Image.fromarray(frame)
        # 将图像数据转换成OLED
        bitmap = convert2bitmap(img)
        # 将数据写入串口
        s.write(bitmap)
        # 这里加一些延迟,不然OLED屏幕闪的厉害
        time.sleep(0.3)
        cv.imshow("frame", frame)
        # 延迟1ms后切换到下一帧图像
        cv.waitKey(1)

if __name__ == "__main__":
    worker()

开源地址

Gitee:

gitee.com/GuaikOrg/ol…

Github:

github.com/GUAIK-ORG/o…

在主目录下video.py文件为视频采集和转码并通过串口发送给stm32的上位机程序

build目录下的build_pro.hex可烧录到stm32中。