【问题标题】:How to recieve live stream from IP camera using opencv?如何使用 opencv 从 IP 摄像机接收实时流?
【发布时间】:2021-03-17 19:45:30
【问题描述】:

我正在构建一个项目,其中我从网络摄像头或 USB 摄像头或从 url 捕获视频,并使用机器学习 tensorflow API 对视频执行对象检测。如果我从网络摄像头或外部 USB 摄像头获取输入视频,一切正常,但是当我使用 url 从 IP 摄像头获取输入时,代码在运行 30-40 秒后失败。 我的代码是这样的

import cv2
vid = cv2.VideoCapture(“rtsp://x.xx.xx.xx:554”) 
While(True) 
  _,img = vid.read()
  img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
  final_img = show_inference(detection_model , img)

  final_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

  cv2.imshow(‘frame’, final_img)
  If cv2.waitkey(1)
    break
Vid.release()

cv2.destroyAllWindows()

当我使用以下几行使用网络摄像头或 USB 摄像头执行它时,这工作正常:

cv2.VideoCapture(0)cv2.VideoCapture(1)

但是当我使用 url 运行时,它会显示 30-40 秒的帧,然后失败并出现以下错误

OpenCV(4.4.0)\source\color.cpp:182: error:(-215:Asertion failed)!_src.empty() in function ‘cv::cvtColor’

在我看来,opencv 库无法从 url 捕获实时提要,然后代码失败。 任何人都知道如何解决此问题,以下是我正在使用的版本和规格:

  • 在没有 gpu 的 i5 机器上使用 Tensorflow 2.0
  • 海康威视 PTZ 网络摄像机
  • Python 3.7 版
  • Opencv 4.4 版

【问题讨论】:

    标签: python-3.x tensorflow opencv machine-learning ip-camera


    【解决方案1】:

    代码:

    • 检查 vid.isOpened()。如果不是,请不要阅读。
    • rv, img = vid.read()
    • 检查 rv 是否为真,否则中断循环

    您是否以任何方式限制帧的接收?你的推理步骤需要很多时间吗?

    将相机设置为较低的 FPS 值。相机将以自己的速率生成帧。它不会为您停止或减速。

    当您不读取帧时,它们会排队。它们不会消失。这最终会导致你崩溃或给你其他类型的失败。您绝对必须尽快消耗帧。

    【讨论】:

    • 我现在没有以任何方式限制帧。是的,我的推理步骤需要更长的时间。但是该代码始终可以与网络摄像头正常工作,并且在使用网络摄像头时推理步骤也需要更长的时间。您能否建议一些方法如何以所需的速率捕获帧或将接收速率与读取速率相匹配。多线程在这里有帮助吗?
    • 网络摄像头的驱动程序可能比处理网络流的代码更宽容。是的,如果你做得对,多线程可以提供帮助。启动一个连续读取帧并保留最新帧的线程。任何消费者在需要时都会阅读该框架。使用 python 的 Condition 对象通知消费者有新的帧。
    • 使用这个,根据需要修改。 gist.github.com/crackwitz/15c3910f243a42dcd9d4a40fcdb24e40
    • 网络摄像头驱动和专用软件一直没有帮助。我一定会尝试多线程。我也尝试在不使用任何机器学习算法的情况下使用 opencv 打开相同的 url,它运行良好。这让我得出结论,我需要找到一种方法,让 IP 流上的机器学习变得更快。有什么想法吗?
    • 这超出了这个问题的范围。使用我之前链接的要点来解决帧速率问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2018-01-14
    • 2020-08-01
    相关资源
    最近更新 更多