Linux Stopmotion

Importation

Dvgrab

 dvgrab --format jpeg --jpeg-overwrite --jpeg-temp dvtemp.jpeg --every 25 $IMAGEFILE & 

RĂ©glages vgrabbj pour la prise de vue

Pal :

# Commande de démarrage du démon
#
# Définition de 768x576 - rafraîchissement à 12 i/s 
vgrabbj -f $IMAGEFILE -d $VIDEODEVICE -b -D 0 -w 768 -H 576 -L250
# Idem avec retournement de l'image
vgrabbj -f $IMAGEFILE -d $VIDEODEVICE -b -D 0 -w 768 -H 576 -L250 -U -R
#
# Pour obtenir une résolution supérieure, remplacer '-w 768 -H 576' par l'un des réglages suivants :
#  -i <imagesize>
#              Sets the imagesize of input device, where imagesize is one of:
#
#               sqcif= 128x96,     qsif = 160x120,
#               qcif = 176x144,    sif  = 320x240,
#               cif  = 352x288,    vga  = 640x480,
#               svga = 800x600,    xga  = 1024x768,
#               sxga = 1280x1024,  uxga = 1600x1200,
#
# Commande d'arrêt du démon 
#
kill -9 $(pidof vgrabbj)

Exportation sans perte Mjpeg

Images brutes :

mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf scale=768:576 -mf type=jpg:fps=10 -o "$VIDEOFILE" "mf://$IMAGEPATH/*.jpg" 

Images avec modification des niveaux :

mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf eq2=1.0:1.0:0.0:1.05,scale=768:576 -mf type=jpg:fps=10 -o "$VIDEOFILE" "mf://$IMAGEPATH/*.jpg" 

Mencoder

HQ Pal Mjpeg 12 i/s

mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf scale=768:576 -mf type=jpg:fps=12 -o "$VIDEOFILE" "mf://$IMAGEPATH/*.jpg" 

2i/s

mencoder -ovc lavc -lavcopts vcodec=msmpeg4v2:vpass=1:$opt -mf type=jpg:fps=2 -o "$VIDEOFILE" "mf://$IMAGEPATH/*.jpg" 

HQ Pal Mjpeg Saturation +

mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf eq2=1.0:1.0:0.0:1.05,scale=768:576 -mf type=jpg:fps=8 -o "$VIDEOFILE" "mf://$IMAGEPATH/*.jpg" 

HQ Pal Mjpeg 24 i/s

mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf scale=768:576 -mf type=jpg:fps=24 -o "$VIDEOFILE" "mf://$IMAGEPATH/*.jpg" 

HQ HD Mjpeg 24 i/s

mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf scale=1920:1080 -mf type=jpg:fps=24 -o "$VIDEOFILE" "mf://$IMAGEPATH/*.jpg" 

Ffmpeg

x264 Lossless HD 12 i/s

ffmpeg -f image2 -i "/home/$USER/.stopmotion/tmp_hq/%06d.jpg" -r 8 -b 10000000 -s 1920x1080 -an -vcodec libx264 -preset slow -pix_fmt yuv420p $VIDEOFILE.avi 

Mjpeg Lossless HD 12 i/s

ffmpeg -f image2 -i "/home/$USER/.stopmotion/tmp_hq/%06d.jpg" -r 12 -b 10000000 -s 1920x1080 -an -vcodec mjpeg -preset slow -pix_fmt yuv420p $VIDEOFILE.avi 

Fichier de configuration

<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "/home/$USER/.stopmotion/preferences.xml" >
<root xml:lang="en" title="Preferences">
  <version version="0.8" />
  <preferences>
    <pref key="numberofimports" attribute="5" />
    <pref key="activedevice" attribute="0" />
    <pref key="numEncoders" attribute="15" />
    <pref key="activeEncoder" attribute="14" />
    <pref key="language" attribute="fr" />
    <pref key="numDevices" attribute="2" />
    <pref key="activeVideoDevice" attribute="0" />
    <pref key="mixcount" attribute="0" />
    <pref key="mostRecent" attribute="/home/$USER/blah.sto" />
    <pref key="secondMostRecent" attribute="/home/$USER/test_exp.sto" />
    <pref key="thirdMostRecent" attribute="/home/$USER/test/test.sto" />
    <pref key="fps" attribute="8" />
    <pref key="deviceName0" attribute="USB 2.0 Camera" />
    <pref key="deviceDescription0" attribute="*Autodetected* v4l2-device (/dev/video0)" />
    <pref key="device0" attribute="/dev/video0" />
    <pref key="deviceName1" attribute="fw" />
    <pref key="deviceDescription1" attribute="" />
    <pref key="device1" attribute="/dev/video0" />
    <pref key="importname0" attribute="Webcam" />
    <pref key="importdescription0" attribute="PAL - orientation normale" />
    <pref key="importprepoll0" attribute="" />
    <pref key="importstartdeamon0" attribute="vgrabbj -f $IMAGEFILE -d $VIDEODEVICE -b -D 0 -w 768 -H 576 -L150" />
    <pref key="importstopdeamon0" attribute="kill -9 `pidof vgrabbj` &amp;&amp; tar czf /home/$USER/.stopmotion/session-`date +%m-%d-%y_%H-%M`.tar.gz /home/$USER/.stopmotion/tmp_hq" />
    <pref key="importname1" attribute="Webcam mirroir" />
    <pref key="importdescription1" attribute="PAL - orientation inversee" />
    <pref key="importprepoll1" attribute="" />
    <pref key="importstartdeamon1" attribute="vgrabbj -f $IMAGEFILE -d $VIDEODEVICE -b -D 0 -w 768 -H 576 -L250 -U -R" />
    <pref key="importstopdeamon1" attribute="kill -9 `pidof vgrabbj`" />
    <pref key="importname2" attribute="Webcam" />
    <pref key="importdescription2" attribute="720p - orientation normale" />
    <pref key="importprepoll2" attribute="" />
    <pref key="importstartdeamon2" attribute="vgrabbj -f $IMAGEFILE -d $VIDEODEVICE -b -D 0 -w 1024 -H 768 -L150" />
    <pref key="importstopdeamon2" attribute="kill -9 `pidof vgrabbj`" />
    <pref key="importname3" attribute="Webcam" />
    <pref key="importdescription3" attribute="720p - orientation inversee" />
    <pref key="importprepoll3" attribute="" />
    <pref key="importstartdeamon3" attribute="vgrabbj -f $IMAGEFILE -d $VIDEODEVICE -b -D 0 -w 1024 -H 768 -L150 -U -R" />
    <pref key="importstopdeamon3" attribute="kill -9 `pidof vgrabbj`" />
    <pref key="importname4" attribute="DV" />
    <pref key="importdescription4" attribute="Capture DV" />
    <pref key="importprepoll4" attribute="" />
    <pref key="importstartdeamon4" attribute="dvgrab --format jpeg --jpeg-overwrite --jpeg-temp dvtemp.jpeg --every 25 $IMAGEFILE &amp;" />
    <pref key="importstopdeamon4" attribute="kill -9 `pidof vgrabbj`" />
    <pref key="encoderName0" attribute="Basse Qualite" />
    <pref key="encoderDescription0" attribute="Mpeg 4 - 10 i/s" />
    <pref key="startEncoder0" attribute="ffmpeg -r 10 -b 1800 -i &quot;$IMAGEPATH/%06d.jpg&quot; $VIDEOFILE.avi" />
    <pref key="stopEncoder0" attribute="" />
    <pref key="outputFile0" attribute="" />
    <pref key="encoderName1" attribute="Basse Qualite" />
    <pref key="encoderDescription1" attribute="Mpeg4 - 12i/s" />
    <pref key="startEncoder1" attribute="mencoder -ovc lavc -lavcopts vcodec=msmpeg4v2:vpass=1:$opt -mf type=jpg:fps=12 -o &quot;$VIDEOFILE&quot; &quot;mf://$IMAGEPATH/*.jpg&quot;" />
    <pref key="stopEncoder1" attribute="" />
    <pref key="outputFile1" attribute="" />
    <pref key="encoderName2" attribute="Haute qualite" />
    <pref key="encoderDescription2" attribute="Pal Mjpeg 12i/s" />
    <pref key="startEncoder2" attribute="mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf scale=768:576 -mf type=jpg:fps=12 -o &quot;$VIDEOFILE&quot; &quot;mf://$IMAGEPATH/*.jpg&quot;" />
    <pref key="stopEncoder2" attribute="" />
    <pref key="outputFile2" attribute="" />
    <pref key="encoderName3" attribute="Haute Qualite" />
    <pref key="encoderDescription3" attribute="HQ Pal - Mjpeg - Saturation + Contraste 12i/s" />
    <pref key="startEncoder3" attribute="mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf eq2=1.0:1.0:0.0:1.05,scale=768:576 -mf type=jpg:fps=12 -o &quot;$VIDEOFILE&quot; &quot;mf://$IMAGEPATH/*.jpg&quot;" />
    <pref key="stopEncoder3" attribute="" />
    <pref key="outputFile3" attribute="" />
    <pref key="encoderName4" attribute="Haute Qualite" />
    <pref key="encoderDescription4" attribute="HQ - Mjpeg 8i/s" />
    <pref key="startEncoder4" attribute="mencoder -ovc lavc -lavcopts vcodec=mjpeg -mf type=jpg:fps=8 -o &quot;$VIDEOFILE&quot; &quot;mf://$IMAGEPATH/*.jpg&quot;" />
    <pref key="stopEncoder4" attribute="" />
    <pref key="outputFile4" attribute="" />
    <pref key="encoderName5" attribute="Haute Qualite" />
    <pref key="encoderDescription5" attribute="HQ - Mjpeg 10i/s" />
    <pref key="startEncoder5" attribute="mencoder -ovc lavc -lavcopts vcodec=mjpeg -mf type=jpg:fps=10 -o &quot;$VIDEOFILE&quot; &quot;mf://$IMAGEPATH/*.jpg&quot;" />
    <pref key="stopEncoder5" attribute="" />
    <pref key="outputFile5" attribute="" />
    <pref key="encoderName6" attribute="Haute Qualite" />
    <pref key="encoderDescription6" attribute="HQ - Mjpeg 12i/s" />
    <pref key="startEncoder6" attribute="mencoder -ovc lavc -lavcopts vcodec=mjpeg -mf type=jpg:fps=12 -o &quot;$VIDEOFILE&quot; &quot;mf://$IMAGEPATH/*.jpg&quot;" />
    <pref key="stopEncoder6" attribute="" />
    <pref key="outputFile6" attribute="" />
    <pref key="encoderName7" attribute="Haute Definition" />
    <pref key="encoderDescription7" attribute="Upscale HD 1080i - HQ Mjpeg 12i/s" />
    <pref key="startEncoder7" attribute="mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf scale=1920:1080 -mf type=jpg:fps=12 -o &quot;$VIDEOFILE&quot; &quot;mf://$IMAGEPATH/*.jpg&quot;" />
    <pref key="stopEncoder7" attribute="" />
    <pref key="outputFile7" attribute="" />
    <pref key="encoderName8" attribute="------" />
    <pref key="encoderDescription8" attribute="Exportations des images HD ci-dessous" />
    <pref key="startEncoder8" attribute="" />
    <pref key="stopEncoder8" attribute="" />
    <pref key="outputFile8" attribute="" />
    <pref key="encoderName9" attribute="Haute Definition" />
    <pref key="encoderDescription9" attribute="Taille originale - Mjpeg 12 i/s" />
    <pref key="startEncoder9" attribute="mencoder &quot;mf:///home/$USER/.stopmotion/tmp_hq/*.jpg&quot; -mf type=jpg:fps=12 -o &quot;$VIDEOFILE&quot;.avi -ovc lavc -lavcopts vcodec=mjpeg" />
    <pref key="stopEncoder9" attribute="" />
    <pref key="outputFile9" attribute="" />
    <pref key="encoderName10" attribute="Haute Definition" />
    <pref key="encoderDescription10" attribute="Taille originale - Mjpeg 10 i/s" />
    <pref key="startEncoder10" attribute="mencoder &quot;mf:///home/$USER/.stopmotion/tmp_hq/*.jpg&quot; -mf type=jpg:fps=10 -o &quot;$VIDEOFILE&quot;.avi -ovc lavc -lavcopts vcodec=mjpeg" />
    <pref key="stopEncoder10" attribute="" />
    <pref key="outputFile10" attribute="" />
    <pref key="encoderName11" attribute="Haute Definition" />
    <pref key="encoderDescription11" attribute="Taille originale - Mjpeg 8 i/s" />
    <pref key="startEncoder11" attribute="mencoder &quot;mf:///home/$USER/.stopmotion/tmp_hq/*.jpg&quot; -mf type=jpg:fps=8 -o &quot;$VIDEOFILE&quot;.avi -ovc lavc -lavcopts vcodec=mjpeg" />
    <pref key="stopEncoder11" attribute="" />
    <pref key="outputFile11" attribute="" />
    <pref key="encoderName12" attribute="Haute Definition" />
    <pref key="encoderDescription12" attribute="1080i - Mjpeg 12 i/s" />
    <pref key="startEncoder12" attribute="mencoder &quot;mf:///home/$USER/.stopmotion/tmp_hq/*.jpg&quot; -mf type=jpg:fps=12 -vf scale=1920:1080 -o &quot;$VIDEOFILE&quot;.avi -ovc lavc -lavcopts vcodec=mjpeg " />
    <pref key="stopEncoder12" attribute="" />
    <pref key="outputFile12" attribute="" />
    <pref key="encoderName13" attribute="Haute Definition" />
    <pref key="encoderDescription13" attribute="1080i - Mjpeg 10 i/s" />
    <pref key="startEncoder13" attribute="mencoder &quot;mf:///home/$USER/.stopmotion/tmp_hq/*.jpg&quot; -mf type=jpg:fps=10 -vf scale=1920:1080 -o &quot;$VIDEOFILE&quot;.avi -ovc lavc -lavcopts vcodec=mjpeg " />
    <pref key="stopEncoder13" attribute="" />
    <pref key="outputFile13" attribute="" />
    <pref key="encoderName14" attribute="Haute Definition" />
    <pref key="encoderDescription14" attribute="1080i - Mjpeg 8 i/s" />
    <pref key="startEncoder14" attribute="mencoder &quot;mf:///home/$USER/.stopmotion/tmp_hq/*.jpg&quot; -mf type=jpg:fps=8 -vf scale=1920:1080 -o &quot;$VIDEOFILE&quot;.avi -ovc lavc -lavcopts vcodec=mjpeg " />
    <pref key="stopEncoder14" attribute="" />
    <pref key="outputFile14" attribute="" />
  </preferences>
</root>

Flux de travail avec RĂ©flex + Webcam

On utilise une webcam pour le live-view, et un réflexe numérique pour capturer les images en haute qualité. Un hack crado qui consiste à modifier les sources de LinuxStopMotion (LSM) pour appeler une commande externe lors de la capture d'une image.

DIY : Un live-view sur une Réflex numérique

On ajoute simplement une webcam dans le view-finder ( le viseur) ! Pour une meilleur image, on peut investir dans un angle de visée.

Source : http://ghonis2.ho8.com/rebelmodfocus2.html

On peut aussi disposer la webcam sur l'appareil pour avoir une vue approximative. l'inconvénient est qu'on à pas de retour sur la mise au point et autres réglages...

Webcam

Liveview complet

En utilisant une webcam, un morceau de gaine rétractable et un coude de visée, on peut créer un module qui vient se poser devant la fenêtre de visée de l'appareil. Avec un sabot manfrotto, on peut ajouter un axe vertical pour supporter le poid du module.

Il faut dans un premier temps adapter la webcam sur le coude de visée (dont on retire le caoutchouc ) à l'aide d'un morceau de gaine thermo rétractable. Dans notre cas, le diamètre du coude est de 30 mm environ. Avec de la gaine 28/6, ça tombe pile !

Liveview

On lance un logiciel de visualisation webcam genre guvcview ou cheese, et on essaye d'obtenir le meilleur résultat visuel possible ( on met le rond au milieu du carré). Quand on a le bon cadrage, un petit coup de chauffe avec un briquet ou un fer à souder, et ça devrait consolider tout ça.

Liveview

Une fois le module posé, il faut consolider le maintient de celui-ci si on ne veut pas qu'il se déplace imperceptiblement au cours de la prise de vue. Dans le cas présent, on a a disposition un sabot Manfrotto qui permet l'insertion d'un tube ou d'éléments de visserie auquel il sera possible d'ajouter un élastique ou un autre système de maintient.

Liveview

Liveview

Commande de prise de vue avec un réflex

Le fichier à exécuter est placé dans /usr/bin après avoir modifié la variable USER pour qu'elle corresponde au nom de l'utilisateur.

#!/bin/bash
# Dirty hack to include DLSR in a custom workflow with 
# a V4L device for live preview, and DLSR for HQ picture grabbing.
# You need to build linuxstopmotion after having modified the file
# "src/application/camerahandler.cpp" in order for the hook
# to be called when a picture is stored ( CameraHandler::storeFrame())

USER="FOO"
CAMERA_BRANCHEE=`gphoto2 --auto-detect | grep usb`
DOSSIER="/home/$USER"
DERNIERE_IMAGE=`ls -tr $DOSSIER/.stopmotion/tmp/ | tail -1`

# Premier hook : juste après la capture d'image, avant qu'elle soit stockée.
if [[ "$1" == "-capture" ]]; then
  echo "Capture"
# Deuxième hook, juste avant le stockage 
elif [[ "$1" == "-store" ]] && [[ "$CAMERA_BRANCHEE" != "" ]]; then
  echo "DLSR Camera plugged, storing picture..."
  gphoto2 --capture-image-and-download --force-overwrite --filename stopmotion.jpg
  cp $DOSSIER/stopmotion.jpg $DOSSIER/.stopmotion/tmp_hq/$DERNIERE_IMAGE
  cp $DOSSIER/.stopmotion/tmp_hq/$DERNIERE_IMAGE $DOSSIER/.stopmotion/tmp/
  mogrify -resize x576 $DOSSIER/.stopmotion/tmp/$DERNIERE_IMAGE
else # Si pas de Réflex branché, on utilise seulement la webcam.
  echo "No DLSR Camera plugged, using V4L device only."
fi

Appeler une commande externe lors de la capture d'une image

On modifie le fichier src/application/camerahandler.cpp dans les sources de LSM, puis on compile.

 $ diff src/application/camerahandler.cpp src/application/camerahandler.cpp.old 
 34,36d33      <   117d113 
 < system("lsm-hook -capture");   134,135d129 
 < system("lsm-hook -store");   < 

Modifs aux ligne 34, 35, 117 et 134.

/***************************************************************************
 *   Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad*
 *   bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com                    *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include "src/application/camerahandler.h"

#include "src/domain/domainfacade.h"
#include "src/foundation/preferencestool.h"
#include "graphics/icons/cameraoff.xpm"
#include "graphics/icons/cameraon.xpm"

#include <QImage>
#include <QInputDialog>
#include <QWhatsThis>
#include <QPixmap>

#include <vector>


// We add these in order to be able to use a system() call
#include <stdlib.h>
#include <stdio.h>


CameraHandler::CameraHandler ( QObject *parent, QStatusBar *sb, 
        ModelHandler* modelHandler, const char *name) 
    : QObject(parent), statusBar(sb), modelHandler(modelHandler)
{
    cameraButton = 0;
    frameView = 0;

    isCameraOn = false;
    sprintf(temp, "%s/.stopmotion/capturedfile.jpg", getenv("HOME") ); 

    timer = new QTimer(this);
    timer->setSingleShot(true);
    QObject::connect( timer, SIGNAL(timeout()), this, SLOT(storeFrame()) );
    setObjectName(name);
}


CameraHandler::~CameraHandler( )
{

}


void CameraHandler::setFrameView( FrameView * frameView )
{
    this->frameView = frameView;
}


void CameraHandler::setCameraButton( QPushButton *cameraButton )
{
    this->cameraButton = cameraButton;
}


bool CameraHandler::setViewMode(int mode)
{
    return frameView->setViewMode(mode);
}


void CameraHandler::cameraOn()
{
    DomainFacade::getFacade()->getFrontend()->showProgress("Connecting camera... ");
    cameraButton->setIcon( QPixmap(cameraoff) );
    isCameraOn = frameView->on();
    if (!isCameraOn) {
        cameraOff();
    }
    DomainFacade::getFacade()->getFrontend()->hideProgress();
}


void CameraHandler::cameraOff()
{
    cameraButton->setIcon( QPixmap(cameraon) );
    emit cameraStateChanged(false);
    frameView->off();
    isCameraOn = false;
    DomainFacade::getFacade()->setActiveFrame(DomainFacade::getFacade()->getActiveFrameNumber());
}


void CameraHandler::toggleCamera()
{
    if(isCameraOn == false) {
        Logger::get().logDebug("Playing video from webcam");
        cameraOn();
    }
    else {
        cameraOff();
    }
}


void CameraHandler::captureFrame()
{
    Logger::get().logDebug("Capturing image from webcam");
    timer->start(60);
        * Hook below !

    // First addition
    system("lsm-hook -capture"); 
}


void CameraHandler::storeFrame()
{
    QImage i;
    i.load(temp);
    if ( !i.isNull() ) {
        modelHandler->addFrame(temp);
        if (DomainFacade::getFacade()->getActiveFrameNumber() == 0) {
            emit capturedFrame();
        }
    }
    else {
        timer->start(60);
    }
    // Second addition 
    system("lsm-hook -store");

}


void CameraHandler::switchToVideoView()
{
    cameraButton->setEnabled(true);
    emit cameraStateChanged(true);
    DomainFacade::getFacade()->getFrontend()->hideProgress();
}


void CameraHandler::setMixCount(int mixCount)
{
    frameView->setMixCount(mixCount);

    switch( frameView->getViewMode() ) {
        case 0: 
        {
            PreferencesTool::get()->setPreference("mixcount", mixCount);
            break;
        }
        case 2:
        {
            PreferencesTool::get()->setPreference("playbackcount", mixCount);
            break;
        }
    }
}


bool CameraHandler::isCameraRunning()
{
    return isCameraOn;
}


void CameraHandler::setPlaybackSpeed(int playBackSpeed)
{
    frameView->setPlaybackSpeed(playBackSpeed);
}

Exporter les images HD de l'appareil vers une vidéo

Il suffit d'ajouter dans les paramètres de Stopmotion les réglages d'exporations suivants :

Penser à modifier le paramètre fps=12 qui correspond au nombre d'image par seconde.

Exportation des images Ă  la taille originale
mencoder "mf://$IMAGEPATH/*.jpg" -mf type=jpg:fps=12 -o "$VIDEOFILE".avi -ovc lavc -lavcopts vcodec=mjpeg 
Exportation au format HD 1080p
mencoder "mf://$IMAGEPATH/*.jpg" -mf type=jpg:fps=12 -vf scale=1920:1080 -o "$VIDEOFILE".avi -ovc lavc -lavcopts vcodec=mjpeg 

Liens

www.linuxsopmotion.org

https://launchpad.net/lsm

Set d'icĂ´nes :

Sous CC-3-Nc-By-Sa : http://bambou.viens.la/autres/lsm-icon-set.svg