[ ST NUCLEO-U575ZI-Q 测评] 做一个监控显示器
<div class='showpostmsg'><p><a href="https://bbs.eeworld.com.cn/thread-1230970-1-1.html">[ ST NUCLEO-U575ZI-Q 测评] 串口中断不定长接收 - RF/无线 - 电子工程世界-论坛 (eeworld.com.cn)</a></p><p><a href="https://bbs.eeworld.com.cn/thread-1230832-1-1.html">[ ST NUCLEO-U575ZI-Q 测评] 优化OLED显示 - RF/无线 - 电子工程世界-论坛 (eeworld.com.cn)</a></p>
<p>前面优化了OLED、串口接收,现在结合在一起做一个监控显示器:</p>
<p>流程图大致如下:</p>
<p> python程序:</p>
<pre>
<code>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,im.size)
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 == 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()
# 停止调用,关闭窗口
</code></pre>
<p>在原来OLED、串口的基础上在main函数加入数据处理以及图片显示:</p>
<pre>
<code> if(rxtx_it_usart.rx_flage == 1)
{
rxtx_it_usart.rx_flage = 0;
//判断数据帧是否对;
if(rxtx_it_usart.rx_buf == 0xAA && rxtx_it_usart.rx_buf == 0x55 && rxtx_it_usart.rx_buf ==0xBB)
{
OLED_ShowPicture(0,0,128,64,&rxtx_it_usart.rx_buf,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);
}</code></pre>
<p>实验效果:</p>
<p> 17d05246770b2114314acf16e035a5f6<br />
</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>这个可以,图像二值处理是怎么实现的?</p>
<pre>
<code> 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')# 打开对应图片
</code></pre>
<p>这个就是处理的函数。</p>
<p>测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html</p>
页:
[1]