以下是一个使用Yolov5模型进行视频目标检测,并通过WebSocket将检测结果发送给网页显示的示例代码:
import cv2
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
socketio = SocketIO(app)
@socketio.on('connect')
def handle_connect():
print('Client connected')
@socketio.on('disconnect')
def handle_disconnect():
print('Client disconnected')
@app.route('/')
def index():
return render_template('index.html')
def detect_objects(video_path):
# 加载Yolov5模型,这里假设已经准备好了yolov5模型文件
net = cv2.dnn.readNetFromDarknet('path/to/yolov5.cfg', 'path/to/yolov5.weights')
model_classes = []
# 读取coco.names文件,获取目标类别列表
with open("path/to/coco.names", "r") as file:
model_classes = [line.strip() for line in file.readlines()]
# 打开视频流
cap = cv2.VideoCapture(video_path)
while True:
ret, frame = cap.read()
if not ret:
break
# 使用Yolov5进行目标检测
blob = cv2.dnn.blobFromImage(frame, 1/255.0, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
output_layers_names = net.getUnconnectedOutLayersNames()
layer_outputs = net.forward(output_layers_names)
boxes = []
confidences = []
class_ids = []
for output in layer_outputs:
for detection in output:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5:
center_x = int(detection[0] * frame.shape[1])
center_y = int(detection[1] * frame.shape[0])
width = int(detection[2] * frame.shape[1])
height = int(detection[3] * frame.shape[0])
x = int(center_x - width / 2)
y = int(center_y - height / 2)
boxes.append([x, y, width, height])
confidences.append(float(confidence))
class_ids.append(class_id)
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = model_classes[class_ids[i]]
# 在图像上绘制检测框和标签
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.putText(frame, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,
0.9, (255, 0 ,0), 2)
# 将带有检测结果的图像发送给网页
_, img_encoded = cv2.imencode('.jpg', frame)
socketio.emit('image', img_encoded.tobytes())
cap.release()
if __name__ == '__main__':
video_path = 'path/to/video.mp4' # 视频路径
socketio.run(app)
请注意,以上代码只提供了一个简单的示例,您需要根据具体情况进行适当的修改和调整。同时,您还需要安装相关的依赖库(如Flask、flask-socketio、numpy等)。另外,确保模型文件和标签文件的路径正确,并替换代码中的”path/to”部分。
内容由零声教学AI助手提供,问题来源于学员提问




