1

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

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

但它不起作用。以前有人问过这个问题,但我不知道为什么这个答案对我不起作用。

OpenCV:从文件夹中读取图像系列

我需要重命名图像吗?

4

3 回答 3

1

cap open 应该是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;
}
于 2013-10-10T13:49:50.387 回答
0

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

于 2013-10-10T18:33:46.410 回答
0

这里完整的代码使用字符串连接的想法来读取名称为“frame00000.jpg, frame00001.jpg,.....,frame00010.jpg...) 的带有五个零的帧序列,就像 matlab 一样。

#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”是路径刺痛。

于 2013-10-21T08:46:13.657 回答