| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import cv2
- from ultralytics import YOLO
- # ------------------- 配置参数 -------------------
- VIDEO_PATH = '1234520251015_152225.mp4'
- WEIGHTS_PATH = 'yolov8n-seg.pt'
- OUTPUT_PATH = 'output_segmented_video.mp4' # 输出视频路径
- CONFIDENCE_THRESHOLD = 0.5 # 置信度阈值
- SHOW_VIDEO = True # 是否实时显示(可设为 False 以加快处理)
- # ------------------------------------------------
- # 加载 YOLOv8 分割模型
- model = YOLO(WEIGHTS_PATH) # 自动加载模型结构和权重
- # 打开视频文件
- cap = cv2.VideoCapture(VIDEO_PATH)
- # 获取视频的宽高、帧率
- width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
- height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
- fps = int(cap.get(cv2.CAP_PROP_FPS))
- # 定义视频写入器
- fourcc = cv2.VideoWriter_fourcc(*'mp4v')
- out = cv2.VideoWriter(OUTPUT_PATH, fourcc, fps, (width, height))
- # 检查视频是否成功打开
- if not cap.isOpened():
- print("❌ 无法打开视频文件!请检查路径是否正确。")
- exit()
- print("✅ 开始处理视频...")
- while True:
- ret, frame = cap.read()
- if not ret:
- print("🔚 视频读取完成或结束。")
- break
- # 使用 YOLOv8 进行推理(分割)
- results = model(frame, conf=CONFIDENCE_THRESHOLD, imgsz=640)
- # 在原图上绘制分割结果
- annotated_frame = results[0].plot() # plot() 方法会自动画出边界框、分割掩码、标签等
- # 写入输出视频
- out.write(annotated_frame)
- # 实时显示(可选)
- if SHOW_VIDEO:
- cv2.imshow('YOLOv8 Segmentation', annotated_frame)
- if cv2.waitKey(1) & 0xFF == ord('q'): # 按 'q' 键退出
- print("🛑 用户中断。")
- break
- # 释放资源
- cap.release()
- out.release()
- cv2.destroyAllWindows()
- print(f"✅ 处理完成!分割后的视频已保存为:{OUTPUT_PATH}")
|