RTSP流和OpenCV(Python)

28

我有一个IP摄像头,通过rtsp协议和h264 Linux驱动程序在Linux上进行流媒体传输。我能够通过以下地址和端口在VLC中看到视频:

rtsp://192.168.1.2:8080/out.h264

然而,如果我尝试在Python 2.7.5(MacOS X 10.9)中获取相同的视频以进行OpenCV处理:

import cv
video = cv.CaptureFromFile('rtsp://192.168.1.2:8080/out.h264')

我遇到了以下错误:

WARNING: Couldn't read movie file rtsp://192.168.1.2:8080/out.h264

看起来似乎很简单,但我却卡在这里了。谢谢。

5个回答

31

这对我有用 (使用opencv 2.4.9):

vcap = cv.VideoCapture("rtsp://192.168.1.2:8080/out.h264")

while(1):

    ret, frame = vcap.read()
    cv.imshow('VIDEO', frame)
    cv.waitKey(1)

1
这对于opencv 3不起作用,因为我得到了与Guadancil11相同的错误。 - Marvin Effing
1
这对我来说是有效的,使用opencv 3.1.0和python3.4。 - Dion Bridger
1
对我有用。Python 2.7,opencv 3.3。 - ezfn
1
曾经在2.x上工作过,但需要做一些更改:import cv2 import numpy as np#此代码仅显示1个帧。vcap = cv2.VideoCapture(“ rtsp:// cam:554 / ch0_0.h264”)while(1):ret,frame = vcap.read() cv2.imshow('VIDEO',frame) cv2.waitKey(0) - Chop Labalagun
@ChopLabalagun,你的代码在没有numpy的情况下也可以在3.x上运行。 - Peter Nazarenko

19

OpenCV依赖于ffmpeg或其他视频后端处理视频格式和IP摄像头协议。根据您的平台和安装OpenCV的方式,您可能没有任何rtsp支持。

您可以检查您的OpenCV安装是否支持视频后端:

python -c "import cv2; print(cv2.getBuildInformation())"

Video I/O:
  DC1394 1.x:                  NO
  DC1394 2.x:                  NO
  FFMPEG:                      NO
     avcodec:                   NO
     avformat:                  NO
     avutil:                    NO
     swscale:                   NO
     avresample:                NO
  GStreamer:                   NO
  OpenNI:                      NO
  OpenNI PrimeSensor Modules:  NO
  OpenNI2:                     NO
  PvAPI:                       NO
  GigEVisionSDK:               NO
  Aravis SDK:                  NO
  UniCap:                      NO
  UniCap ucil:                 NO
  V4L/V4L2:                    NO/NO
  XIMEA:                       NO
  Xine:                        NO
  gPhoto2:                     NO

11
哪一个指示支持RTSP? - Matt
1
据我所知,(如果仍然需要),FFMPEG 应该支持 rtsp,因为它显示为 NO,所以应该使用 ffmpeg。 - bit_scientist
2
给未来的任何人:我不得不将opencv_ffmpeg310.dll放入我的工作目录中。否则,VideoCapture基本上会默默地失败。 - MrZander
我的树莓派3使用OPENCV 4.5.1 FFMPEG时出现了问题。那么,如何解决这个问题? - Zin Min
在编译 OpenCV 之前,@ZinMin请先安装 ffmpeg。 - DLara

9

我在这个问题上挣扎了一段时间...

最后,我通过这篇文章解决了它。

在安卓上

Install: https://play.google.com/store/apps/details?id=com.miv.rtspcamera
Start rtsp server on android

在电脑上,创建Python脚本。
import cv2
import numpy as npimport os
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;udp"
vcap = cv2.VideoCapture("rtsp://192.168.1.2:5554/camera", cv2.CAP_FFMPEG)
while(1):
    ret, frame = vcap.read()
    if ret == False:
        print("Frame is empty")
        break;
    else:
        cv2.imshow('VIDEO', frame)
        cv2.waitKey(1)

将“192.168.1.2”更改为您的Android设备地址。

运行Python脚本。


5

据我所知,OpenCV默认使用TCP协议进行传输。因此,如果您的流媒体使用UDP协议,则必须通过以下代码定义环境选项:

import os
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;udp"
cam = cv2.VideoCapture("rtsp://YOUR_STREAMING_IP_ADDRESS:PORT/foo.sdp", cv2.CAP_FFMPEG)

你还需要检查你的openCV2编译是否带有FFMPEG(RTSP),就像Solar.gy的回答一样。如果没有,你必须重新构建并安装带有FFMPEG的openCV。

python -c "import cv2; print(cv2.getBuildInformation())"

1
这个神秘的代码片段解决了我的问题。没有它: OpenCV(4.2.0) /io/opencv/modules/videoio/src/cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): rtsp://rpi3bp5.cosi.com:8080/ in function 'icvExtractPattern' - Bill Michaelson
如果您的视频/图像结果没有任何奇怪的情况发生,那么这可能只是一条内部错误消息,可以忽略。 - Uni
1
进程在发出该消息后终止。但是如所示,它已经落后于我。谢谢。 - Bill Michaelson

0

我在Linux下使用OpenCV 2的Python。以下代码适用于我。

cap = cv2.VideoCapture('rtsp://' + str(s_count) + '@' + str(s_URL) + ':' + str(i_rtsp_port) + '/' + str(i_rtsp_stream))

如果您不介意,可以访问这里查看示例代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接