📌 摘要
本文记录了使用 YOLO-World 模型结合 OpenCV 实现对视频流的实时目标检测的过程。针对使用 results[0].show() 显示图像时窗口频繁弹出导致卡顿的问题,进行了代码优化,改用 OpenCV 显示图像以提升性能与用户体验。
文章包含完整实现代码、关键逻辑解释以及实际运行效果展示,适用于初学者和有一定基础的 AI 开发者。
🎯 实现目的
在使用 Ultralytics 提供的 YOLO-World 模型进行视频目标检测时,发现官方接口中 results[0].show() 方法会不断弹出新的图像窗口,严重影响程序流畅度,甚至导致电脑卡顿。
因此,本文通过集成 OpenCV(cv2) 实现视频帧的统一显示,达到稳定、高效地展示检测结果的目的。
🛠️ 环境准备
确保你已安装以下依赖库:
pip install ultralytics opencv-python
模型文件:yolov8s-world.pt 可从 Ultralytics 官方仓库获取或自动下载。
🧩 核心代码解析
import datetime
import cv2
from ultralytics import YOLOWorld
# 加载YOLOWorld模型
model = YOLOWorld('yolov8s-world.pt')
resize_width = 1920
resize_height = 1080
def main():
# 设置跳帧处理(提高性能)
skip_frames = 2
frame_count = 0
# 打开摄像头(可以替换为视频路径)
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
frame_count += 1
if frame_count % skip_frames != 0:
continue # 跳过部分帧以减少计算压力
# 模型预测
results = model.predict(frame, conf=0.1, save_txt=False)
for result in results:
img = result.plot(line_width=2, font_size=24) # 绘制检测框和标签
# 图像缩放(适配屏幕)
img = cv2.resize(img, (resize_width, resize_height))
# 添加时间水印
cv2.putText(img, f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
(10, 20),
cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 2)
# 使用OpenCV显示结果
cv2.imshow("video", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
🔧 关键改进点
| 改进点 | 描述 |
|---|---|
| 使用 OpenCV 显示画面 | 避免多个窗口弹出,提升稳定性 |
| 增加跳帧机制 | 减少每秒处理帧数,降低CPU/GPU负载 |
| 添加时间戳水印 | 方便调试和记录检测时间 |
| 图像分辨率自定义 | 更好适配不同显示器 |
✅ 额外提示:可通过
model.set_classes(["person", "cat"])设置只识别特定类别,进一步提升效率。
📷 运行效果展示

🚀 扩展建议
- 将检测结果保存为视频文件(使用
cv2.VideoWriter) - 部署到树莓派或其他嵌入式设备上实现实时监控
- 接入 RTSP 流媒体地址进行远程视频分析
- 结合 Flask 或 FastAPI 构建 Web 检测服务
✅ 总结
本文通过将 YOLO-World 与 OpenCV 结合,实现了高效的视频目标检测流程。解决了原生 results.show() 方法带来的卡顿问题,提升了应用的实用性和用户体验。
如果你正在尝试搭建自己的实时检测系统,不妨参考本方案进行优化实践。
📌 如果你觉得这篇文章对你有帮助,请点赞 + 收藏 + 分享,让更多人了解如何用 YOLO-World 和 OpenCV 做实时目标检测!
💬 欢迎留言讨论你在部署过程中遇到的问题或优化建议。
3698

被折叠的 条评论
为什么被折叠?



