前言
如标题所示。
目标是树莓派作为客户端只负责捕捉画面,PC端运行yolo识别。
一、版本一:实现基本的功能
树莓派(客户端)
import cv2
import socket
import pickle
import struct
import time
# 初始化摄像头
cap = cv2.VideoCapture(0)
# 创建套接字并连接到PC
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.254.254', 8080)) # 替换为PC的实际IP地址
# 添加延时,确保连接稳定
time.sleep(1)
while True:
ret, frame = cap.read()
if not ret:
print("无法读取摄像头数据")
break
# 序列化图像
try:
data = pickle.dumps(frame)
except Exception as e:
print(f"序列化图像时出现错误: {e}")
break
# 发送数据长度
try:
client_socket.sendall(struct.pack("I", len(data)))
except Exception as e:
print(f"发送数据长度时出现错误: {e}")
break
# 发送数据
try:
client_socket.sendall(data)
except Exception as e:
print(f"发送数据时出现错误: {e}")
break
# 释放摄像头和关闭连接
cap.release()
client_socket.close()
PC端(服务端)
'''
#Author :susocool
#Creattime:2024/9/19
#FileName:0-PC2PI-server
#Description: 目标是电脑端作为服务端给客户端(pi)传递信息
'''
import cv2
import torch
import socket
import pickle
import struct
import time
# 在循环前设置初始时间
start_time = time.perf_counter()
# 加载YOLOv5模型
model_path = 'D:\\yolov5-master\\runs\\train\\exp4\\weights\\best.pt'
model = torch.hub.load ( 'D:\\yolov5-master', 'custom', path=model_path, source='local' )
# 创建套接字并监听来自树莓派的连接
server_socket = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
server_socket.bind ( ('0.0.0.0', 8080) ) # 监听所有接口的8080端口
server_socket.listen ( 1 )
print ( "等待连接..." )
conn, addr = server_socket.accept ()
print ( f"连接来自 {addr}" )
frames = 0
next_frame_time = 0
while True :
try :
# 接收数据长度
data_len = struct.unpack ( "L", conn.recv ( struct.calcsize (</