我想使用openCV从任何文件夹中读取一系列帧。所有帧都按顺序排列,即(1).jpg,(2).jpg,.... 我试过了
VideoCapture cap;
cap.open("Directory/");
for(;;)
{
Mat frame;
cap >> frame;
}
但它不起作用。 之前已经问过这个问题,但我不知道为什么这个答案对我不起作用。
OpenCV: Reading image series from a folder
我是否需要重命名图像?。
答案 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”是路径刺痛。