TimeLaps Video with a webcam

edited August 2017 in Share Your Work

/* Create Timelaps video with your web cam (on linux) this program capture .jpg files that have to be assemble with the Movie Maker tool in order to have moivie files.

dernie modif: 9 aout 2017 Version Linux Video temporel et un programme de PASCAL AUDET débuté en juin 2016 et continué en août 2017 il permet de faire a l'aide d'une simple Webcam des vidéo timelaps, il est possible d'ajuster l'intervalle entre les capture d'image et le nombre d'image enregistrer a chaque capture.

UTILISATION des fonction clavier -Barre d'espacement:........ Pour alterner entre le mode capture et le mode ajustement -Touche de 1 a 9:............Pour modifier le nombre d'image enregistré a chaque capture -Touche Fleche Haut et Bas:..Pour Augmenter et diminuer l'intervalle de temps entre les captures -Touche BackSpace:...........Pour afficher la derniere image captée. -Touche n et b:..............Pour changer la couleur du texte a l'écran

*/

    import processing.video.*;
    String CheminRepertoireFichiers="/home/user/timelaps/";//make sure to hare a directory to store the files
    int IntervalleCapture=10000;//intervalle de départ entre les captures
    int NBR_Image=2;//nombre d'image par capture
    int NRB_CaptureEffectue=0;
    int NRB_ImagesEnregistre=0;
    String debut="";
    long Timer_Intervalle;
    int numPixels;
    int[] backgroundPixels;
    Capture video;
    String DerniereImageCaptee="VIDE";
    boolean toggleDerniere=false;
    PImage img;
    boolean toggleLive=false;
    boolean showmessage=false;
    String file_name;
    String namePadding="00000";
    int seqNum=0;
    PImage derniere;

    //XXXXXXXXXXXXXXXXXXXX SETUP
    void setup() {
      size(640, 480); //640, 480
      //fullScreen();
      String[] cameras = Capture.list();
      if (cameras == null) {
        println("Failed to retrieve the list of available cameras, will try the default...");
        video= new Capture(this, 640, 480);
      } 
      if (cameras.length == 0) {
        println("There are no cameras available for capture.");
        exit();
      } 
      else {
        println("Available cameras:");
        printArray(cameras);
        //video=new Capture(this, width, height, cameras[0], 30);
        //video=new Capture(this, width, height, "HD Webcam C525", 30);//Modif PAscal
        video = new Capture(this, 640, 480,"/dev/video0",30);
        video.start();
        Timer_Intervalle=millis();
      }
      numPixels = video.width * video.height;
      backgroundPixels = new int[numPixels]; // Create array to store the background image
      // Make the pixels[] array available for direct manipulation
      loadPixels();
      textSize(15);
      debut=hour()+":"+minute();
    }

    //XXXXXXXXXXXXXXXXX  DRAW 
    void draw() {
      background(#D29A9A);
      if(toggleLive==true)
      {
          if (millis()-Timer_Intervalle>IntervalleCapture) // 
           {
              toggleDerniere=false;//pour déactiver automatiquement l'affichier de la derniere image capturée
              noTint(); // alpha 100%
              showmessage=false;
              NRB_CaptureEffectue=NRB_CaptureEffectue+1;
              for (int i=0;i<NBR_Image;i++)
              {
                if (video.available() == true) 
                {
                  video.read();
                } 
                image(video, 0, 0, width, height); // Draw the webcam video onto the screen
                seqNum=seqNum+1;
                switch (  str(seqNum).length())
                {
                case 1:
                  namePadding="00000"; 
                  break;
                case 2:
                  namePadding="0000"; 
                  break;
                case 3:
                  namePadding="000"; 
                  break;
                case 4:
                  namePadding="00"; 
                  break;
                case 5:
                  namePadding="0"; 
                  break;
                }  
                delay(50);
                file_name = ""+String.valueOf(year())+""+rajouteZero(month())+""+rajouteZero(day())+"_"+rajouteZero(hour())+""+rajouteZero(minute())+"-"+rajouteZero(second())  ;
               //pour débugger text(" "+file_name+"_"+namePadding+seqNum, 10, 10);  
                saveFrame(CheminRepertoireFichiers+file_name+"_"+namePadding+seqNum+".jpg");//modif Pascal
                DerniereImageCaptee=CheminRepertoireFichiers+file_name+"_"+namePadding+seqNum+".jpg";
               // println("=================",i,"=====================");
                NRB_ImagesEnregistre=NRB_ImagesEnregistre+1;
              }
              showmessage=true;
              Timer_Intervalle=millis();
            }//intervall    
      }//end  if(toggleLive==true)
       if (video.available() == true) 
        {
          video.read();
        } 
        image(video, 0, 0, width, height); // Draw the webcam video onto the screen
        if(showmessage==true)
        {
          text("== Capture Active ==  \nnbrImage: "+str(NBR_Image)+"\nintervalle secondes: "+str(IntervalleCapture/1000)+"\n\nDécompte avant la prochaine capture:", 10, 15);
          textSize(196); 
          text(""+ str( (IntervalleCapture-(millis()-Timer_Intervalle)) /1000),30,280);     
          textSize(16);
          text("Débuté à "+debut+"\nNombre de capture:"+str(NRB_CaptureEffectue)+"\nNombre d'image enregistrées: "+str(NRB_ImagesEnregistre)+"\n"+CheminRepertoireFichiers, 10, height-80);
        }
        if(toggleLive==false)
        {
          text("==Mode Ajustement (pas de capture)== \nnbrImage: "+str(NBR_Image)+" \nintervalle secondes: "+str(IntervalleCapture/1000)+" \n\n\n-Barre d'espacement: Alterner entre le mode capture et le mode ajustement\n-Touche de 1 a 9: Modifier le nombre d'image enregistré a chaque capture\n-Fleche Haut/Bas: Augmenter/diminuer l'intervalle de temps entre les captures\n-[BackSpace]: Afficher la derniere image captée.\n-Touche n et b: Changer la couleur du texte a l'écran", 10, 15);
          text("Débuté à "+debut+"\nNombre de capture:"+str(NRB_CaptureEffectue)+"\nNombre d'image enregistrées: "+str(NRB_ImagesEnregistre)+"\n"+CheminRepertoireFichiers, 10, height-80);
        }
       if(toggleDerniere)// pour affichier la derniere image capturée
        {  
          derniere = loadImage(DerniereImageCaptee);  
          image(derniere, 0, 0);
          text(DerniereImageCaptee,25,25);
       }
     }

    void keyPressed() 
    {
     if (key >= '0' && key <= '9') {
       NBR_Image = key - '0';
     }
      switch (keyCode)
      {
        case UP:
         IntervalleCapture=IntervalleCapture+1000;
         Timer_Intervalle=millis();
          break;
        case DOWN:
           IntervalleCapture=IntervalleCapture-1000;
           Timer_Intervalle=millis();
          break;
        case LEFT:
          break;
        case RIGHT:
          break;
      }
      if (IntervalleCapture<1000)IntervalleCapture=1000;
      if (IntervalleCapture>3600000)IntervalleCapture=3600000;//une heures
      switch (key)
      {
        case BACKSPACE: // 
        if(DerniereImageCaptee!="VIDE")//flag pour affichier la derniere image capturée
         {
          toggleDerniere=!toggleDerniere; 
          }
         break;
        case ' ': // activer la capture
          if (toggleLive ==false) 
          {
          toggleLive = true;
          Timer_Intervalle=millis();
          showmessage=true;
        } else {
          toggleLive = false;
          showmessage=false;
        }
          break;
       case 'n': // noir
          fill(0);
          break;  
        case 'b': //blanc
          fill(255);
          break;       
      }
    }

    String rajouteZero(int tmp)
    {
      String ret=str(tmp);
      if (ret.length()==1)
      {
        ret="0"+ret;
      }
      return ret;
}

Comments

  • edit post, highlight code, press ctrl-o to format.

  •     case '0':
         // NBR_Image=0;
          break;
        case '1':
          NBR_Image=1;
          break;
        case '2':
          NBR_Image=2;
          break;
        case '3':
          NBR_Image=3;
          break;
        case '4':
           NBR_Image=4;
          break;
        case '5':
           NBR_Image=5;
          break;
        case '6':
          NBR_Image=6;
          break;
        case '7':
           NBR_Image=7;
          break;
        case '8':
           NBR_Image=8;
          break;
        case '9':
           NBR_Image=9;
          break; 
    

    can be written as

    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      NBR_Image = key - '0';
      break;
    

    or, outside the switch()

    if (key >= '0' && key <= '9') {
      NBR_Image = key - '0';
    }
    
  • Tanks Koogs for your very good comments.

  • Here is an exemple of what you can do with this program:
    Click the image to see the video.

    W3Schools

Sign In or Register to comment.