MM32G0001串口图像展示

分享作者:wechat_15135690968
作者昵称:禹黎151
评测品牌:灵动微电子
评测型号:FTHR-G0001
发布时间:2025-12-30 16:55:30
3
概要
电脑通过串口输出帧画面
开源口碑分享内容

OLED.C增加帧画面显示函数

static uint8_t s_frameBuf[1024];
static uint16_t s_bufIdx = 0;

void OLED_ShowPicture(const uint8_t *pic)
{
    OLED_WriteCommand(0x20);  
    OLED_WriteCommand(0x02);  

    OLED_WriteCommand(0x21);  
    OLED_WriteCommand(0x00);  
    OLED_WriteCommand(0x7F);  

    OLED_WriteCommand(0x22);  
    OLED_WriteCommand(0x00);  
    OLED_WriteCommand(0x07);  

    for (uint16_t i = 0; i < 1024; i++)
        OLED_WriteData(pic[i]);
}


void OLED_WriteBuffer(uint8_t data)
{
    if (s_bufIdx < 1024)
        s_frameBuf[s_bufIdx++] = data;

    if (s_bufIdx == 1024)          /* 满 1 帧 */
    {
        s_bufIdx = 0;
        OLED_ShowPicture(s_frameBuf);
    }
}


void OLED_ShowFrame(void)
{
    OLED_ShowPicture(s_frameBuf);
    s_bufIdx = 0;                 
}


.H增加声明



void OLED_ShowPicture(const uint8_t *pic);   
void OLED_WriteBuffer(uint8_t data);     
void OLED_ShowFrame(void);        


工程添加USART_polling.C和.H程序

修改串口数据存入s_frameBuf帧画面数组,

电脑python、opencv环境

change_send.py


import cv2
import numpy as np
import serial


class UART(serial.Serial):

    def __init__(self, port, baudrate, timeout):
        try:
            super().__init__(port=port, baudrate=baudrate, timeout=timeout)
        except serial.serialutil.SerialException:
            print('找不到串口!')
        except Exception as result:
            print("未知错误 %s" % result)

    def send(self, byte):
        super().write(chr(byte).encode('iso-8859-1'))

    def receive(self):
        return super().read()

    def close(self):
        super().close()


class ImageChange(object):

    def __init__(self):
        self.__img = np.zeros((64, 128), np.uint8)
        self.__img_lst = []

    def img_load(self, image):
        self.__img = image

    def img_read(self):
        self.__img_lst = []
        return self.__img

    def change_threshold(self):
        self.__img = cv2.cvtColor(self.__img, cv2.COLOR_BGR2GRAY)
        self.__img = cv2.resize(self.__img, (128, 64))
        ret, self.__img = cv2.threshold(self.__img, 127, 255, cv2.THRESH_BINARY)
        return self.__img

    def change_canny(self):
        self.__img = cv2.cvtColor(self.__img, cv2.COLOR_BGR2GRAY)
        self.__img = cv2.resize(self.__img, (128, 64))
        self.__img = cv2.Canny(self.__img, 50, 100)

        return self.__img

    def __page_deal(self, pageNum):
        data = 0
        for x in range(128):
            for y in range(8):
                temp = self.__img[y + pageNum * 8][x]
                if temp == 255:
                    data |= 0x01 << y
            self.__img_lst.append(data)
            data = 0

    def get_data(self):
        for i in range(8):
            self.__page_deal(i)
        return self.__img_lst

send.py

import change_send
import time


uart = change_send.UART('COM14', 500000, 1)

f = open('./video/badapple.txt', mode='r')

n = 0
time.sleep(1)
for line in f.readlines():

    for i in line.replace('\n', '').split(','):
        if i != '':
            uart.send(int(i))

videoChange.py


import change_send
import cv2

cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 128, 64)
video = cv2.VideoCapture('./video/badapple.mp4')
img = change_send.ImageChange()

videoLst = []
while video.isOpened():
    flag, frame = video.read()
    if not flag:
        break
    img.img_load(frame)
    frame = img.change_threshold()
    videoLst.append(img.get_data())
    cv2.imshow('video', frame)
    if cv2.waitKey(1) == ord('q'):
        break

cv2.destroyAllWindows()

f = open('./video/badapple.txt', mode='w')

for piece in videoLst:
    for data in piece:
        f.write(str(data)+',')
    f.write('\n')

print('Over!')


全部评论
暂无评论
0/144