当前位置: 首页 > 知识库问答 >
问题:

如何使用opencv从视频中读取特定帧到特定帧?

裴学
2023-03-14

我想从视频中的特定帧读取到特定帧。例如,我的视频由150帧组成,但我想从该视频的第5帧到第134帧读取视频。有可能吗?

共有2个答案

郝玄天
2023-03-14

我会这样做:

这可能使用的opencv比您想要的少,但我个人认为ffmpeg更适合这种操作

import cv2
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip

def get_framerate(video)->float:
    """ this function was made to extract the framerate from a video"""
    # Find OpenCV version
    (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
    if int(major_ver)  < 3 :
        return video.get(cv2.cv.CV_CAP_PROP_FPS)
    else :
        return = video.get(cv2.CAP_PROP_FPS)

if __name__ == "__main__":
    # get start frame
    videoName = input("Path of the video file ?")
    video = cv2.VideoCapture(videoName);
    fps = get_framerate(video)
    frame_start = int(input("Starting frame ?\n"))
    ts_start = frame_start / fps
    frame_end = int(input("Ending frame ?\n"))
    ts_end = frame_end / fps
    ffmpeg_extract_subclip(frameName, ts_start, ts_end, targetname="output.mp4")

来源1:openCV指南

来源2:关于堆栈溢出的另一个问题

赫连俊悟
2023-03-14

首先,您必须读取视频并将其存储到多维numpy阵列中。之后,您可以根据需要对numpy阵列进行切片

看见https://stackoverflow.com/a/42166299/4141279关于如何将视频读入numpy数组。

然后通过以下方式完成切片:

buf[4:134] # assuming buf is your numpy array from the previous step

如果内存有限,您还可以在初始创建numpy数组期间删除所有不必要的帧。

idx = 0
while (fc < frameCount  and ret):
    ret, tmp = cap.read()
    if fc in range(4, 135):
        buf[idx] = tmp
        idx += 1
    fc += 1
 类似资料:
  • null 我意识到如果人们愿意,他们可以找到许多工具来下载视频--所有我想做的是不要在视图源代码中显示到mp4文件的直接链接。 谢谢

  • 目前,我已经用Python实现了我的应用程序,可以通过USB读取相机帧。我使用Opencv,但对于分辨率为60fps和1920x1080的相机,我无法以这种速度捕捉图像。我尝试了一些东西:cv2。视频捕获(0,cv2.CAP_FFMPEG),但我无法捕获帧(捕获读取返回False)。请您提出任何解决方案或方法来提高整体速度,甚至在GPU中处理它们。 Opencv是从以下源代码构建的:

  • 对于熊猫数据帧的特定列,该列实际上是转换成BCD的16位数据。我只想提取特定行的14-8位并转换为BCD。下面的公式适用于如下的小数据帧。 但当我申请时 对于688126行的较大数据帧,我得到一个错误,说 基数为2的int()的文本无效:“” 错误如下所示 ValueError Traceback(最近调用最后一次)在1 df.LO_TIME_0_J2_0---- C:\ProgramData\A

  • 我需要读取一个yuv视频文件,从中提取单个帧,将其转换为灰度,然后计算相邻帧之间的卢卡斯·卡纳德光流。我最初使用的是mp4视频,这是我提取单个帧的代码: 现在有些事情改变了,我不得不使用yuv视频文件的数据集。但是当我给VideoCapture()一个yuv文件时,我会得到如下错误: [IMGUTILS@00000078A4Bee5C0]图片大小0x0无效[错误:0]全局C:\projects\o

  • 问题内容: 我正在使用Apache POI库,但是我有一些不想读取的数据-因此,我需要该程序才能从特定的行开始读取文件。 我想要来自第10行之后的单元格和行的所有数据,直到文档为空。我尝试了以下代码。 但这只会为我提供第10行中所有单元格的数据。 我期待收到您的来信:-)。 问题答案: 您仅从此处的第11行获取数据: 请参阅Sheet.getRow(int rownum) 的文档 返回基于0的逻辑

  • 问题内容: 可以说我有一个文本文件:data.txt(包含2000行) 如何从500-1500,然后从1500-2000读取给定的特定行,并显示特定行的输出? 此代码将读取整个文件(2000行) 如何修改上述代码以读取特定行? 问题答案: 我建议使用java.io.LineNumberReader。它扩展了BufferedReader,您可以使用它来获取当前行号 您还可以使用Java 7 ,如果适