读取视频帧循环每次往前走300帧

obj = VideoReader(fileName);

numFrames = obj.NumFrames;%帧的总数

%读取帧数据

for k = 1:300  

end
下面是其他计算的代码,得到结果。



for后面的k=1:300是读取视频帧,这个for循环 第一次是读取1:300帧。
怎么能让它每次往前走300帧呢
下一次再运行300:600帧,然后运行下面的代码,保存一次结果。
下一次 600:900帧,然后运行下面的代码,保存一次结果。
下一次 900:1200帧,然后运行下面的代码,保存一次结果

~~~~~~~
一直到3600帧

望采纳


可以使用for循环的嵌套来实现这个需求。代码如下:

obj = VideoReader(fileName);
numFrames = obj.NumFrames;%帧的总数

%读取帧数据
for k = 1:300:numFrames %循环每次往前走300帧
for i = k : k + 299 %读取每个区间内的帧
frame = read(obj, i);
%其他计算代码
end
%保存结果
end

代码在外层循环中定义了每次循环时要读取的帧的区间,然后在内层循环中进行实际的读取操作。每次内层循环完成后,就可以保存计算结果。这样,您就可以通过控制循环次数来读取所有帧并进行相应的计算操作。

需要注意的是,由于这段代码中定义的循环次数为numFrames / 300,因此如果numFrames不是300的倍数,那么最后一次循环可能会读取到不完整的帧区间。因此,如果希望读取所有帧,那么需要对numFrames取模,使得循环次数为整数。修改后的代码如下:

obj = VideoReader(fileName);
numFrames = obj.NumFrames;%帧的总数

%读取帧数据
for k = 1:300:numFrames - mod(numFrames, 300) %循环每次往前走300帧
for i = k : k + 299 %读取每个区间内的帧
frame = read(obj, i);
%其他计算代码
end
%保存结果
end

您可以使用以下代码来实现您的需求:

% 创建 VideoReader 对象
obj = VideoReader(fileName);

% 获取视频的帧数
numFrames = obj.NumFrames;

% 读取帧数据
for k = 1:300:numFrames-300 % 从 1 到 numFrames,每次跳 300 帧
    frames = read(obj, [k k+300]); % 读取 k 到 k+300 帧的帧数据
    % 对 frames 处理
    % 保存处理后的结果
end

在上面的代码中,您需要将 fileName 替换为您的视频文件的路径。在循环中,每次迭代时都会读取下一组 300 帧的视频帧数据,并对这些帧进行处理。您可以在循环内部添加您的图像处理代码,并保存处理后的结果。

如有帮助,望采纳

#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
    VideoCapture cap("E:\\图片\\视频材料\\AVSEQ01.avi");// open the default camera
    if(!cap.isOpened()) // check if we succeeded
    return -1;
    namedWindow("src");
    for( ; ; )
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        imshow("src", frame);
        if(waitKey(30) >= 0) 
            break;
    }
    return 0;
}


提供方法和思路实例,链接:https://blog.csdn.net/liyuqian199695/article/details/50245805