使用cv2.VideoCapture()从IP摄像头读取流

5 投票
3 回答
32192 浏览
提问于 2025-04-17 23:56

提到一个类似的问题 如何从IP摄像头解析mjpeg http流? 我通过使用 requests 成功读取了IP摄像头的流:

stream = requests.get('http://<user>:<pass>@<addr>:<port>/videostream.cgi', stream=True)

bytez = ''
while True:
    bytez += stream.raw.read(16384)
    ...

这个方法运行得非常好,但我想用 cv2.VideoCapture() 来实现,而不是使用requests。

我尝试了不同的方式,比如:

cap = cv2.VideoCapture()
cap.open('http://<user>:<pass>@<addr>:<port>/videostream.cgi?.mjpg')

while(True):
    ret, frame = cap.read()
    ...

但是我什么都没得到,只是遇到了关于空帧的异常。

如何用 cv2.VideoCapture() 来读取IP摄像头的流呢?

3 个回答

0

我还没试过用VideoCapture来访问IP摄像头,不过在你的方法中,cap = cv2.VideoCapture()这个视频捕捉是需要一个数字来表示摄像头,通常是0

如果你把这个数字留空,就不会连接到任何摄像头,所以会出现关于空帧的错误(即使你之后声明了cap.open(),openCV已经尝试打开一个摄像头,并且发现是空的)。

3

在你的 cap = cv2.VideoCapture() 这一行中,传入摄像头的位置:

cap = cv2.VideoCapture('http://<user>:<pass>@<addr>:<port>/videostream.cgi?.mjpg')
2

把 C:\OpenCV\3rdparty\ffmpeg\ 这个路径添加到 Windows 的 PATH 环境变量里,或者把 opencv_ffmpeg.dll 这个文件从那个文件夹复制到 C:\Python27 里。这个问题在这里已经有人回答过了,链接是 OpenCV 2.4 VideoCapture 在 Windows 上无法使用

撰写回答