我正在尝试使用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
答案 0 :(得分:0)
根据其他answers,无法使用OpenCV获取ONVIF流,因为它默认将流使用 tcp 协议,而ONVIF依赖于 udp 。
您应该定义环境变量OPENCV_FFMPEG_CAPTURE_OPTIONS
以跳过默认设置为tcp,如原始源代码here所示:
OPENCV_FFMPEG_CAPTURE_OPTIONS=whatever
如果要正确配置捕获选项,则应参考OpenCV内部使用的ffmpeg
documentation。
如链接答案中所述,键和值之间用;
分隔,而对之间则通过|
分隔。