MATCH-N-SHIFT(1)
π MATCH-N-SHIFT(1) π
okay bestie, gather round, because this one is literally the glow-up your photo folder has been waiting for. we're talking about match-n-shift, a lil User Contributed Perl script that takes your sad little pile of photos and turns them into a hugin .pto project. no cap. it's giving panorama pipeline and i'm obsessed π
β¨ NAME β¨
match-n-shift β generate a Hugin .pto project from a list of photos π¦
πΈ SYNOPSIS πΈ
match-n-shift [options] --output project.pto image1 image2 [...]
like, that's the whole vibe. options go here:
Options:
-o | --output name Filename of created panorama project
-i | --input name Filename of CSV file specifying input images (optional, see below)
-f | --projection Panotools style input projection number. Use
0 for rectilinear (default), 2 for circular fisheye and
3 for full-frame fisheye images. Note, this has to be
specified for fisheye lenses as this can't be determined
from EXIF metadata
-v | --fov Horizontal field of view in degrees, this value is
only used if FoV can't be determined from EXIF
metadata, defaults to 50
-k | --selection Crop selection boundary, eg -459,2459,-57,2861
-l | --linkstacks Hard link positions of stacked photos.
-a | --align Generate control points (default no).
-h | --help Outputs help documentation.
Deprecated options (have no effect when using cpfind):
-s | --size number Downsize images until width and height is
smaller than number, default 1600
-p | --points number Number of generated control points between,
each pair, default: 25
-n | --noransac No ransac detection, useful for fisheye images
-r | --refine Refine the found control points using the
original images, delete unrefinable.
π OPTIONS π
-o,--outputname β the filename of the panorama project it's gonna create for you. this is your main character output file, periodt π-i,--inputname β filename of a CSV file specifying your input images. it's optional, and the deets are down in DESCRIPTION, iykyk π-f,--projectionβ panotools-style input projection number. use0for rectilinear (default),2for circular fisheye, and3for full-frame fisheye images. β οΈ note: you have to specify this for fisheye lenses, because it literally cannot be figured out from EXIF metadata. the metadata said nothing, bestie, nothing π-v,--fovβ horizontal field of view, in degrees. this value only gets used if FoV can't be determined from EXIF metadata. defaults to50. she's a fallback queen π-k,--selectionβ crop selection boundary, eg-459,2459,-57,2861βοΈ-l,--linkstacksβ hard link positions of stacked photos. keep the stack together, bestie, no drifting apart π-a,--alignβ generate control points (default no). note the default is a big fat no π-h,--helpβ outputs help documentation. the classic cry for help, love that for us π
π Deprecated options (have no effect when using cpfind)
these ones are retired. not evil, just⦠irrelevant when you're using cpfind. still listing them because the facts stay facts, periodt.
-s,--sizenumber β downsize images until width and height is smaller than number, default1600-p,--pointsnumber β number of generated control points between each pair, default:25-n,--noransacβ no ransac detection, useful for fisheye images-r,--refineβ refine the found control points using the original images, delete unrefinable.
π DESCRIPTION π
match-n-shift takes a list of image files and creates a hugin-compatible project file β optionally containing control points linking the images together, though there are better ways of doing this. (not me being honest about my own limitations, character growth β¨)
as much information as possible is extracted from photo EXIF data. so photo orientation, exposure, angle of view and white balance will all be initialised if possible. the metadata is doing the heavy lifting and we're just here to say thank you π«Ά
an optional input file can be chosen with the --input option. this can be a simple list of photo filenames, or full paths, one per line:
DSC_0001.JPG
DSC_0002.JPG
DSC_0003.JPG
DSC_0004.JPG
..or a CSV file specifying "filename, yaw, pitch, roll" (in degrees):
DSC_0001.JPG,0,20,90
DSC_0002.JPG,90,-20,90
DSC_0003.JPG,180,20,90
DSC_0004.JPG,-180,-20,90
..or optionally specify XYZ translation parameters as well:
DSC_0001.JPG, 0, 20, 0, 0.5, 0.0, 1.0
DSC_0002.JPG, 0, 20, 0, 1.4, 0.0, 1.0
DSC_0003.JPG, 0, 20, 0, 2.3, 0.0, 1.0
DSC_0004.JPG, 0, 20, 0, 3.2, 0.0, 1.0
if the roll field is omitted then it will be set to zero or any value obtainable from EXIF data. similarly, if the pitch field is omitted then pitch will be set to zero. so this should also work:
DSC_0001.JPG,0
DSC_0002.JPG,90
DSC_0003.JPG,180
DSC_0004.JPG,-180
see? flexible. we love a format that meets you where you're at π§
π LICENSE π
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. slay, legally speaking π
π₯ SEE ALSO π₯
<http://hugin.sourceforge.net/>
go click it, bestie, the lore is there π
β AUTHOR β
Bruno Postle β February 2008.
and that's the whole page, babes π this doc shipped with perl v5.42.0 and it's dated 2025-07-25 β so yeah, still iconic after all these years πΈ bye pookie, go make a panorama π¦
π¦ where this page comes from
- fedora 43: perl-Panotools-Script 0.29-20.fc43 Β· GPL-2.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms