-1

我正在尝试使用 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 为假)。

在一个单独的窗口中,我可以运行 openRTSP :

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

这为我创建了一个不错的 mp4 文件,我可以播放:107625 Sep 12 19:08 cam_eight-00000-00010.mp4

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

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

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

4

1 回答 1

0

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

OPENCV_FFMPEG_CAPTURE_OPTIONS=whatever

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

于 2019-09-12T19:33:37.360 回答