Forum général.cherche-logiciel Transformer une vidéo de travelling en photo panoramique ?

Posté par  (site web personnel, Mastodon) . Licence CC By‑SA.
7
20
août
2026

Salut,

Existe-t-il une méthode/un logiciel pour transformer une vidéo de travelling en photo panoramique ?

Si je fait une vidéo d'un trajet en train avec ma caméra (mon ordiphone en fait) collé à la vitre est-ce que je peux convertir cette vidéo en une image panoramique de tout le trajet ?

  • # C'est déjà pas facile avec un scanner industriel bidouillé, alors le faire avec un ordiphone...

    Posté par  (Mastodon) . Évalué à 5 (+3/-0). Dernière modification le 20 août 2026 à 10:41.

    Quelqu'un s'est déjà amusé à faire des photos panoramiques depuis un train, mais en bidouillant un scanner industriel qui simplifie la tâche d'acquisition des données en amont (Une seule image unique sur tout le trajet au lieu d'une séquence comme pour les vidéos).

    C'est déjà assez technique pour obtenir des photos regardables même avec du post-traitement logiciel, alors le faire avec un ordiphone qui n'est pas conçu pour des photos panoramiques à la base… Outre le problème de stabilisation de l'objectif en cours de trajet, c'est le post-traitement des séquences d'image qui va être un gros casse-tête (par exemple, les effets de perspective entre le premier plan et le reste donneront des images incohérentes quand on assemble naïvement les photos bout-à-bout).

  • # vid2pano.py

    Posté par  (site web personnel) . Évalué à 10 (+9/-0).

    Salut,

    J'ai déjà fait ça avec succès, inspiré par ce post StackOverflow qui correspond exactement à ta demande :

    La réponse propose une solution en pur Python avec OpenCV. Je l'utilise moi-même et ça fonctionne plutôt bien, même depuis une vidéo prise au smartphone.

    Voici mon adaptation : un script unique qui prend une vidéo en entrée, extrait les frames significatives (via détection de keypoints ORB) et les assemble en panorama.

    Installation :

    pip install opencv-python numpy

    vid2pano.py :

    #!/usr/bin/env python3
    # https://stackoverflow.com/a/66378715
    import cv2
    import numpy as np
    import os
    import shutil
    import argparse
    
    # rescale the images (1.00 = original / 0.5 = half size)
    def rescale(img):
        scale = 1.00
        h, w = img.shape[:2]
        h = int(h * scale)
        w = int(w * scale)
        return cv2.resize(img, (w, h))
    
    # decimate function
    def decimate(input_file):
        # delete and create directory
        folder = "frames/"
        if os.path.isdir(folder):
            shutil.rmtree(folder)
        os.mkdir(folder)
    
        # open vidcap
        cap = cv2.VideoCapture(input_file)
        counter = 0
    
        # make an orb feature detector and a brute force matcher
        orb = cv2.ORB_create()
        bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=False)
    
        # store the first frame
        _, last = cap.read()
        last = rescale(last)
        cv2.imwrite(folder + str(counter).zfill(5) + ".png", last)
    
        # get the first frame's stuff
        kp1, des1 = orb.detectAndCompute(last, None)
    
        # cutoff, the minimum number of keypoints
        cutoff = 50
    
        # count number of frames
        prev = None
        while True:
            # get frame
            ret, frame = cap.read()
            if not ret:
                break
    
            # resize
            frame = rescale(frame)
    
            # count keypoints
            kp2, des2 = orb.detectAndCompute(frame, None)
    
            # match
            matches = bf.knnMatch(des1, des2, k=2)
    
            # lowe's ratio
            good = []
            for m, n in matches:
                if m.distance < 0.5 * n.distance:
                    good.append(m)
    
            # check against cutoff
            print(len(good))
            if len(good) < cutoff:
                # swap and save
                counter += 1
                last = frame
                kp1 = kp2
                des1 = des2
                cv2.imwrite(folder + str(counter).zfill(5) + ".png", last)
                print("New Frame: " + str(counter))
    
            # show
            cv2.imshow("Frame", frame)
            cv2.waitKey(1)
            prev = frame
    
        # also save last frame
        counter += 1
        cv2.imwrite(folder + str(counter).zfill(5) + ".png", prev)
    
        # check number of saved frames
        print("Counter: " + str(counter))
    
    # stitcher function
    def stitcher():
        # target folder
        folder = "frames/"
    
        # load images
        filenames = os.listdir(folder)
        images = []
        for file in filenames:
            # get image
            img = cv2.imread(folder + file)
    
            # save
            images.append(img)
    
        # use built in stitcher
        stitcher = cv2.Stitcher_create()
        (status, stitched) = stitcher.stitch(images)
        cv2.imwrite("result.png", stitched)
    
    # main function
    def main():
        parser = argparse.ArgumentParser(description="Process a video file.")
        parser.add_argument('-input', type=str, required=True, help='Input video file')
        args = parser.parse_args()
    
        decimate(args.input)
        stitcher()
    
    if __name__ == "__main__":
        main()

    Utilisation :

    python vid2pano.py -input ma-video.mp4

    Le résultat est dans result.png. Le paramètre cutoff (par défaut 50) contrôle le nombre de keypoints minimum pour considérer qu'une frame est suffisamment différente de la précédente — à ajuster selon ta vidéo.

    wind0w$ suxX, GNU/Linux roxX!

    • [^] # Re: vid2pano.py

      Posté par  (site web personnel, Mastodon) . Évalué à 3 (+1/-0).

      Merci !

      C'est exactement ce que je cherchais.

      Par contre j'ai fait des tests de vidéo-traveling dans le train et ça ne marche pas :(

      Ça ne peut pas vraiment marcher en fait. Il y a trop de plans différents, entre la montagne au fond, les champs entre et les haies d'arbres qui passent juste devant, il n'est pas vraiment possible de faire un panoramique de tout le front des Vosges de cette manière.

      Du coup j'ai juste mitraillé quelques photos plus ou moins floues: https://www.fabienm.eu/uncolmarien/2026/08/22/alsace-cramee/

      J'ai plus qu'une balle

      • [^] # Re: vid2pano.py

        Posté par  (site web personnel) . Évalué à 4 (+3/-0).

        Tu as bien diagnostiqué le problème : parallaxe. Quand le premier plan (les haies) défile beaucoup plus vite que l'arrière-plan (la montagne), les couches ne s'alignent plus et l'assemblage est perdu d'avance.

        Deux pistes si tu retentes un jour : soit recadrer sur la montagne uniquement (en éliminant les haies du champ), soit faire le travelling depuis un point fixe en pivotant lentement l'appareil (0-360°) c'est là que ça marche le mieux.

        Sinon tes photos floues ont un charme particulier, on sent la vitesse du train ; )

        wind0w$ suxX, GNU/Linux roxX!

        • [^] # Re: vid2pano.py

          Posté par  . Évalué à 7 (+4/-0).

          recadrer sur la montagne uniquement

          Du coup je ne vois pas vraiment l'intérêt; à moins de filmer très très longtemps depuis un pont de 50 km, tu ne pourras jamais avoir une photo panoramique de la montagne, tu filmeras toujours la même montagne sous le même angle.

          faire le travelling depuis un point fixe en pivotant lentement l'appareil (0-360°)

          Ça semble assez opposé à ce qu'on appelle généralement un travelling, qui, selon Wikipédia, implique un déplacement de la caméra (et pas une rotation, qu'on appelle "panoramique").

          Tout ça répond en fait à la question. Un panoramique est ce qu'on obtient en faisant tourner l'objectif. C'est comme ça qu'on peut avoir une photo à 360°. La technique décrite pour reconstituer une longue bande lors d'un travelling est un "slit scan"; il faut juxtaposer une bande verticale de pixels la plus fine possible (il faut donc que le nombre de photos par seconde soit élevé par rapport à la vitesse de déplacement). C'est ce qu'on a avec un scanner ou une photo finish. (https://scannoramic.net/ pour des exemples). Si la vitesse d'obturation est bonne, tout est net, mais l'arrière-plan est très étiré horizontalement.

          Bref, il est mécaniquement impossible de reconstituer un paysage similaire à ce qu'on voit à l'oeil nu avec un slit scan, à cause du parallaxe. L'axe horizontal n'est pas un axe d'espace, mais un axe de temps; on peut calibrer la vitesse de déplacement et la fréquence de prise de vue pour ne pas avoir de distorsion à une certaine distance de nous, mais il restera la distorsion sur tous les autres plans. En gros, si on va à 1 m/s et qu'on prend 100 images de 1px de large par seconde, il va y avoir une distance de nous où 1px fera 1 cm : c'est à cette distance là qu'on n'aura pas de distorsion, et qu'un cercle sera un cercle, par exemple, et pas une ellipse. Plus près de nous, on verra une ellipse allongée vers le haut, et plus loin, l'ellipse sera allongée horizontalement, jusqu'à devenir une bande horizontale à l'arrière plan. L'illusion ne peut donc fonctionner que si le train longe quelque chose de vertical (un mur?) assez proche.

          Par contre on peut probablement faire beaucoup mieux que le site que j'ai mis en lien, en utilisant des méthodes de correction d'image.

          • [^] # Re: vid2pano.py

            Posté par  (site web personnel) . Évalué à 3 (+2/-0).

            Merci à toi pour ces explications concernant les limitations du script et le vocabulaire technique qu'il me manquait.

            wind0w$ suxX, GNU/Linux roxX!

      • [^] # Re: vid2pano.py

        Posté par  . Évalué à 2 (+1/-0). Dernière modification le 26 août 2026 à 19:38.

        Je te confirme : vu d'ici, depuis Mulhouse jusqu'au fond de la vallée de Saint-Amarin, tout est cramé !
        Mes fruitiers font salement la gueule, les feuillus font leur automne, les résineux sont "out", tous justes bons à servir de pâture au scolyte, et le sol est craquelé de fou, y compris en plaine !

        Mais, si tu cherches un coin où faire des photos sympathiques de nos montagnes….. -> MP

        (tes photos sont cool !)

        • [^] # Re: vid2pano.py

          Posté par  (site web personnel, Mastodon) . Évalué à 2 (+0/-0).

          Tiens, un voisin ;)

          Depuis le temps que je cause sur ce site par contre je ne sais pas comment faire un MP !

          Même pas sur que ça soi possible si ?

          J'ai plus qu'une balle

          • [^] # Re: vid2pano.py

            Posté par  (site web personnel, Mastodon) . Évalué à 5 (+2/-0). Dernière modification le 26 août 2026 à 23:17.

            C'est pas possible. Les seules façons de procéder dépendent des renseignements du profil :

            1. la case "Afficher publiquement son adresse de courriel" est cochée (je l'ai fait provisoirement une fois, je déconseille de garder l'option toujours cochée),
            2. il y a une adresse XMPP,
            3. il y a un site personnel qui a une page de contact,
            4. ou encore une adresse de compte Mastodon.

            Bref directement via LinuxFR, impossible.

            Grosso modo, cyberjunkie pourrait te contacter via Mastodon (à supposer qu'il s'inscrive sur une instance, etc.) ou via ton site (si c'est bien le tiens), en l'état, l'inverse n'est pas possible.

            Je n’ai aucun avis sur systemd

  • # Hackaday en parle

    Posté par  (site web personnel, Mastodon) . Évalué à 2 (+0/-0).

    Tiens hackaday parle de ça aujourd'hui : https://hackaday.com/2026/08/28/panoramic-photography-with-a-linear-scanner/

    J'ai plus qu'une balle

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.