无法从IP摄像机获取Opencv,cv2.VideoCapture rtsp蒸汽

时间:2019-09-12 18:49:45

标签: opencv rtsp openrtsp

我正在尝试使用Opencv并运行Linux从Ip摄像机读取rtsp流。该相机是来自中国的Floureon IPC 360。我正在尝试开发一些面部识别代码。

我正在使用以下代码:

import numpy as np
import cv2

vcap = cv2.VideoCapture("rtsp://192.168.1.240:554/realmonitor?channel=0")
print(vcap)
while(1):
    ret, frame = vcap.read()
    print (ret,frame)
    cv2.imshow('VIDEO', frame)
    #cv2.imwrite('messigray.png',frame)
    cv2.waitKey(1)

$ python  w.py
<VideoCapture 0x7fc685598230>
(False, None)
Traceback (most recent call last):
  File "w.py", line 9, in <module>
    cv2.imshow('VIDEO', frame)
cv2.error: OpenCV(4.1.0) /io/opencv/modules/highgui/src/window.cpp:352: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'

cv2.imshow失败,因为框架为“无”且(ret为False)。

在另一个窗口中,我可以运行openRTSP:

./openRTSP  -4 -P 10 -F cam_eight -t -d 8 rtsp://192.168.1.240:554/realmonitor?channel=0

这为我创建了一个可以播放的漂亮mp4文件: 107625 9月12日19:08 cam_eight-00000-00010.mp4

OpenRTSP可以使用或不使用t(tcp)。 我还尝试向cv2.VideoCapture行提供admin:123456凭据,而openRTSP似乎不需要。

有什么想法为什么cv2.VideoCapture显然失败了?

我尝试了上述代码的变体,但似乎没有任何效果。 我已经在相机上启用了ONVIF

1 个答案:

答案 0 :(得分:0)

根据其他answers,无法使用OpenCV获取ONVIF流,因为它默认将流使用 tcp 协议,而ONVIF依赖于 udp 。 您应该定义环境变量OPENCV_FFMPEG_CAPTURE_OPTIONS以跳过默认设置为tcp,如原始源代码here所示:

OPENCV_FFMPEG_CAPTURE_OPTIONS=whatever

如果要正确配置捕获选项,则应参考OpenCV内部使用的ffmpeg documentation。 如链接答案中所述,键和值之间用;分隔,而对之间则通过|分隔。