Search code examples
c++imageopencvimread

OpenCV - Load newest image from folder


I want to develop a PhotoBooth and for this, I want to display the last picture I have made with OpenCV in C++ on a Raspberry Pi. So when a new photo is in the source folder, this photo must be loaded. How can I load the newest photo?

My code until now. I load a specific image named "1.bmp", but I want to load with a non-specific name:

int main() 
{
    Mat image;
    image = imread("1.bmp");

    namedWindow( "Display", WINDOW_AUTOSIZE );
    imshow( "Display", image ); 

    waitKey(0); 
    return 0;
}

Thanks for your answers.


Solution

  • I am no C++ programmer, but this should give you a pretty good idea of how to do it:

    #include <iostream>
    #include <string>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    
    int main()
    {
       struct dirent *drnt;
       struct stat stbuf;
       DIR *dr;
    
       // Open the current directory 
       dr=opendir(".");
       long long newest=0;
       std::string name;
    
       // Iterate through directory entries 
       while (drnt=readdir(dr)){
    
          // stat the entry to get its type and age
          stat(drnt->d_name,&stbuf);
    
          // Check files only - not directories. You may want to do a strcmp() against "BMP" or "bmp" here
          if(S_ISREG(stbuf.st_mode)){
             long long ns=stbuf.st_mtimespec.tv_sec * 1000000000 + stbuf.st_mtimespec.tv_nsec;
             std::cout << drnt->d_name << ": " << ns << std::endl;
    
             // Note this puppy if newer than current newest
             if(ns>newest){
                newest=ns;
                name=drnt->d_name;
             }
          }
       }
       closedir(dr);
    
       // Output name of newest
       std::cout << name << std::endl;
    }