2024全国大学生智能汽车竞赛——创意组 风雨同舟 上位机控制硬件检测:视频流处理及检测模块

这一部分的主要工作基于前期摄像头正确检测后,读入视频流后处理成正确的格式。为后续的图像识别和OCR检测提供正确的视频图像数据。

智能车各硬件之间属于经典的OS模型——话题模型publisher和subscriber。由硬件发布信息作为publisher,板卡作为subscriber接受信息。因此在设计硬件控制程序的时候需要充分考虑OS模型中不同身份之间的关系。

下面实现了一个视频流的发布者功能,从摄像头捕获图像,将其编码为JPEG格式,然后使用ZeroMQ(ZMQ)的PUB/SUB消息模式通过网络发送这些图像,发布处理好的视频信息

import zmq
import sys
import time
from camera import Camera
import cv2
  • zmq: ZeroMQ库,用于消息传递。
  • sys: 系统特定的参数和函数。
  • time: 与时间相关的函数。
  • Camera: 自定义模块,用于与摄像头交互。
  • cv2: OpenCV库,用于图像处理。
  • context: 创建一个新的ZeroMQ上下文,用于管理套接字。
  • skt: 创建一个新的PUB(发布者)套接字。
  • skt.bind("tcp://127.0.0.1:7889"): 将套接字绑定到 127.0.0.17889 端口。
  • time.sleep(0.05): 暂停循环50毫秒。
  • img = cap.read(): 从摄像头捕获图像。
  • img = cv2.imencode('.jpg', img)[1].tobytes(): 将图像编码为JPEG格式并转换为字节。
  • data = bytes('image', encoding='utf-8') + img: 准备要发送的数据,将字符串 image 作为前缀添加到图像字节前。
  • skt.send(data): 通过ZMQ套接字发送数据。
  • print('发送消息'): 打印消息,指示数据已发送。
cap = Camera(1)
def main():
    context = zmq.Context()
    skt = context.socket(zmq.PUB)
    skt.bind("tcp://127.0.0.1:7889")
 
    while True:
        # try:
            time.sleep(0.05)
            img = cap.read()
            # img转jpeg格式
            img = cv2.imencode('.jpg', img)[1].tobytes()
            data = bytes('image', encoding='utf-8') + img
            # # 发送数据
            # data = bytes('服务器时间:@' + time.strftime("%Y-%m-%d %H:%M:%S %a"), encoding='utf-8')
 
            skt.send(data)
 
            print('发送消息')
        # except Exception as e:
        #     print('异常:', e)
        #     sys.exit()
 
 
if __name__ == '__main__':
    main()

下面实现了一个sub订阅者,用于接收和处理通过ZeroMQ发布的图像数据。

import zmq
import sys
import cv2
import numpy as np
import time
 
 
def main():
    context = zmq.Context()
    print("连接服务器...")
    skt = context.socket(zmq.SUB)
    skt.connect("tcp://127.0.0.1:7889")
 
    skt.setsockopt(zmq.SUBSCRIBE, 'image'.encode('utf-8'))  # 只订阅 服务器时间 开头的消息
    last_time = time.time()
    while True:
        response = skt.recv()
        head = response[:5]
        # print(head)
        image_jpg_bytes = response[5:]
        # 把bytes转为jpg格式
        image = cv2.imdecode(np.frombuffer(image_jpg_bytes, dtype=np.uint8), 1)
        fps = 1 / (time.time() - last_time)
        last_time = time.time()
        print("fps:", fps)
        # cv2.imshow('image', image)
        # if cv2.waitKey(1) & 0xFF == ord('q'):
        #     break

        # print("接收到服务器数据: ", response)
    sys.exit()
 
 
if __name__ == '__main__':
    main()

下面这个模块实现了车载板卡与百度文心一言大模型的对接,为后续处理OCR识别出的指令做出分析。

from ernie_bot import ErnieBotWrap

def ernie_func():
    ernie = ErnieBotWrap()
    while True:
        print("用户")
        str_tmp = input("输入:")
        if len(str_tmp)<1:
            continue
        # Create a chat completion
        print("文心一言")
        _, str_res = ernie.get_res(str_tmp)
        print("输出:",str_res)

if __name__ == "__main__":
    ernie_func()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值