OpenCV从url加载视频

Posted

技术标签:

【中文标题】OpenCV从url加载视频【英文标题】:OpenCV load video from url 【发布时间】:2018-10-15 13:47:23 【问题描述】:

我有一个视频文件(即https://www.example.com/myvideo.mp4),需要用 OpenCV 加载它。

用一张图片做同样的事情是相当简单的:

imgReq = requests.get("https://www.example.com/myimage.jpg")
imageBytes = np.asarray(bytearray(data), dtype=np.uint8)
loadedImage = cv2.imdecode(image, cv2.IMREAD_COLOR)

我想做类似于以下的事情(loadedVideo 将类似于 OpenCV 从 cv2.VideoCapture 返回的内容):

videoReq = requests.get("https://www.example.com/myimage.mp4")
videoBytes = np.asarray(bytearray(data), dtype=np.uint8)
loadedVideo = cv2.videodecode(image, cv2.IMREAD_COLOR)

但是cv2.videodecode 不存在。有什么想法吗?


编辑:鉴于这可能是仅使用 OpenCV 的死胡同,我愿意接受在加载到 OpenCV 之前结合其他成像库的解决方案……如果存在这样的解决方案。 p>

【问题讨论】:

如果您将视频下载到硬盘并在那里尝试 VideoCapture,它是否有效? 是的,但我无法想象这是最有效的方法,因为它将磁盘 IO 引入了问题,而不是将所有内容都保存在内存中。我正在寻找尽可能低的延迟。 不,这只是一个减少错误源的测试(如 mossing 编解码器) 您想将整个视频保存在内存中还是将其用作流式视频? 我想将整个视频保存在内存中。 【参考方案1】:

您必须使用 VideoCapture 阅读视频。目前没有其他办法。除非你自己定义。

请记住,视频是以定义的帧速率变化的图像组合。

因此您可以在 while 循环中读取每一帧。当你应用 imdecode 函数时。

import numpy as np
import cv2

cap = cv2.VideoCapture('https://www.example.com/myimage.mp4')

while(cap.isOpened()):
    ret, image = cap.read()    
    loadedImage = cv2.imdecode(image, cv2.IMREAD_COLOR)
    cv2.imshow('frame',loadedImage)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

【讨论】:

【参考方案2】:

似乎cv2.videocodeOpenCV 2.xOpenCV 3.x 中都不是有效的OpenCV API

下面是它在OpenCV 3 中工作的示例代码,它使用cv2.VideoCapture 类。

import numpy as np
import cv2

# Open a sample video available in sample-videos
vcap = cv2.VideoCapture('https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_2mb.mp4')
#if not vcap.isOpened():
#    print "File Cannot be Opened"

while(True):
    # Capture frame-by-frame
    ret, frame = vcap.read()
    #print cap.isOpened(), ret
    if frame is not None:
        # Display the resulting frame
        cv2.imshow('frame',frame)
        # Press q to close the video windows before it ends if you want
        if cv2.waitKey(22) & 0xFF == ord('q'):
            break
    else:
        print "Frame is None"
        break

# When everything done, release the capture
vcap.release()
cv2.destroyAllWindows()
print "Video stop"

您可以查看此Getting Started with Videos 教程以获取更多信息。

希望对您有所帮助。

【讨论】:

它在 ubuntu 16.04 中不起作用。如何直接在 OpenCV 上进行流式传输?我已经使用 pip install opencv-python==3.4.5 安装了 OpenCV,或者也尝试了版本 4。 @Akash 你检查了网址吗?上面答案中提到的那个坏了。 @abggcv,我找到了解决方案。由于 SSL 问题,HTTPS URL 不能直接在 Ubuntu 中工作。使用 OpenSSL FLAG 构建 OpenCV 时可能会起作用。就我而言,我已将 URL HTTPS 更改为 HTTP,它运行良好。 我知道这超出了原始问题的范围,但是如果有可用的音频流,您知道如何同时读取音频流吗? @Kaszanas 您应该打开一个新问题并提供有关您的用例的更多信息以获取答案。祝你好运。

以上是关于OpenCV从url加载视频的主要内容,如果未能解决你的问题,请参考以下文章

从0-1轻松入门 OpenCV4

如何使用 Opencv 和 python 从网络上播放视频

Opencv 3.0 加载人脸级联时出错

opencv4opencv视频教程 C++(opencv教程)2加载,修改,保存图像

通过opencv和c ++从ip摄像头流式传输视频

如何使用 OpenCV 从我的磁盘播放视频文件。? [关闭]