如何使用opencv从IP摄像机接收直播



我正在构建一个项目,在该项目中,我从网络摄像头或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)sourcecolor.cpp:182: error:(-215:Asertion failed)!_src.empty() in function ‘cv::cvtColor’

在我看来,opencv库未能从url捕获实时提要,然后代码失败。任何人知道如何解决这个问题,下面是我使用的版本和规范:

  • 在没有gpu的i5机器上使用Tensorflow 2.0
  • 海康威视云台IP摄像机
  • Python 3.7版
  • Opencv版本4.4

代码:

  • 检查vid.isOpen((。如果不是,则不要读取
  • 比如rv, img = vid.read()
  • 检查rv是否为True,否则中断循环

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

将相机设置为较低的FPS值。照相机将以其自身的速率产生帧。它不会为你停止或减速。

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

最新更新