这一部分的主要工作基于前期摄像头正确检测后,读入视频流后处理成正确的格式。为后续的图像识别和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.1
的7889
端口。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()