lugl4313820 发表于 2023-1-13 13:23

[ 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>&nbsp; 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 &amp;&amp; rxtx_it_usart.rx_buf == 0x55 &amp;&amp; rxtx_it_usart.rx_buf ==0xBB)
                        {
                                OLED_ShowPicture(0,0,128,64,&amp;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> &nbsp;17d05246770b2114314acf16e035a5f6<br />
&nbsp;</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>

wangerxian 发表于 2023-1-13 16:17

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

lugl4313820 发表于 2023-1-13 20:17

<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>

okhxyyo 发表于 2023-2-2 14:00

<p>测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html</p>
页: [1]
查看完整版本: [ ST NUCLEO-U575ZI-Q 测评] 做一个监控显示器