如何通过 OpenCV 和 Python 通过索引从视频中获取帧?

Posted

技术标签:

【中文标题】如何通过 OpenCV 和 Python 通过索引从视频中获取帧?【英文标题】:How to get frame from video by its index via OpenCV and Python? 【发布时间】:2018-02-16 10:59:44 【问题描述】:

我需要通过帧索引访问视频中的帧。到目前为止,我使用了这样的代码:

video = cv2.VideoCapture(video_path)
status, frame = video.read()

代码读取第一帧。如果我重复使用该代码,我将获得下一帧。但是如何通过索引直接访问任何帧呢?

也就是说,如果我想要第二帧,如何不调用read()两次直接访问第二帧?

【问题讨论】:

【参考方案1】:

使用VideoCapture::set()CAP_PROP_POS_FRAMES 属性id 来设置要读取的帧的位置。

myFrameNumber = 50
cap = cv2.VideoCapture("video.mp4")

# get total number of frames
totalFrames = cap.get(cv2.CAP_PROP_FRAME_COUNT)

# check for valid frame number
if myFrameNumber >= 0 & myFrameNumber <= totalFrames:
    # set frame position
    cap.set(cv2.CAP_PROP_POS_FRAMES,myFrameNumber)

while True:
    ret, frame = cap.read()
    cv2.imshow("Video", frame)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

【讨论】:

cap.set(1, myFrameNumber) 是 python 3 所必需的 感谢@zindarod 的帮助!也建议在cv2.destroyAllWindows()前加cap.release()【参考方案2】:
import os
folder= 'frames'
os.mkdir(folder)
import cv2
vidcap = cv2.VideoCapture('four.mp4')
def getFrame(sec):
    vidcap.set(cv2.CAP_PROP_POS_MSEC,sec*1000)
    hasFrames,image = vidcap.read()
    if hasFrames:
        cv2.imwrite("image"+str(count)+".jpg", image)     # save frame as JPG file
    return hasFrames
sec = 0
frameRate = 0.5 #//it will capture image in each 0.5 second
count=1
success = getFrame(sec)
while success:
    count = count + 1
    sec = sec + frameRate
    sec = round(sec, 2)
    success = getFrame(sec)

【讨论】:

以上是关于如何通过 OpenCV 和 Python 通过索引从视频中获取帧?的主要内容,如果未能解决你的问题,请参考以下文章

通过未知类型的 Mat 进行 OpenCV 索引

看OpenCV如何在python中实现图像检测!

使用python将opencv图像通过管道传输到ffmpeg

如何在python openCV中计算六边形的内角

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

python opencv安装教程 通过pip安装三方库