2

我现在正在 OpenCV 中尝试 BackgroundSubtractorMOG 和 BackgroundSubtractorMOG2,我想尝试 jpg 图像序列作为我的帧源

frame = imread("C:\images\001-capture.jpg");
    if(!frame.data){
    //error in opening the first image
    cerr << "Unable to open first image frame: " << fistFrameFilename << endl;
    //exit(EXIT_FAILURE);
}

还因为当我使用 VideoCapture 访问我的 .avi 视频剪辑时出现错误。

VideoCapture capture("C:\movie1.avi");
if(!capture.isOpened()){
    //error in opening the video input
    cerr << "Unable to open video file: " << videoFilename << endl;
    exit(EXIT_FAILURE);
}
//read input data. ESC or 'q' for quitting
while( (char)keyboard != 'q' && (char)keyboard != 27 ){
//read the current frame
if(!capture.read(frame)) {
  cerr << "Unable to read next frame." << endl;
  cerr << "Exiting..." << endl;
  exit(EXIT_FAILURE);
}
4

4 回答 4

4
  • 尝试 VideoCapture capture("C:/movie1.avi"); // 使用单“/”或双“\”!
  • VideoCapture 也可以读取图像序列,如果它们编号正确:

    VideoCapture capture("C:/images/%3d-capture.jpg"); // 顺便说一句,与上面相同的斜线概率

于 2013-11-09T16:32:29.453 回答
2

@berak所说的 VideoCapture 方法是正确的;虽然我在使用它时不可避免地遇到了问题。在阅读连续图像时,我总是更喜欢下面所述的更直接的方法。它使您可以更好地控制遍历数据的方式,同时不限制您的速度。

char* Dataset_Dir( "C:/Data/" ); // Or take it from argv[1]
cv::Mat normal_matrix;
std::vector<cv::Mat>* image_stack;
for( int i=1; i<=endNumber; ++i )
{
    // Gives the entire stack of images for you to go through
    image_stack->push_back(cv::imread(std::format("%s/%03d-capture.png", Dataset, i), CV_LOAD_IMAGE_COLOR)); 

    normal_matrix = cv::imread(std::format("%s/%03d-capture.png", Dataset, i), CV_LOAD_IMAGE_COLOR);
}
于 2013-11-09T18:17:58.847 回答
1

我已经尝试过这段代码cv::VideoCapture cap("G:/var/cache/zoneminder/events/1/13/10/21/07/50/00/%3d-capture.jpg");并且它有效。图像文件的文件名中应该有越来越多的数字,以便按顺序读取。

于 2013-11-10T09:39:23.463 回答
-1

脚步:

  1. 将文件夹的路径存储在文本文件 /home/user/Desktop/Test/train.txt 中
  2. 我的文本文件有条目:

    /home/user/Desktop/Test/001.ak47/001_ /home/user/Desktop/Test/002.american-flag/002_ /home/user/Desktop/Test/007.bat/007_ /home/user/Desktop /Test/014.blimp/014_ /home/user/Desktop/Test/022.buddha-101/022_

  3. sprintf(path,"%s%04d.jpg",name,i);部分代码会附加文件名。001_0001.jpg我的文件是文件夹001.ak47等格式

  4. 该代码从每个文件夹中读取 20 张图像并显示出来。

     int main ()
        {
               ifstream file("/home/user/Desktop/Test/train.txt");
               string temp;
               string string2;
               int count = 0; // number of folders
                   int number_of_folders = 5 ;
                   char name[70];
               char path[70];
               while(count != number_of_folders)
               {
                    getline(file, temp); // read first line of folder             //basically path to first folder
                    int i=1;
                    strcpy(name, temp.c_str());
    
                    while(1)
                  {
    
                    sprintf(path,"%s%04d.jpg",name,i);
                    Mat src= imread(path,1);
    
                     if(!src.data || src.rows == 0 ||  i == 21 ) break;        //use only 20 images for training
                    imshow("src",src);
                    i++;
                    waitKey();
    
                   }
    
    
                    count = count+1 ;
                    if(count == number_of_folders)
                        break;
               }
             file.close();
             return(0);
        }
    
于 2015-05-27T15:13:25.253 回答