这是客户端代码,主要功能是通过使用socket从一个客户端向服务端发送摄像头捕获的视频帧。 这段代码中的time.sleep(0.2)是为了控制发送帧的速度,cv2.waitKey(50)是等待50秒,如果在这段时间内按下任何键,将返回按键的ASCII码,否则返回-1。如果不控制发送帧的速度,容易产生粘包问题。
import socket
import time
import cv2
import numpy as np
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.1.249', 8888) #IP地址为服务端的IP地址,端口号任意
client_socket.connect(server_address)
cap = cv2.VideoCapture(0) # 打开摄像头,0为默认摄像头
while True:
ret, frame = cap.read() # 获取视频的开启状态和每一帧图片
img_encode = cv2.imencode('.jpg', frame)[1] # 对每一帧图片进行编码
data = np.array(img_encode) # 转化为矩阵
byte_encode = data.tobytes() # 编码格式转为字节格式
data_len = str(len(byte_encode)) # 获取每一帧图片的大小(字节数)
print('每帧图片大小: %s' % data_len)
client_socket.send(byte_encode) # 发送给服务端呈现
time.sleep(0.2)
data = client_socket.recv(88888) # 88888为接受的最大字节数,根据需要调整
nparr = np.frombuffer(data, dtype='uint8') # 化为数组
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) # 解码为彩色图
cv2.imshow('clint', img)
cv2.waitKey(50) # 等待50毫秒
client_socket.close()
这是服务端代码,它的主要功能是接收客户端发送的视频帧,然后使用YOLO模型进行人脸检测和识别,最后将识别后的图像发送回客户端。
import socket
import cv2
from ultralytics import YOLO
import numpy as np
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.1.249', 8888) #IP地址为服务端的IP地址,端口号任意
server_socket.bind(server_address)
server_socket.listen(1)
print('Server is listening...')
client_socket, client_address = server_socket.accept()
print('Connection from', client_address)
model = YOLO("yolov8n.yaml")
model = YOLO("yolov8n.pt")
while True:
data = client_socket.recv(88888) # 88888为接受的最大字节数(默认分辨率情况下图片也就3、4万字节)
nparr = np.frombuffer(data, dtype='uint8') # 化为数组
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) # 解码为彩色图
res = model.predict(img, classes=[0]) # classes=[0]表示只检测人这一类别
img = res[0].plot()
cv2.imshow('server', img)
cv2.waitKey(50)
img_encode = cv2.imencode('.jpg', img)[1] # 对每一帧图片进行编码
data = np.array(img_encode) # 转化为矩阵
byte_encode = data.tobytes() # 编码格式转为字节格式
client_socket.send(byte_encode) # 发送数据
client_socket.close()
server_socket.close()