使用OpenCV / C ++读取一系列帧

时间:2013-10-10 09:31:42

标签: opencv video-capture frames

我想使用openCV从任何文件夹中读取一系列帧。所有帧都按顺序排列,即(1).jpg,(2).jpg,.... 我试过了

VideoCapture cap;
cap.open("Directory/");
for(;;)
    {
        Mat frame;
        cap >> frame;
    }

但它不起作用。 之前已经问过这个问题,但我不知道为什么这个答案对我不起作用。

OpenCV: Reading image series from a folder

我是否需要重命名图像?。

3 个答案:

答案 0 :(得分:1)

上限应为cap.open("Directory/(%02d).jpg");,您必须重命名您的图片,使其看起来像(01).jpg(02).jpg等,以便它们具有固定的长度。如果图片类似于(001).jpg,那么您应该使用`cap.open("Directory/(%03d).jpg");

修改

#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
    VideoCapture cap;
    cap.open("imgs/(%02d).jpg");
    int i=0;
    for(;;)
    {
        if(i++%37==0)cap=VideoCapture("imgs/(%02d).jpg");//there are 37 frames in the dir
        Mat frame;
        cap >> frame;
        imshow("frame",frame);
        if(waitKey(1)==27)
            exit(0);
    }
    return 0;
}

答案 1 :(得分:0)

尝试按所需顺序准备一个xml / yaml文件,其中包含带有图像路径的名称列表。然后将列表作为向量或类似结构加载,然后逐个打开它们。

答案 2 :(得分:0)

这里的完整代码用matlab中的字符串连接思想读取一个名为“frame00000.jpg,frame00001.jpg,.....,frame00010.jpg ...”的五个零的帧序列。< / p>

#include "stdafx.h"
#include <stdlib.h>
#include <math.h>
#include <opencv/cv.h>      // include it to used Main OpenCV functions.
#include <opencv/highgui.h> //include it to use GUI functions.

using namespace std;
using namespace cv;

string intToStr(int i,string path){
    string bla = "00000";
    stringstream ss;
    ss<<i;
    string ret ="";
    ss>>ret;
    string name = bla.substr(0,bla.size()-ret.size());
    name = path+name+ret+".jpg";
    return name;
    }


int main(int, char**)
    {   
    string previous_window = "Previous frame";
    string current_window = "Current frame ";

    int i=0;
    for(int i = 1 ; i< 10 ; i++)
    {
        Mat Current, Previous;
        string Curr_name = intToStr(i,"D:/NU/Junior Scientist/Datasets/egtest04/frame");
        string Prev_name = intToStr(i-1,"D:/NU/Junior Scientist/Datasets/egtest04/frame");
        Current = imread(Curr_name,1);
        Previous = imread(Prev_name,1);

        namedWindow(current_window,WINDOW_AUTOSIZE);
        namedWindow(current_window,WINDOW_AUTOSIZE);
        imshow(current_window,Current);
        imshow(previous_window,Previous);
        waitKey(0);
    }
    }

“D:/ NU / Junior Scientist / Datasets / egtest04 / frame”是路径刺痛。