predict.py 1.8 KB

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