1668|3

7063

帖子

11

TA的资源

版主

楼主
 

[ ST NUCLEO-U575ZI-Q 测评] 做一个监控显示器 [复制链接]

[ ST NUCLEO-U575ZI-Q 测评] 串口中断不定长接收 - RF/无线 - 电子工程世界-论坛 (eeworld.com.cn)

[ ST NUCLEO-U575ZI-Q 测评] 优化OLED显示 - RF/无线 - 电子工程世界-论坛 (eeworld.com.cn)

前面优化了OLED、串口接收,现在结合在一起做一个监控显示器:

流程图大致如下:

  python程序:

import time

import cv2
from PIL import Image

import serial
import binascii

ser = serial.Serial()


def port_open():
    ser.port = 'COM16'  # 设置端口号
    ser.baudrate = 230400  # 设置波特率 115200
    ser.bytesize = 8  # 设置数据位
    ser.stopbits = 1  # 设置停止位
    ser.parity = "N"  # 设置校验位
    ser.open()  # 打开串口,要找到对的串口号才会成功
    if (ser.isOpen()):
        print("打开成功")
    else:
        print("打开失败")


def port_close():
    ser.close()
    if (ser.isOpen()):
        print("关闭失败")
    else:
        print("关闭成功")


def send(send_data):
    if (ser.isOpen()):
        ser.write(send_data.encode('utf-8'))  # utf-8 编码发送
        # ser.write(binascii.a2b_hex(send_data))  #Hex发送
        print("发送成功", send_data)

# 引入库
cap = cv2.VideoCapture(0)
port_open()
while True:
    ret, frame = cap.read()
    im2 = cv2.resize(frame, (128, 64), )  # 为图片重新指定尺寸

    im2 = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)  # 先要转换为灰度图片
    ret, im2 = cv2.threshold(im2, 130, 255, cv2.THRESH_BINARY)  # 这里的第二个参数要调,是阈值!!

    cv2.imwrite('33.png', im2)  # 存成一张图片!!!
    im = Image.open('33.png')  # 打开对应图片

    #print(im.format, im.size)
    #print(im.size[0],im.size[1])

    a = ""  # 用于保存二进制数,以便于转化为16进制
    dat = 0  # 计算a中保存的二进制位数
    hex16 = 0  # 计算每行输出的16进制个数
    pixel = im.load()
    s = 0  # 从第s行开始执行
    high = 64
    wide = 128
    txt_h = []
    ########参考BMP图转化为16进制的方式,此为行列式逆向
    txt_h.append(0xAA)
    txt_h.append(0x55)
    for z in range(high // 8):  # 每八行执行一循环
        for x in range(wide):  # 图片宽度
            for y in reversed(range(8)):  # 每八个二进制位转化为一个16进制数
                if pixel[x, y + s] == 255:
                    a = a + "0"
                    dat = dat + 1
                else:
                    a = a + "1"
                    dat = dat + 1
                if (dat == 8):
                    # txt_h.append(hex(int(a, 2)))
                    txt_h.append(int(a, 2))
                    a = ""
                    dat = 0
        s = s + 8
    txt_h.append(0xBB)
    print("txt_h:" + str(txt_h))

    data = bytes(txt_h)
    ser.write(data)
    time.sleep(0.01)

    cv2.imshow("Video", im2)
    # 读取内容
    if cv2.waitKey(10) == ord("q"):
        break

# 随时准备按q退出
cap.release()
cv2.destroyAllWindows()
# 停止调用,关闭窗口

在原来OLED、串口的基础上在main函数加入数据处理以及图片显示:

		if(rxtx_it_usart.rx_flage == 1)
		{
			rxtx_it_usart.rx_flage = 0;
			//判断数据帧是否对;
			if(rxtx_it_usart.rx_buf[0] == 0xAA && rxtx_it_usart.rx_buf[1] == 0x55 && rxtx_it_usart.rx_buf[1026] ==0xBB)
			{
				OLED_ShowPicture(0,0,128,64,&rxtx_it_usart.rx_buf[3],0);
				OLED_Refresh();
			}
			//重新开始接收20个字节数据
			memset(rxtx_it_usart.rx_buf,0,sizeof(rxtx_it_usart.rx_buf));
			HAL_UART_Receive_IT(rxtx_it_usart.huart,rxtx_it_usart.rx_buf,RXBUFFSIZE);
		}

实验效果:

 
OLED监控显示

 

此帖出自无线连接论坛

最新回复

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html   详情 回复 发表于 2023-2-2 14:00
点赞 关注
 

回复
举报

7244

帖子

2

TA的资源

版主

沙发
 

这个可以,图像二值处理是怎么实现的?

此帖出自无线连接论坛
 
 

回复

7063

帖子

11

TA的资源

版主

板凳
 
    ret, frame = cap.read()
    im2 = cv2.resize(frame, (128, 64), )  # 为图片重新指定尺寸

    im2 = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)  # 先要转换为灰度图片
    ret, im2 = cv2.threshold(im2, 130, 255, cv2.THRESH_BINARY)  # 这里的第二个参数要调,是阈值!!

    cv2.imwrite('33.png', im2)  # 存成一张图片!!!
    im = Image.open('33.png')  # 打开对应图片

这个就是处理的函数。

此帖出自无线连接论坛
 
 
 

回复

1万

帖子

203

TA的资源

管理员

4
 

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html

此帖出自无线连接论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表