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.videocode
在OpenCV 2.x
或OpenCV 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加载视频的主要内容,如果未能解决你的问题,请参考以下文章