From: <bru...@us...> - 2008-11-18 21:57:52
|
Revision: 910 http://panotools.svn.sourceforge.net/panotools/?rev=910&view=rev Author: brunopostle Date: 2008-11-18 21:57:48 +0000 (Tue, 18 Nov 2008) Log Message: ----------- Only trace image outline if --trace specified Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/tif2svg Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-10-22 18:23:20 UTC (rev 909) +++ trunk/Panotools-Script/Changes 2008-11-18 21:57:48 UTC (rev 910) @@ -4,6 +4,7 @@ - Centre() method to try and place images in middle of the panorama - new tool ptocentre - panostart rules for building qtvr, mercator, planet views etc... + - tif2svg only trace outlines if --trace option given 0.19 - add pafextract to MANIFEST Modified: trunk/Panotools-Script/bin/tif2svg =================================================================== --- trunk/Panotools-Script/bin/tif2svg 2008-10-22 18:23:20 UTC (rev 909) +++ trunk/Panotools-Script/bin/tif2svg 2008-11-18 21:57:48 UTC (rev 910) @@ -33,6 +33,7 @@ for my $index (0 .. (scalar (@files) - 1)) { + next unless grep (/--trace/, @args); # extract an alpha channel and convert to SVG my $tiff = File::Spec->rel2abs ($files[$index]); my $stub = File::Spec->catfile ($tempdir, $index); @@ -95,9 +96,11 @@ =head1 DESCRIPTION Takes a list of TIFF files and assembles an SVG file with each TIFF referenced -on a separate layer. Alpha channels are traced with 'autotrace' and this -vector path is inserted as clip paths. +on a separate layer. +If the --trace option is given, alpha channels are traced with 'autotrace' and +this vector path is inserted as clip paths. + Typically, multiple TIFF output is generated by hugin/nona, instead of adjusting alpha channels for enblend, this tool allows the masks to adjusted in Inkscape instead. The saved SVG file can be blended with 'enblend-svg'. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-11-18 23:47:05
|
Revision: 911 http://panotools.svn.sourceforge.net/panotools/?rev=911&view=rev Author: brunopostle Date: 2008-11-18 23:46:59 +0000 (Tue, 18 Nov 2008) Log Message: ----------- ptopeek and ptopoke tools to query and set global project parameters Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/Makefile.PL Added Paths: ----------- trunk/Panotools-Script/bin/ptopeek trunk/Panotools-Script/bin/ptopoke Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-11-18 21:57:48 UTC (rev 910) +++ trunk/Panotools-Script/Changes 2008-11-18 23:46:59 UTC (rev 911) @@ -5,6 +5,7 @@ - new tool ptocentre - panostart rules for building qtvr, mercator, planet views etc... - tif2svg only trace outlines if --trace option given + - ptopeek and ptopoke tools to query and set global project parameters 0.19 - add pafextract to MANIFEST Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2008-11-18 21:57:48 UTC (rev 910) +++ trunk/Panotools-Script/MANIFEST 2008-11-18 23:46:59 UTC (rev 911) @@ -23,6 +23,8 @@ bin/ptoinfo-gui bin/ptomerge bin/ptopath +bin/ptopeek +bin/ptopoke bin/ptosort bin/ptosplit bin/qtvr2erect Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2008-11-18 21:57:48 UTC (rev 910) +++ trunk/Panotools-Script/Makefile.PL 2008-11-18 23:46:59 UTC (rev 911) @@ -4,8 +4,8 @@ WriteMakefile( 'NAME' => 'Panotools::Script', 'EXE_FILES' => [ 'bin/cubic2erect', 'bin/erect2cubic', 'bin/pafextract', - 'bin/jpeg2qtvr', 'bin/erect2qtvr', 'bin/enblend-mask', 'bin/match-n-shift', - 'bin/process-masks', 'bin/erect2planet', 'bin/pto2tiff', 'bin/ptograph', + 'bin/jpeg2qtvr', 'bin/erect2qtvr', 'bin/enblend-mask', 'bin/match-n-shift', 'bin/ptopoke', + 'bin/process-masks', 'bin/erect2planet', 'bin/pto2tiff', 'bin/ptograph', 'bin/ptopeek', 'bin/tif2svg', 'bin/enblend-svg', 'bin/pto2fulla', 'bin/ptoinfo', 'bin/ptopath', 'bin/qtvr2erect-gui', 'bin/tif2svg-gui', 'bin/ptoinfo-gui', 'bin/ptosort', 'bin/process-masks-gui', 'bin/enblend-svg-gui', 'bin/erect2qtvr-gui', 'bin/ptoclean', Added: trunk/Panotools-Script/bin/ptopeek =================================================================== --- trunk/Panotools-Script/bin/ptopeek (rev 0) +++ trunk/Panotools-Script/bin/ptopeek 2008-11-18 23:46:59 UTC (rev 911) @@ -0,0 +1,72 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; +use Getopt::Long; +use Pod::Usage; + +my $help = 0; +my $p; +my $m; +my $o; + +GetOptions ('p|panorama=s' => \$p, + 'm|mode=s' => \$m, + 'o|option=s' => \$o, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; + +my $path_pto = shift || pod2usage; +die "Can't find $path_pto" unless -e $path_pto; + +my $pto = new Panotools::Script; +$pto->Read ($path_pto); + +print $pto->Panorama->{$p} . "\n" + if (defined $p and defined $pto->Panorama->{$p}); + +print $pto->Mode->{$m} . "\n" + if (defined $m and defined $pto->Mode->{$m}); + +print $pto->Option->{$o} . "\n" + if (defined $o and defined $pto->Option->{$o}); + +__END__ + +=head1 NAME + +ptopeek - query a pto project + +=head1 SYNOPSIS + +ptopeek [options] project.pto + + Options: + -p | --panorama query 'p' panorama lines + -m | --mode query 'm' mode lines + -o | --option query '#hugin_' option lines + -h | --help Outputs help documentation + +=head1 DESCRIPTION + +B<ptopeek> queries global parameters from a hugin .pto project. Only one +parameter can be queried at once. + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> +L<ptopoke> + +=head1 AUTHOR + +Bruno Postle - November 2008. + +=cut Property changes on: trunk/Panotools-Script/bin/ptopeek ___________________________________________________________________ Added: svn:executable + * Added: trunk/Panotools-Script/bin/ptopoke =================================================================== --- trunk/Panotools-Script/bin/ptopoke (rev 0) +++ trunk/Panotools-Script/bin/ptopoke 2008-11-18 23:46:59 UTC (rev 911) @@ -0,0 +1,77 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; +use Getopt::Long; +use Pod::Usage; + +my $help = 0; +my %p; +my %m; +my %o; + +GetOptions ('p|panorama=s' => \%p, + 'm|mode=s' => \%m, + 'o|option=s' => \%o, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; + +my $path_pto = shift || pod2usage; +die "Can't find $path_pto" unless -e $path_pto; + +my $pto = new Panotools::Script; +$pto->Read ($path_pto); + +for my $key (keys %p) +{ + $pto->Panorama->Set ($key => $p{$key}); +} +for my $key (keys %m) +{ + $pto->Mode->Set ($key => $m{$key}); +} +for my $key (keys %o) +{ + $pto->Option->{$key} = $o{$key}; +} + +$pto->Write ($path_pto); + +__END__ + +=head1 NAME + +ptopoke - change settings in a pto project + +=head1 SYNOPSIS + +ptopoke [options] project.pto + + Options: + -p | --panorama key=value set 'p' panorama lines + -m | --mode key=value set 'm' mode lines + -o | --option key=value set '#hugin_' option lines + -h | --help Outputs help documentation + +=head1 DESCRIPTION + +B<ptopoke> sets global parameters for a hugin .pto project. + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> +L<ptopeek> + +=head1 AUTHOR + +Bruno Postle - November 2008. + +=cut Property changes on: trunk/Panotools-Script/bin/ptopoke ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-12-31 00:12:40
|
Revision: 915 http://panotools.svn.sourceforge.net/panotools/?rev=915&view=rev Author: brunopostle Date: 2008-12-31 00:12:14 +0000 (Wed, 31 Dec 2008) Log Message: ----------- rename tools with stupid names Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/Makefile.PL Added Paths: ----------- trunk/Panotools-Script/bin/ptoget trunk/Panotools-Script/bin/ptoset Removed Paths: ------------- trunk/Panotools-Script/bin/ptopeek trunk/Panotools-Script/bin/ptopoke Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-12-29 23:05:31 UTC (rev 914) +++ trunk/Panotools-Script/Changes 2008-12-31 00:12:14 UTC (rev 915) @@ -5,7 +5,7 @@ - new tool ptocentre - panostart rules for building qtvr, mercator, planet views etc... - tif2svg only trace outlines if --trace option given - - ptopeek and ptopoke tools to query and set global project parameters + - ptoget and ptoset tools to query and set global project parameters 0.19 - add pafextract to MANIFEST Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2008-12-29 23:05:31 UTC (rev 914) +++ trunk/Panotools-Script/MANIFEST 2008-12-31 00:12:14 UTC (rev 915) @@ -23,8 +23,8 @@ bin/ptoinfo-gui bin/ptomerge bin/ptopath -bin/ptopeek -bin/ptopoke +bin/ptoget +bin/ptoset bin/ptosort bin/ptosplit bin/qtvr2erect Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2008-12-29 23:05:31 UTC (rev 914) +++ trunk/Panotools-Script/Makefile.PL 2008-12-31 00:12:14 UTC (rev 915) @@ -4,8 +4,8 @@ WriteMakefile( 'NAME' => 'Panotools::Script', 'EXE_FILES' => [ 'bin/cubic2erect', 'bin/erect2cubic', 'bin/pafextract', - 'bin/jpeg2qtvr', 'bin/erect2qtvr', 'bin/enblend-mask', 'bin/match-n-shift', 'bin/ptopoke', - 'bin/process-masks', 'bin/erect2planet', 'bin/pto2tiff', 'bin/ptograph', 'bin/ptopeek', + 'bin/jpeg2qtvr', 'bin/erect2qtvr', 'bin/enblend-mask', 'bin/match-n-shift', 'bin/ptoset', + 'bin/process-masks', 'bin/erect2planet', 'bin/pto2tiff', 'bin/ptograph', 'bin/ptoget', 'bin/tif2svg', 'bin/enblend-svg', 'bin/pto2fulla', 'bin/ptoinfo', 'bin/ptopath', 'bin/qtvr2erect-gui', 'bin/tif2svg-gui', 'bin/ptoinfo-gui', 'bin/ptosort', 'bin/process-masks-gui', 'bin/enblend-svg-gui', 'bin/erect2qtvr-gui', 'bin/ptoclean', Copied: trunk/Panotools-Script/bin/ptoget (from rev 914, trunk/Panotools-Script/bin/ptopeek) =================================================================== --- trunk/Panotools-Script/bin/ptoget (rev 0) +++ trunk/Panotools-Script/bin/ptoget 2008-12-31 00:12:14 UTC (rev 915) @@ -0,0 +1,72 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; +use Getopt::Long; +use Pod::Usage; + +my $help = 0; +my $p; +my $m; +my $o; + +GetOptions ('p|panorama=s' => \$p, + 'm|mode=s' => \$m, + 'o|option=s' => \$o, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; + +my $path_pto = shift || pod2usage; +die "Can't find $path_pto" unless -e $path_pto; + +my $pto = new Panotools::Script; +$pto->Read ($path_pto); + +print $pto->Panorama->{$p} . "\n" + if (defined $p and defined $pto->Panorama->{$p}); + +print $pto->Mode->{$m} . "\n" + if (defined $m and defined $pto->Mode->{$m}); + +print $pto->Option->{$o} . "\n" + if (defined $o and defined $pto->Option->{$o}); + +__END__ + +=head1 NAME + +ptoget - query a pto project + +=head1 SYNOPSIS + +ptoget [options] project.pto + + Options: + -p | --panorama query 'p' panorama lines + -m | --mode query 'm' mode lines + -o | --option query '#hugin_' option lines + -h | --help Outputs help documentation + +=head1 DESCRIPTION + +B<ptoget> queries global parameters from a hugin .pto project. Only one +parameter can be queried at once. + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> +L<ptoset> + +=head1 AUTHOR + +Bruno Postle - November 2008. + +=cut Deleted: trunk/Panotools-Script/bin/ptopeek =================================================================== --- trunk/Panotools-Script/bin/ptopeek 2008-12-29 23:05:31 UTC (rev 914) +++ trunk/Panotools-Script/bin/ptopeek 2008-12-31 00:12:14 UTC (rev 915) @@ -1,72 +0,0 @@ -#!/usr/bin/perl -use strict; -use warnings; -use Panotools::Script; -use Getopt::Long; -use Pod::Usage; - -my $help = 0; -my $p; -my $m; -my $o; - -GetOptions ('p|panorama=s' => \$p, - 'm|mode=s' => \$m, - 'o|option=s' => \$o, - 'h|help' => \$help); - -pod2usage (-verbose => 2) if $help; - -my $path_pto = shift || pod2usage; -die "Can't find $path_pto" unless -e $path_pto; - -my $pto = new Panotools::Script; -$pto->Read ($path_pto); - -print $pto->Panorama->{$p} . "\n" - if (defined $p and defined $pto->Panorama->{$p}); - -print $pto->Mode->{$m} . "\n" - if (defined $m and defined $pto->Mode->{$m}); - -print $pto->Option->{$o} . "\n" - if (defined $o and defined $pto->Option->{$o}); - -__END__ - -=head1 NAME - -ptopeek - query a pto project - -=head1 SYNOPSIS - -ptopeek [options] project.pto - - Options: - -p | --panorama query 'p' panorama lines - -m | --mode query 'm' mode lines - -o | --option query '#hugin_' option lines - -h | --help Outputs help documentation - -=head1 DESCRIPTION - -B<ptopeek> queries global parameters from a hugin .pto project. Only one -parameter can be queried at once. - -=head1 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. - -=head1 SEE ALSO - -L<http://hugin.sourceforge.net/> -L<ptopoke> - -=head1 AUTHOR - -Bruno Postle - November 2008. - -=cut Deleted: trunk/Panotools-Script/bin/ptopoke =================================================================== --- trunk/Panotools-Script/bin/ptopoke 2008-12-29 23:05:31 UTC (rev 914) +++ trunk/Panotools-Script/bin/ptopoke 2008-12-31 00:12:14 UTC (rev 915) @@ -1,77 +0,0 @@ -#!/usr/bin/perl -use strict; -use warnings; -use Panotools::Script; -use Getopt::Long; -use Pod::Usage; - -my $help = 0; -my %p; -my %m; -my %o; - -GetOptions ('p|panorama=s' => \%p, - 'm|mode=s' => \%m, - 'o|option=s' => \%o, - 'h|help' => \$help); - -pod2usage (-verbose => 2) if $help; - -my $path_pto = shift || pod2usage; -die "Can't find $path_pto" unless -e $path_pto; - -my $pto = new Panotools::Script; -$pto->Read ($path_pto); - -for my $key (keys %p) -{ - $pto->Panorama->Set ($key => $p{$key}); -} -for my $key (keys %m) -{ - $pto->Mode->Set ($key => $m{$key}); -} -for my $key (keys %o) -{ - $pto->Option->{$key} = $o{$key}; -} - -$pto->Write ($path_pto); - -__END__ - -=head1 NAME - -ptopoke - change settings in a pto project - -=head1 SYNOPSIS - -ptopoke [options] project.pto - - Options: - -p | --panorama key=value set 'p' panorama lines - -m | --mode key=value set 'm' mode lines - -o | --option key=value set '#hugin_' option lines - -h | --help Outputs help documentation - -=head1 DESCRIPTION - -B<ptopoke> sets global parameters for a hugin .pto project. - -=head1 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. - -=head1 SEE ALSO - -L<http://hugin.sourceforge.net/> -L<ptopeek> - -=head1 AUTHOR - -Bruno Postle - November 2008. - -=cut Copied: trunk/Panotools-Script/bin/ptoset (from rev 914, trunk/Panotools-Script/bin/ptopoke) =================================================================== --- trunk/Panotools-Script/bin/ptoset (rev 0) +++ trunk/Panotools-Script/bin/ptoset 2008-12-31 00:12:14 UTC (rev 915) @@ -0,0 +1,77 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; +use Getopt::Long; +use Pod::Usage; + +my $help = 0; +my %p; +my %m; +my %o; + +GetOptions ('p|panorama=s' => \%p, + 'm|mode=s' => \%m, + 'o|option=s' => \%o, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; + +my $path_pto = shift || pod2usage; +die "Can't find $path_pto" unless -e $path_pto; + +my $pto = new Panotools::Script; +$pto->Read ($path_pto); + +for my $key (keys %p) +{ + $pto->Panorama->Set ($key => $p{$key}); +} +for my $key (keys %m) +{ + $pto->Mode->Set ($key => $m{$key}); +} +for my $key (keys %o) +{ + $pto->Option->{$key} = $o{$key}; +} + +$pto->Write ($path_pto); + +__END__ + +=head1 NAME + +ptoset - change settings in a pto project + +=head1 SYNOPSIS + +ptoset [options] project.pto + + Options: + -p | --panorama key=value set 'p' panorama lines + -m | --mode key=value set 'm' mode lines + -o | --option key=value set '#hugin_' option lines + -h | --help Outputs help documentation + +=head1 DESCRIPTION + +B<ptoset> sets global parameters for a hugin .pto project. + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> +L<ptoget> + +=head1 AUTHOR + +Bruno Postle - November 2008. + +=cut This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-12-31 01:06:18
|
Revision: 916 http://panotools.svn.sourceforge.net/panotools/?rev=916&view=rev Author: brunopostle Date: 2008-12-31 01:06:08 +0000 (Wed, 31 Dec 2008) Log Message: ----------- Bump version to 0.20 Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/META.yml trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-12-31 00:12:14 UTC (rev 915) +++ trunk/Panotools-Script/Changes 2008-12-31 01:06:08 UTC (rev 916) @@ -4,6 +4,8 @@ - Centre() method to try and place images in middle of the panorama - new tool ptocentre - panostart rules for building qtvr, mercator, planet views etc... + - Write() update 'o' lines when writing if project already contains 'o' lines + - Merge() only merge image metadata if already existing - tif2svg only trace outlines if --trace option given - ptoget and ptoset tools to query and set global project parameters Modified: trunk/Panotools-Script/META.yml =================================================================== --- trunk/Panotools-Script/META.yml 2008-12-31 00:12:14 UTC (rev 915) +++ trunk/Panotools-Script/META.yml 2008-12-31 01:06:08 UTC (rev 916) @@ -1,7 +1,7 @@ --- #YAML:1.0 name: Panotools-Script abstract: 'Read, write and manipulate hugin script files' -version: 0.19 +version: 0.20 license: 'GPLv2+' author: - 'Bruno Postle <br...@po...>' Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-12-31 00:12:14 UTC (rev 915) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-12-31 01:06:08 UTC (rev 916) @@ -36,7 +36,7 @@ use Storable qw/ dclone /; -our $VERSION = 0.19; +our $VERSION = 0.20; our $CLEANUP = 1; $CLEANUP = 0 if defined $ENV{DEBUG}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-09-27 09:44:21
|
Revision: 1086 http://panotools.svn.sourceforge.net/panotools/?rev=1086&view=rev Author: brunopostle Date: 2009-09-27 09:44:14 +0000 (Sun, 27 Sep 2009) Log Message: ----------- Support for i-line TrX, TrY, TrZ 'XYZ transform' parameters in libpano13-2.9.15 Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-09-27 09:30:50 UTC (rev 1085) +++ trunk/Panotools-Script/Changes 2009-09-27 09:44:14 UTC (rev 1086) @@ -1,7 +1,8 @@ Revision history for Panotools::Script. 0.24 - - support for i-line Tx, Ty, Tz & Ts 'tilt' parameters in libpano13-2.9.15 + - support for i-line TiX, TiY, TiZ & TiS 'tilt' parameters in libpano13-2.9.15 + - support for i-line TrX, TrY, TrZ 'XYZ transform' parameters in libpano13-2.9.15 0.23 - Add new projections to pod documentation and ptoinfo output Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm 2009-09-27 09:30:50 UTC (rev 1085) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm 2009-09-27 09:44:14 UTC (rev 1086) @@ -62,9 +62,13 @@ Rd Re - Tx,Ty,Tz Tilt on x axis, y axis, z axis - Ts Scaling of field of view in the tilt transformation + TiX,TiY,TiZ Tilt on x axis, y axis, z axis + TiS Scaling of field of view in the tilt transformation + TrX,TrY,TrZ Translation on x axis, y axis, z axis + + Te0,Te1,Te2,Te3 Test parameters + Vm vignetting correction mode (default 0): 0: no vignetting correction 1: radial vignetting correction (see j,k,l,o options) @@ -116,9 +120,9 @@ my $self = shift; } -sub _valid { return '^([abcdefghjnprtvwy]|[SCXYZ]|K[0-2][ab]|V[abcdfmxy]|Eev|E[rb]|T[xyzs]|R[abcde])(.*)' } +sub _valid { return '^([abcdefghjnprtvwy]|[SCXYZ]|K[0-2][ab]|V[abcdfmxy]|Eev|E[rb]|Te[0123]|Tr[XYZ]|Ti[XYZS]|R[abcde])(.*)' } -sub _valid_ptoptimizer { return '^([abcdefghnprtvwySC]|T[xyzs])(.*)' } +sub _valid_ptoptimizer { return '^([abcdefghnprtvwySC]|Te[0123]|Tr[XYZ]|Ti[XYZS])(.*)' } sub _sanitise_ptoptimizer { @@ -210,7 +214,8 @@ push @report, ['Format', $format]; push @report, ['Horizontal Field of View', $self->{v}]; push @report, ['Roll Pitch Yaw', $self->{r} .','. $self->{p} .','. $self->{y}]; - push @report, ['Tilt', $self->{Tx} .','. $self->{Ty} .','. $self->{Tz} .','. $self->{Ts}] if defined $self->{Ts}; + push @report, ['Tilt', $self->{TiX} .','. $self->{TiY} .','. $self->{TiZ} .','. $self->{TiS}] if defined $self->{TiS}; + push @report, ['XYZ transform', $self->{TrX} .','. $self->{TrY} .','. $self->{TrZ}] if defined $self->{TrX}; push @report, ['Lens distortion', $self->{a} .','. $self->{b} .','. $self->{c}] if defined $self->{a}; push @report, ['Image centre', $self->{d} .','. $self->{e}] if defined $self->{d}; push @report, ['Image shear', $self->{g} .','. $self->{t}] if defined $self->{g}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-10-17 11:32:20
|
Revision: 1111 http://panotools.svn.sourceforge.net/panotools/?rev=1111&view=rev Author: brunopostle Date: 2009-10-17 11:32:13 +0000 (Sat, 17 Oct 2009) Log Message: ----------- Support multiple commands in a rule Modified Paths: -------------- trunk/Panotools-Script/bin/panostart trunk/Panotools-Script/lib/Panotools/Makefile/Rule.pm Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2009-10-16 22:03:00 UTC (rev 1110) +++ trunk/Panotools-Script/bin/panostart 2009-10-17 11:32:13 UTC (rev 1111) @@ -110,14 +110,13 @@ my $rule_pto = new Panotools::Makefile::Rule; $rule_pto->Targets ("$stub.pto"); $rule_pto->Prerequisites (@{$group}); - my @stacks = '--stacks'; - @stacks = () if $nostacks; - $rule_pto->Command ('match-n-shift', @stacks, '--align', - '$(AP_EXTRA_ARGS)', '--output', "$stub.pto"); - $rule_pto->Command ('--projection', $projection) if defined $projection; - $rule_pto->Command ('--fov', $deg_fov) if defined $deg_fov; - $rule_pto->Command ('--selection', $crop_s) if defined $crop_s; - $rule_pto->Command (@{$group}); + my @command = ('match-n-shift'); + push @command, ('--stacks') unless $nostacks; + push @command, ('--align', '$(AP_EXTRA_ARGS)', '--output', "$stub.pto"); + push @command, ('--projection', $projection) if defined $projection; + push @command, ('--fov', $deg_fov) if defined $deg_fov; + push @command, ('--selection', $crop_s) if defined $crop_s; + $rule_pto->Command (@command, @{$group}); push @rules_pto, $rule_pto; Modified: trunk/Panotools-Script/lib/Panotools/Makefile/Rule.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Makefile/Rule.pm 2009-10-16 22:03:00 UTC (rev 1110) +++ trunk/Panotools-Script/lib/Panotools/Makefile/Rule.pm 2009-10-17 11:32:13 UTC (rev 1111) @@ -77,16 +77,17 @@ =pod -Rules have an optional 'command': +Rules have optional 'commands': - $rule->Command ('cp', 'input1.txt', 'output1.txt', ';', 'cp', 'input2.txt', 'output2.txt'); + $rule->Command ('cp', 'input1.txt', 'output1.txt'); + $rule->Command ('cp', 'input2.txt', 'output2.txt'); =cut sub Command { my $self = shift; - push @{$self->{command}}, @_; + push @{$self->{command}}, [@_]; } =pod @@ -106,8 +107,11 @@ $text .= join ' ', (map { _quoteshell ($_)} @{$self->{targets}}); $text .= ' : '; $text .= join ' ', (map { _quoteshell ($_)} @{$self->{prerequisites}}); - $text .= "\n\t" if scalar @{$self->{command}}; - $text .= join ' ', (map { _quoteshell ($_)} @{$self->{command}}); + for my $command (@{$self->{command}}) + { + $text .= "\n\t"; + $text .= join ' ', (map { _quoteshell ($_)} @{$command}); + } $text .= "\n\n"; return $text; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-11-02 21:11:24
|
Revision: 1124 http://panotools.svn.sourceforge.net/panotools/?rev=1124&view=rev Author: brunopostle Date: 2009-11-02 21:11:16 +0000 (Mon, 02 Nov 2009) Log Message: ----------- Changes to rule escaping especially for Windows Lots more Makefile tests. Modified Paths: -------------- trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/lib/Panotools/Makefile/Rule.pm trunk/Panotools-Script/t/101.makerule.t Added Paths: ----------- trunk/Panotools-Script/lib/Panotools/Makefile.pm trunk/Panotools-Script/t/102.platform.t trunk/Panotools-Script/t/103.platform.t Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2009-11-01 23:06:49 UTC (rev 1123) +++ trunk/Panotools-Script/MANIFEST 2009-11-02 21:11:16 UTC (rev 1124) @@ -45,6 +45,7 @@ desktop/tif2svg-gui.desktop doc/match-n-shift.svg dos/make_exe.pl +lib/Panotools/Makefile.pm lib/Panotools/Makefile/Rule.pm lib/Panotools/Matrix.pm lib/Panotools/Script.pm @@ -77,6 +78,8 @@ t/032.image.t t/033.points.t t/101.makerule.t +t/102.platform.t +t/103.platform.t t/data/cemetery/dscn4905.jpg t/data/cemetery/dscn4906.jpg t/data/cemetery/dscn4907.jpg Modified: trunk/Panotools-Script/lib/Panotools/Makefile/Rule.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Makefile/Rule.pm 2009-11-01 23:06:49 UTC (rev 1123) +++ trunk/Panotools-Script/lib/Panotools/Makefile/Rule.pm 2009-11-02 21:11:16 UTC (rev 1124) @@ -19,6 +19,8 @@ use strict; use warnings; +use Panotools::Makefile qw/platform/; + =head1 USAGE my $rule = new Panotools::Makefile::Rule; @@ -53,7 +55,7 @@ { my $self = shift; push @{$self->{targets}}, @_; - warn 'Error: unescapable =;: in targets: '. join (' ', @_) if grep /[=;:]/, @_; + #warn 'Error: unescapable =;:% in targets: '. join (' ', @_) if grep /[=;:%]/, @_; #warn 'Warning: non-portable target name: '. join (' ', @_) if grep /[?<>:*|"^]/, @_; } @@ -75,7 +77,7 @@ { my $self = shift; push @{$self->{prerequisites}}, @_; - warn 'Error: unescapable =;: in prerequisites: '. join (' ', @_) if grep /[=;:]/, @_; + #warn 'Error: unescapable =;:% in prerequisites: '. join (' ', @_) if grep /[=;:%]/, @_; #warn 'Warning: non-portable target name: '. join (' ', @_) if grep /[?<>:*|"^]/, @_; } @@ -123,32 +125,39 @@ sub _quotetargets { my $string = shift; - $string =~ s/([ %#|])/\\$1/g; + # Transform all C:\foo\bar paths to C:/foo/bar + $string =~ s/\\/\//g if (platform =~ /^(MSWin|dos)/); + $string =~ s/([ #|\\])/\\$1/g; return $string; } sub _quoteprerequisites { my $string = shift; - $string =~ s/([ #|])/\\$1/g; + # Transform all C:\foo\bar paths to C:/foo/bar + $string =~ s/\\/\//g if (platform =~ /^(MSWin|dos)/); + $string =~ s/([ #|\\])/\\$1/g; return $string; } sub _quoteshell { my $string = shift; - if ($^O =~ /^(MSWin|dos)/) + if (platform =~ /^(MSWin|dos)/) { # ?<>:*|"^ are unusable in Windows filenames # so the only thing we can quote is a space $string =~ s/^(.* .*)$/"$1"/g; + # Transform all C:\foo\bar paths to C:/foo/bar + $string =~ s/\\/\//g; } else { - # some shell char sequences are real shell commands - unless ($string =~ /^([&<>|]|2>|\|\||&&|2>&1|`.+`)$/) + # some shell char sequences are useful shell commands + # others are automatic variables $(<D) $(<F) $< + unless ($string =~ /^([&<>|]|2>|\|\||&&|2>&1|`.+`|\$\(<D\)|\$\(<F\)|\$<)$/) { - $string =~ s/(['"() `&*<?>|])/\\$1/g; + $string =~ s/([#'"() `&<>|\\])/\\$1/g; # unquote $(FOO) variables $string =~ s/\$\\\(([^)]+)\\\)/\$($1)/g; } Added: trunk/Panotools-Script/lib/Panotools/Makefile.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Makefile.pm (rev 0) +++ trunk/Panotools-Script/lib/Panotools/Makefile.pm 2009-11-02 21:11:16 UTC (rev 1124) @@ -0,0 +1,55 @@ +package Panotools::Makefile; + +=head1 NAME + +Panotools::Makefile - Makefile creation + +=head1 SYNOPSIS + +Simple interface for generating Makefile syntax + +=head1 DESCRIPTION + +Writing Makefiles directly from perl scripts with print and "\t" etc... is +prone to error, this library provides a simple perl interface for assembling +Makefile rules. + +=cut + +use strict; +use warnings; + +use Exporter; +use vars qw /@ISA @EXPORT_OK/; +@ISA = qw /Exporter/; +@EXPORT_OK = qw /platform/; + +our $PLATFORM; + +=head1 USAGE + + use Panotools::Makefile qw/platform/; + +Access the current platform name (MSWin32, linux, etc...): + + print platform; + +Define a different platform and access the new name: + + platform ('MSWin32'); + print platform; + +Reset platform to default: + + platform (undef); + +=cut + +sub platform +{ + $PLATFORM = shift if @_; + return $PLATFORM if defined $PLATFORM; + return $^O; +} + +1; Modified: trunk/Panotools-Script/t/101.makerule.t =================================================================== --- trunk/Panotools-Script/t/101.makerule.t 2009-11-01 23:06:49 UTC (rev 1123) +++ trunk/Panotools-Script/t/101.makerule.t 2009-11-02 21:11:16 UTC (rev 1124) @@ -32,7 +32,27 @@ "foo'bar", 'foo(bar', 'foo)bar', -'foo%bar' +'#bar', +' bar', +'übar', +'ébar', +'°bar', +'&bar', +'!bar', +',bar', +'_bar', +'-bar', +'{bar', +'}bar', +'+bar', +'@bar', +'[bar', +']bar', +'`bar', +'~bar', +"'bar", +'(bar', +')bar' ) { ok (testfilename ($file)); @@ -56,10 +76,13 @@ #'foo${FOO}bar', #'foo/bar', #'foo=bar', +#'foo%bar', #'foo\bar', #'foo;bar', #'foo:bar', #'foo$bar', +#'.bar', +#'%bar', sub testfilename { @@ -70,7 +93,7 @@ $rule->Targets ($filename_out); $rule->Prerequisites ($filename); - $rule->Command ('cp', $filename, $filename_out); + $rule->Command ('cp', '--', $filename, $filename_out); my $tempdir = tempdir (CLEANUP => 1); my $file = File::Spec->catfile ($tempdir, $filename); Added: trunk/Panotools-Script/t/102.platform.t =================================================================== --- trunk/Panotools-Script/t/102.platform.t (rev 0) +++ trunk/Panotools-Script/t/102.platform.t 2009-11-02 21:11:16 UTC (rev 1124) @@ -0,0 +1,30 @@ +#!/usr/bin/perl +#Editor vim:syn=perl + +use strict; +use warnings; +use Test::More 'no_plan'; +use lib 'lib'; + +use Panotools::Makefile qw/platform/; +ok (1); + +ok (Panotools::Makefile::platform eq $^O); +ok (platform eq $^O); + +ok (platform ('FOO')); +ok (platform eq 'FOO'); + +ok (platform ('MSWin32')); +ok (platform eq 'MSWin32'); + +ok (platform ('linux')); +ok (platform eq 'linux'); + +ok (platform ('BAR')); +ok (platform eq 'BAR'); + +ok (platform (undef)); +ok (platform eq $^O); + +ok (Panotools::Makefile::platform eq $^O); Added: trunk/Panotools-Script/t/103.platform.t =================================================================== --- trunk/Panotools-Script/t/103.platform.t (rev 0) +++ trunk/Panotools-Script/t/103.platform.t 2009-11-02 21:11:16 UTC (rev 1124) @@ -0,0 +1,52 @@ +#!/usr/bin/perl +#Editor vim:syn=perl + +use strict; +use warnings; +use Test::More 'no_plan'; +use lib 'lib'; + +use Panotools::Makefile::Rule; +use Panotools::Makefile qw/platform/; +ok (1); + +my $rule = new Panotools::Makefile::Rule; + +$rule->Targets ('C:\Program Files\foo\bar\My output.txt'); +$rule->Prerequisites ('C:\WINDOWS\notepad.exe'); +$rule->Command ('echo', 'C:\Documents and Settings\All Users\My input.txt'); + +platform ('linux'); + +#C:\\Program\ Files\\foo\\bar\\My\ output.txt : C:\\WINDOWS\\notepad.exe +# echo C:\\Documents\ and\ Settings\\All\ Users\\My\ input.txt + +ok ($rule->Assemble =~ /^C:\\\\Program\\ Files\\\\foo/); +ok ($rule->Assemble =~ /\techo C:\\\\Documents\\ and/); + +platform ('MSWin32'); + +#C:/Program\ Files/foo/bar/My\ output.txt : C:/WINDOWS/notepad.exe +# echo "C:/Documents and Settings/All Users/My input.txt" + +ok ($rule->Assemble =~ m|^C:/Program\\ Files/foo|); +ok ($rule->Assemble =~ m|\techo "C:/Documents and Settings/All Users/My input.txt"|); + +$rule = new Panotools::Makefile::Rule; + +$rule->Prerequisites ('/etc/resolv.conf', '/home/$(USER)/.hugin'); +$rule->Targets ('/tmp/foo bar', '/tmp/bar foo'); +$rule->Command ('cp', '/etc/resolv.conf', '/tmp/foo bar'); +$rule->Command ('cp', '/home/$(USER)/.hugin', '/tmp/bar foo'); + +platform ('linux'); + +#/tmp/foo\ bar /tmp/bar\ foo : /etc/resolv.conf /home/$(USER)/.hugin +# cp /etc/resolv.conf /tmp/foo\ bar +# cp /home/$(USER)/.hugin /tmp/bar\ foo + +ok ($rule->Assemble =~ m|/tmp/foo\\ bar /tmp/bar\\ foo|); +ok ($rule->Assemble =~ m| /home/\$\(USER\)/.hugin|); +ok ($rule->Assemble =~ m|cp /etc/resolv.conf /tmp/foo\\ bar|); +ok ($rule->Assemble =~ m|cp /home/\$\(USER\)/.hugin /tmp/bar\\ foo|); + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-11-10 20:49:50
|
Revision: 1144 http://panotools.svn.sourceforge.net/panotools/?rev=1144&view=rev Author: brunopostle Date: 2009-11-10 20:49:43 +0000 (Tue, 10 Nov 2009) Log Message: ----------- Makefile: Try and escape caret on Windows, untested Modified Paths: -------------- trunk/Panotools-Script/lib/Panotools/Makefile/Utils.pm trunk/Panotools-Script/t/101.makerule.t Modified: trunk/Panotools-Script/lib/Panotools/Makefile/Utils.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Makefile/Utils.pm 2009-11-09 21:34:35 UTC (rev 1143) +++ trunk/Panotools-Script/lib/Panotools/Makefile/Utils.pm 2009-11-10 20:49:43 UTC (rev 1144) @@ -120,8 +120,8 @@ { # ?<>:*|"^ are unusable in Windows filenames, # other unix shell characters are unspecial in Windows - # so the only thing we can quote is a space, ampersand and single quote - $string = '"'.$string.'"' if $string =~ /[ &']/; + # so the only thing we can quote is a space, ampersand, caret and single quote + $string = '"'.$string.'"' if $string =~ /[ &^']/; # Transform all C:\foo\bar paths to C:/foo/bar # Not all tokens are file paths, so \:-) will become /:-) $string =~ s/\\/\//g; Modified: trunk/Panotools-Script/t/101.makerule.t =================================================================== --- trunk/Panotools-Script/t/101.makerule.t 2009-11-09 21:34:35 UTC (rev 1143) +++ trunk/Panotools-Script/t/101.makerule.t 2009-11-10 20:49:43 UTC (rev 1144) @@ -56,27 +56,24 @@ '~bar', "'bar", '(bar', -')bar' -) -{ - ok (testfilename ($file)); -} - +')bar', +'^bar', +'foo^bar', +"foo^'bar", +'foo^&bar', +'foo^ bar', # filenames that will never work on Windows -for my $file ( 'foo?bar', 'foo<bar', 'foo>bar', 'foo*bar', 'foo|bar', -'foo"bar', -'foo^bar' +'foo"bar' ) { - ok (testfilename ($file)) unless ($^O =~ /^(MSWin|dos)/); + ok (testfilename ($file)); } - # Should be ok, but need different tests #'foo/bar', #'foo\bar', @@ -106,6 +103,8 @@ my $file = File::Spec->catfile ($tempdir, $filename); open FILE, ">", $file; close FILE; + # no point proceeding if perl couldn't create the file + return 1 unless -e $file; my $makefile = File::Spec->catfile ($tempdir, 'Makefile'); open MAKE, ">", $makefile; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-12-07 01:27:42
|
Revision: 1177 http://panotools.svn.sourceforge.net/panotools/?rev=1177&view=rev Author: brunopostle Date: 2009-12-07 00:13:29 +0000 (Mon, 07 Dec 2009) Log Message: ----------- --linkstacks option to link r,p,y values for new Hugin layout mode Modified Paths: -------------- trunk/Panotools-Script/bin/match-n-shift trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2009-12-04 23:16:02 UTC (rev 1176) +++ trunk/Panotools-Script/bin/match-n-shift 2009-12-07 00:13:29 UTC (rev 1177) @@ -13,6 +13,7 @@ my $noransac = 0; my $refine = 0; my $dostacks = 0; +my $linkstacks = 0; my $projection = 0; my $deg_fov; my $crop_s = undef; @@ -26,6 +27,7 @@ 'n|noransac' => \$noransac, 'r|refine' => \$refine, 'b|stacks' => \$dostacks, + 'l|linkstacks' => \$linkstacks, 'f|projection=i' => \$projection, 'v|fov=s' => \$deg_fov, 'k|selection=s' => \$crop_s, @@ -88,12 +90,14 @@ } #TODO distribute yaw and pitch -#TODO setup blended then fused +#TODO calculate fisheye field of view from EXIF FoV $oto->Panorama->{E} = sprintf ('%.3f', $sum_Eev / scalar @{$photos_all}); $oto->UnifyLenses; +$oto->LinkStacks if $linkstacks; + $oto->Option->{cpgenSize} = $pix_max; $oto->Option->{cpgenNumber} = $points; $oto->Option->{cpgenRansac} = 'true'; @@ -105,11 +109,19 @@ { $oto->Option->{outputLDRBlended} = 'false'; $oto->Option->{outputLDRExposureBlended} = 'true'; + $oto->Option->{outputLDRExposureLayersFused} = 'false'; } +elsif ($photos_all->Layered) +{ + $oto->Option->{outputLDRBlended} = 'false'; + $oto->Option->{outputLDRExposureBlended} = 'false'; + $oto->Option->{outputLDRExposureLayersFused} = 'true'; +} else { $oto->Option->{outputLDRBlended} = 'true'; $oto->Option->{outputLDRExposureBlended} = 'false'; + $oto->Option->{outputLDRExposureLayersFused} = 'false'; } if ($align) @@ -156,6 +168,7 @@ 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. Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2009-12-04 23:16:02 UTC (rev 1176) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2009-12-07 00:13:29 UTC (rev 1177) @@ -751,11 +751,21 @@ return 0; } +=pod + +Split a project into exposure layers, returns a list of lists of image ids: + + my $layers = $pto->ExposureLayers (1.0); + +Deafults to 0.5EV difference threshold. + +=cut + sub ExposureLayers { my $self = shift->Clone; my $layers = []; - my $maxEVDiff = 0.5; + my $maxEVDiff = shift || 0.5; my @images = (0 .. scalar @{$self->Image} -1); while (@images) { @@ -783,6 +793,15 @@ return 0; } +=pod + +Given a project with unlinked lens parameters, link them together with the same +lens number if all distortion, and photometric parameters match: + + $pto->UnifyLenses; + +=cut + sub UnifyLenses { my $self = shift; @@ -834,6 +853,39 @@ } } +=pod + +Given a project with stacks indicated by 'j' parameters, hard-link the +positions (only recognised by Hugin with layout mode code). + + $pto->LinkStacks; + +=cut + +sub LinkStacks +{ + my $self = shift; + for my $id (1 .. scalar @{$self->Image} -1) + { + my $img = $self->Image->[$id]; + my $found; + for my $base_id (0 .. $id -1) + { + next if $found; + my $base_img = $self->Image->[$base_id]; + next unless defined $img->{j}; + if ($img->{j} eq $base_img->{j}) + { + $img->{r} = "=$base_id"; + $img->{p} = "=$base_id"; + $img->{y} = "=$base_id"; + $found = 1; + next; + } + } + } +} + =head1 COPYRIGHT Copyright (c) 2001 Bruno Postle <br...@po...>. All Rights Reserved. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-12-17 22:07:42
|
Revision: 1188 http://panotools.svn.sourceforge.net/panotools/?rev=1188&view=rev Author: brunopostle Date: 2009-12-17 22:07:33 +0000 (Thu, 17 Dec 2009) Log Message: ----------- New untested tools ptobind and ptofill Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/Makefile.PL trunk/Panotools-Script/dos/make_exe.pl Added Paths: ----------- trunk/Panotools-Script/bin/ptobind trunk/Panotools-Script/bin/ptofill Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-12-17 22:05:10 UTC (rev 1187) +++ trunk/Panotools-Script/Changes 2009-12-17 22:07:33 UTC (rev 1188) @@ -3,13 +3,15 @@ 0.24 - new tool: ptoanchor - add control points to a Hugin project - new tool: ptochain - add control points to a Hugin project between consecutive photos + - new tool: ptobind - Join the ends of linked photos in a Hugin project + - new tool: ptofill - add control points to a Hugin project between likely overlapping photos - new tool: pto2mk2 - Create a Makefile for stitching - rewrite panostart to use ptoanchor - rewrite match-n-shift to use ptoanchor - bugfix: crash in Subset() when project has no image metadata - bugfix: tif2svg,enblend-svg fix --jpeg-proxies option (Thomas Modes) - bugfix: match-n-shift fix detection of longest exposure in bracketed sets - - bugfix: a full set defaults are written to new .pto projects + - bugfix: a full set of defaults are written to new .pto projects - feature: match-n-shift will get FoV and Eev from EXIF data - feature: panostart and match-n-shift use EXIF ExposureMode for detection of bracketed stacks - feature: erect2cubic --face option to optionally specify cubeface pixel size Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2009-12-17 22:05:10 UTC (rev 1187) +++ trunk/Panotools-Script/MANIFEST 2009-12-17 22:07:33 UTC (rev 1188) @@ -17,22 +17,24 @@ bin/process-masks-gui bin/pto2mk2 bin/ptoanchor +bin/ptobind bin/ptocentre bin/ptochain bin/ptoclean bin/ptodummy +bin/ptofill +bin/ptoget bin/ptograph bin/ptoinfo bin/ptoinfo-gui bin/ptomerge bin/ptopath -bin/ptoget bin/ptoset bin/ptosort bin/ptosplit bin/ptovariable +bin/ptscluster bin/ptsed -bin/ptscluster bin/qtvr2erect bin/qtvr2erect-gui bin/tif2svg @@ -52,8 +54,8 @@ lib/Panotools/Makefile.pm lib/Panotools/Makefile/Comment.pm lib/Panotools/Makefile/Rule.pm +lib/Panotools/Makefile/Utils.pm lib/Panotools/Makefile/Variable.pm -lib/Panotools/Makefile/Utils.pm lib/Panotools/Matrix.pm lib/Panotools/Photos.pm lib/Panotools/Script.pm Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2009-12-17 22:05:10 UTC (rev 1187) +++ trunk/Panotools-Script/Makefile.PL 2009-12-17 22:07:33 UTC (rev 1188) @@ -6,6 +6,7 @@ 'EXE_FILES' => [ 'bin/cubic2erect', 'bin/erect2cubic', 'bin/pafextract', 'bin/pto2mk2', 'bin/jpeg2qtvr', 'bin/erect2qtvr', 'bin/enblend-mask', 'bin/match-n-shift', 'bin/ptoset', 'bin/process-masks', 'bin/erect2planet', 'bin/ptograph', 'bin/ptoget', 'bin/enfuse-mask', + 'bin/ptochain', 'bin/ptobind', 'bin/ptofill', 'bin/tif2svg', 'bin/enblend-svg', 'bin/ptoinfo', 'bin/ptopath', 'bin/ptodummy', 'bin/ptoanchor', 'bin/qtvr2erect-gui', 'bin/tif2svg-gui', 'bin/ptoinfo-gui', 'bin/ptosort', 'bin/ptovariable', 'bin/process-masks-gui', 'bin/enblend-svg-gui', 'bin/erect2qtvr-gui', 'bin/ptoclean', Added: trunk/Panotools-Script/bin/ptobind =================================================================== --- trunk/Panotools-Script/bin/ptobind (rev 0) +++ trunk/Panotools-Script/bin/ptobind 2009-12-17 22:07:33 UTC (rev 1188) @@ -0,0 +1,167 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use Panotools::Makefile; +use Panotools::Script; + +my $path_prefix; +my $path_output; +my $help = 0; + +GetOptions ('p|prefix=s' => \$path_prefix, + 'o|output=s' => \$path_output, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; +pod2usage (2) unless (defined $path_prefix and scalar @ARGV); + +$path_prefix =~ s/\.[[:alnum:]]+$//; + +my $path_input = shift @ARGV; + +my $mk = new Panotools::Makefile; +$mk->Comment ('Command-line tools'); +$mk->Variable ('PTOMERGE', 'ptomerge'); +$mk->Variable ('AUTOPANO', 'autopano'); +$mk->Variable ('GENKEYS', 'generatekeys'); +$mk->Variable ('CPCLEAN', 'cpclean'); +$mk->Variable ('RM', '-', 'rm'); + +$mk->Comment ('Input project file and prefix for output'); +$mk->Variable ('PROJECT_FILE', $path_input); +$mk->Variable ('PREFIX', $path_prefix); + +my $rule = $mk->Rule ('all'); +$rule->Prerequisites ('$(PREFIX).pto'); + +$rule = $mk->Rule ('.PHONY'); +$rule->Prerequisites ('all', 'clean'); + +my $pto = new Panotools::Script; +$pto->Read ($path_input); + +my $pix_max = $pto->Option->{cpgenSize} || 1600; +my $points = $pto->Option->{cpgenNumber} || 25; +my $ransac = 1; +$ransac = 0 if (defined $pto->Option->{cpgenRansac} and $pto->Option->{cpgenRansac} eq 'false'); +my @refine = (); +@refine = ('--refine', '--keep-unrefinable', 0) + if (defined $pto->Option->{cpgenRefine} and $pto->Option->{cpgenRefine} eq 'true'); + +$ransac = 0 if $pto->Image->[0]->v ($pto) > 60; + +$mk->Comment ('Rule to create feature-point files when required'); +$rule = $mk->Rule ('%.key'); +$rule->Prerequisites ('%'); +$rule->Command ('$(GENKEYS_SHELL)', '$<', '$@', $pix_max); + +$mk->Comment ('Ends of all connected groups'); +my $var_endkeys = $mk->Variable ('END_KEYS'); + +my $chains = $pto->ConnectedGroups; + +for my $chain (@{$chains}) +{ + $var_endkeys->Values ($pto->Image->[$chain->[0]]->Path ($path_input) .'.key'); + next if scalar @{$chain} == 1; + $var_endkeys->Values ($pto->Image->[$chain->[-1]]->Path ($path_input) .'.key'); +} + +$mk->Comment ("Files we don't need afterwards"); +my $var_tempfiles = $mk->Variable ('TEMP_FILES'); + +$var_tempfiles->Values ('$(END_KEYS)'); + +$mk->Comment ('A project file connecting the ends'); +$rule = $mk->Rule ('$(PREFIX).ends.a.pto'); +$rule->Prerequisites ('$(END_KEYS)'); +$rule->Command ('$(AUTOPANO_SHELL)', @refine, '--ransac', $ransac, '--maxmatches', $points, + '$(PREFIX_SHELL).ends.a.pto', '$(END_KEYS_SHELL)'); + +$var_tempfiles->Values ('$(PREFIX).ends.a.pto'); + +$rule = $mk->Rule ('$(PREFIX).ends.b.pto'); +$rule->Prerequisites ('$(PREFIX).ends.a.pto'); +$rule->Command ('$(CPCLEAN_SHELL)', '-o', '$(PREFIX).ends.b.pto', '$(PREFIX).ends.a.pto'); + +$var_tempfiles->Values ('$(PREFIX).ends.b.pto'); + +$rule = $mk->Rule ('$(PREFIX).pto'); +$rule->Prerequisites ('$(PROJECT_FILE)', '$(PREFIX).ends.b.pto'); +$rule->Command ('$(PTOMERGE_SHELL)', '$(PROJECT_FILE_SHELL)', '$(PREFIX_SHELL).ends.b.pto', + '$(PREFIX_SHELL).pto'); + +$rule = $mk->Rule ('clean'); +$rule->Command ('$(RM_SHELL)', '$(TEMP_FILES_SHELL)'); + +my $rule_secondary = $mk->Rule ('.SECONDARY'); +$rule_secondary->Prerequisites ('$(TEMP_FILES)'); + +$mk->Write ($path_output) if defined $path_output; +$mk->DoIt ('all', 'clean') unless defined $path_output; + +exit 0; + +__END__ + +=head1 NAME + +ptobind - Join the ends of linked photos in a Hugin project + +=head1 SYNOPSIS + +ptobind [options] --output project.mk --prefix prefix input.pto + + Options: + -o | --output file Output Makefile + -p | --prefix Prefix of output project + -h | --help Outputs help documentation. + +=head1 DESCRIPTION + +B<ptobind> is a wrapper around various tools that generates control points. Output is +in the form of a .pto project or a Makefile to create that .pto project. + +This is a specialist tool that assumes that the project is already connected +into one or more chains of control points. The first and last photos from each +of these chains are selected for feature matching. e.g. if there is a single +chain, then this tool will try and join it into an loop, if there are two +chains they will be fitted together side-by-side by trying to join the ends to +each other, any loops will also be joined. + +This tool is intended to use the output and intermediate .key files created by +ptochain. + +If the --output option is given, rules for generating the project are written +to a Makefile, if --output isn't set then these rules will be executed +immediately. + +Control point generator parameters are set via Option lines in the input +project: + + #hugin_cpgenSize 1500 + #hugin_cpgenNumber 25 + #hugin_cpgenRansac true + #hugin_cpgenRefine false + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> + +=head1 AUTHOR + +Bruno Postle - December 2009. + +=cut + +=begin perl Added: trunk/Panotools-Script/bin/ptofill =================================================================== --- trunk/Panotools-Script/bin/ptofill (rev 0) +++ trunk/Panotools-Script/bin/ptofill 2009-12-17 22:07:33 UTC (rev 1188) @@ -0,0 +1,192 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use Panotools::Makefile; +use Panotools::Script; + +my $path_prefix; +my $path_output; +my $factor = 1.25; +my $help = 0; + +GetOptions ('p|prefix=s' => \$path_prefix, + 'o|output=s' => \$path_output, + 'f|factor=s' => \$factor, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; +pod2usage (2) unless (defined $path_prefix and scalar @ARGV); + +$path_prefix =~ s/\.[[:alnum:]]+$//; + +my $path_input = shift @ARGV; + +my $mk = new Panotools::Makefile; +$mk->Comment ('Command-line tools'); +$mk->Variable ('PTOMERGE', 'ptomerge'); +$mk->Variable ('AUTOPANO', 'autopano'); +$mk->Variable ('GENKEYS', 'generatekeys'); +$mk->Variable ('CELESTE', '-', 'celeste_standalone'); +$mk->Variable ('CPCLEAN', 'cpclean'); +$mk->Variable ('RM', '-', 'rm'); + +$mk->Comment ('Input project file and prefix for output'); +$mk->Variable ('PROJECT_FILE', $path_input); +$mk->Variable ('PREFIX', $path_prefix); + +my $rule = $mk->Rule ('all'); +$rule->Prerequisites ('$(PREFIX).pto'); + +$mk->Comment ("Files we don't need afterwards"); +my $var_tempfiles = $mk->Variable ('TEMP_FILES'); + +$rule = $mk->Rule ('clean'); +$rule->Command ('$(RM_SHELL)', '$(TEMP_FILES_SHELL)'); + +$rule = $mk->Rule ('.PHONY'); +$rule->Prerequisites ('all', 'clean'); + +my $pto = new Panotools::Script; +$pto->Read ($path_input); + +my $pix_max = $pto->Option->{cpgenSize} || 1600; +my $points = $pto->Option->{cpgenNumber} || 25; +my $ransac = 1; +$ransac = 0 if (defined $pto->Option->{cpgenRansac} and $pto->Option->{cpgenRansac} eq 'false'); +my @refine = (); +@refine = ('--refine', '--keep-unrefinable', 0) + if (defined $pto->Option->{cpgenRefine} and $pto->Option->{cpgenRefine} eq 'true'); + +$ransac = 0 if $pto->Image->[0]->v ($pto) > 60; + +$mk->Comment ('Rule to create feature-point files when required'); +$rule = $mk->Rule ('%.key'); +$rule->Prerequisites ('%'); +$rule->Command ('$(GENKEYS_SHELL)', '$<', '$@', $pix_max); + +#$var_tempfiles->Values (map {$_->Path ($path_input) .'.key'} @{$pto->Image}); + +my $var_links = $mk->Variable ('LINK_PTOS'); + +my $keys = {}; + +$mk->Comment ('Rules to match points between nearby photos'); +for my $id_image_a (1 .. scalar @{$pto->Image} -1) +{ + for my $id_image_b (0 .. $id_image_a -1) + { + next if $pto->Connections ($id_image_a, $id_image_b); + + # 'average' field of view of this pair of photos + my $image_a = $pto->Image->[$id_image_a]; + my $fov_a = $image_a->v ($pto) * ($image_a->h / $image_a->w + 1) / 2; + my $image_b = $pto->Image->[$id_image_b]; + my $fov_b = $image_b->v ($pto) * ($image_b->h / $image_b->w + 1) / 2; + my $fov = ($fov_a + $fov_b) / 2; + + next if $pto->AngularDistance ($id_image_a, $id_image_b) > $factor * $fov; + + my $path_a = $pto->Image->[$id_image_a]->Path ($path_input); + my $path_b = $pto->Image->[$id_image_b]->Path ($path_input); + # strip any suffixes + $path_a =~ s/\.[[:alnum:]]+$//; + $path_b =~ s/\.[[:alnum:]]+$//; + # strip all but filename + $path_b =~ s/.*[\/\\]//; + my $stub = $path_a .'-'. $path_b; + + $rule = $mk->Rule ($stub .'.a.pto'); + $rule->Prerequisites ($pto->Image->[$id_image_a]->Path ($path_input) .'.key', + $pto->Image->[$id_image_b]->Path ($path_input) .'.key'); + $rule->Command ('$(AUTOPANO_SHELL)', @refine, '--ransac', $ransac, + '--maxmatches', $points, $stub .'.a.pto', + $pto->Image->[$id_image_a]->Path ($path_input) .'.key', + $pto->Image->[$id_image_b]->Path ($path_input) .'.key'); + + $keys->{$pto->Image->[$id_image_a]->Path ($path_input) .'.key'} = 1; + $keys->{$pto->Image->[$id_image_b]->Path ($path_input) .'.key'} = 1; + + $var_tempfiles->Values ($stub .'.a.pto'); + + $rule = $mk->Rule ($stub .'.pto'); + $rule->Prerequisites ($stub .'.a.pto'); + $rule->Command ('$(CPCLEAN_SHELL)', '-o', $stub .'.pto', $stub .'.a.pto'); + + $var_links->Values ($stub .'.pto'); + $var_tempfiles->Values ($stub .'.pto'); + } +} + +$var_tempfiles->Values (sort keys %{$keys}); + +$rule = $mk->Rule ('$(PREFIX).pto'); +$rule->Prerequisites ('$(PROJECT_FILE)', '$(LINK_PTOS)'); +$rule->Command ('$(PTOMERGE_SHELL)', '$(PROJECT_FILE_SHELL)', '$(LINK_PTOS_SHELL)', + '$(PREFIX_SHELL).pto'); + +my $rule_secondary = $mk->Rule ('.SECONDARY'); +$rule_secondary->Prerequisites ('$(TEMP_FILES)'); + +$mk->Write ($path_output) if defined $path_output; +$mk->DoIt ('all', 'clean') unless defined $path_output; + +exit 0; + +__END__ + +=head1 NAME + +ptofill - add control points to a Hugin project between likely overlapping photos + +=head1 SYNOPSIS + +ptofill [options] --output project.mk --prefix prefix input.pto + + Options: + -o | --output file Output Makefile + -p | --prefix Prefix of output project + -f | --factor Distance factor to search for overlaps (default=1.25) + -h | --help Outputs help documentation. + +=head1 DESCRIPTION + +B<ptofill> is a wrapper around various tools that generates control points. +Output is in the form of a .pto project. + +All pairs of photos in a project are examined and angular distances compared to +determine if photos likely overlap, if points already exist between photos then +matching will be skipped. + +If the --output option is given, rules for generating the project are written +to a Makefile, if --output isn't set then these rules will be executed +immediately. + +Control point generator parameters are set via Option lines in the input +project: + + #hugin_cpgenSize 1500 + #hugin_cpgenNumber 25 + #hugin_cpgenRansac true + #hugin_cpgenRefine false + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> + +=head1 AUTHOR + +Bruno Postle - December 2009. + +=cut + +=begin perl Modified: trunk/Panotools-Script/dos/make_exe.pl =================================================================== --- trunk/Panotools-Script/dos/make_exe.pl 2009-12-17 22:05:10 UTC (rev 1187) +++ trunk/Panotools-Script/dos/make_exe.pl 2009-12-17 22:07:33 UTC (rev 1188) @@ -22,9 +22,12 @@ process-masks pto2mk2 ptoanchor +ptobind ptocentre +ptochain ptoclean ptodummy +ptofill ptoget ptograph ptoinfo This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2010-01-16 00:39:59
|
Revision: 1224 http://panotools.svn.sourceforge.net/panotools/?rev=1224&view=rev Author: brunopostle Date: 2010-01-16 00:39:51 +0000 (Sat, 16 Jan 2010) Log Message: ----------- Not-very-efficient tool for splitting images to google-maps style tiles Modified Paths: -------------- trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/Makefile.PL Added Paths: ----------- trunk/Panotools-Script/bin/entile Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2010-01-14 21:18:20 UTC (rev 1223) +++ trunk/Panotools-Script/MANIFEST 2010-01-16 00:39:51 UTC (rev 1224) @@ -3,6 +3,7 @@ bin/enblend-svg bin/enblend-svg-gui bin/enfuse-mask +bin/entile bin/erect2cubic bin/erect2mercator bin/erect2planet Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2010-01-14 21:18:20 UTC (rev 1223) +++ trunk/Panotools-Script/Makefile.PL 2010-01-16 00:39:51 UTC (rev 1224) @@ -6,7 +6,7 @@ 'EXE_FILES' => [ 'bin/cubic2erect', 'bin/erect2cubic', 'bin/pafextract', 'bin/pto2mk2', 'bin/jpeg2qtvr', 'bin/erect2qtvr', 'bin/enblend-mask', 'bin/match-n-shift', 'bin/ptoset', 'bin/process-masks', 'bin/erect2planet', 'bin/ptograph', 'bin/ptoget', 'bin/enfuse-mask', - 'bin/ptochain', 'bin/ptobind', 'bin/ptofill', 'bin/gigastart', + 'bin/ptochain', 'bin/ptobind', 'bin/ptofill', 'bin/gigastart', 'bin/entile', 'bin/tif2svg', 'bin/enblend-svg', 'bin/ptoinfo', 'bin/ptopath', 'bin/ptodummy', 'bin/ptoanchor', 'bin/qtvr2erect-gui', 'bin/tif2svg-gui', 'bin/ptoinfo-gui', 'bin/ptosort', 'bin/ptovariable', 'bin/process-masks-gui', 'bin/enblend-svg-gui', 'bin/erect2qtvr-gui', 'bin/ptoclean', Added: trunk/Panotools-Script/bin/entile =================================================================== --- trunk/Panotools-Script/bin/entile (rev 0) +++ trunk/Panotools-Script/bin/entile 2010-01-16 00:39:51 UTC (rev 1224) @@ -0,0 +1,139 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Image::Magick; + +my $image = new Image::Magick; +$image->Read (shift); + +my $path_prefix = shift || 't'; + +my $pix_tile = shift || 256; + +my ($pix_width, $pix_height) = $image->Get ('width', 'height'); + +my $pix_size = 1; +$pix_size *= 2 while ($pix_size < $pix_width || $pix_size < $pix_height); + +unless ($pix_size == $pix_width && $pix_size == $pix_height) +{ + my $x_offset = int (($pix_size - $pix_width)/2) +1; + my $y_offset = int (($pix_size - $pix_height)/2) +1; + $image->Border (geometry => $x_offset .'x'. $y_offset); + $image->Crop (geometry => $pix_size .'x'. $pix_size); + $image->Set (page => '0x0+0+0'); +} + +entile ($image, $path_prefix, $pix_tile); + +sub entile +{ + my $image = shift; + my $path_prefix = shift; + my $pix_tile = shift; + + my $pix_width = $image->Get ('width'); + my $w2 = $pix_width/2; + + my $q = $image->Clone; + my $r = $image->Clone; + my $s = $image->Clone; + my $t = $image->Clone; + + $q->Crop (geometry => $w2.'x'."$w2+0+0"); + $q->Set ( page => '0x0+0+0'); + $r->Crop (geometry => $w2.'x'."$w2+$w2+0"); + $r->Set ( page => '0x0+0+0'); + $s->Crop (geometry => $w2.'x'."$w2+$w2+$w2"); + $s->Set ( page => '0x0+0+0'); + $t->Crop (geometry => $w2.'x'."$w2+0+$w2"); + $t->Set ( page => '0x0+0+0'); + + if ($w2 == $pix_tile) + { + $q->Write ($path_prefix .'q.jpg'); + $r->Write ($path_prefix .'r.jpg'); + $s->Write ($path_prefix .'s.jpg'); + $t->Write ($path_prefix .'t.jpg'); + } + elsif ($w2 < $pix_tile) + { + die; + } + else + { + entile ($q, $path_prefix .'q', $pix_tile); + entile ($r, $path_prefix .'r', $pix_tile); + entile ($s, $path_prefix .'s', $pix_tile); + entile ($t, $path_prefix .'t', $pix_tile); + } + + $image->Scale (width => $pix_tile, height => $pix_tile); + $image->Write ($path_prefix .'.jpg'); +} + +0; + +__END__ + +=head1 NAME + +entile - create a tiled image pyramid + +=head1 SYNOPSIS + +entile image1 [path_prefix] [pix_size] + +=head1 DESCRIPTION + +B<entile> takes an image file name and splits it into a collection of equally +sized JPEG tiles representing the image at all resolutions. + +e.g. a 1024x1024 pixel image will be split into the following: + +16 full resolution 256x256 tiles + +4 half resolution 256x256 tiles + +1 quarter resolution 256x256 tile + +The default output prefix path is 't', i.e. output files will be prefixed with +'t' in the current working directory. + +The default tile size is 256x256. + +Note that input images are expanded to be square and doubled multiples of the +tile size, i.e. for a 256x256 output tile, the input photos are enlarged be one +of: 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 etc... pixels square + +The naming format is 'keyhole' style, i.e. "q, r, s, t" represent the four +quadrants clockwise starting top-left: + + q r + t s + +The next level down reproduces the same pattern: + + qq qr rq rr + qt qs rt rs + tq tr sq sr + tt ts st ss + +etc... + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> + +=head1 AUTHOR + +Bruno Postle - January 2010. + +=cut Property changes on: trunk/Panotools-Script/bin/entile ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2010-04-07 22:18:25
|
Revision: 1264 http://panotools.svn.sourceforge.net/panotools/?rev=1264&view=rev Author: brunopostle Date: 2010-04-07 22:18:19 +0000 (Wed, 07 Apr 2010) Log Message: ----------- Use more reliable exiftool composite values: RedBalance and BlueBalance Modified Paths: -------------- trunk/Panotools-Script/bin/match-n-shift trunk/Panotools-Script/lib/Panotools/Photos.pm trunk/Panotools-Script/t/106.photos.t Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2010-04-07 21:32:20 UTC (rev 1263) +++ trunk/Panotools-Script/bin/match-n-shift 2010-04-07 22:18:19 UTC (rev 1264) @@ -71,8 +71,8 @@ $image->{n} = '"'. $image->Path .'"'; $image->{S} = $crop_s if defined $crop_s; $sum_Eev += $photos_all->Eev ($id); - $image->{Er} = $photo->{exif}->{WBRedLevel} / $AverageRGB[0] if $photo->{exif}->{WBRedLevel}; - $image->{Eb} = $photo->{exif}->{WBBlueLevel} / $AverageRGB[2] if $photo->{exif}->{WBBlueLevel}; + $image->{Er} = $photo->{exif}->{RedBalance} / $AverageRGB[0] if $photo->{exif}->{RedBalance}; + $image->{Eb} = $photo->{exif}->{BlueBalance} / $AverageRGB[2] if $photo->{exif}->{BlueBalance}; if ($photos_all->Bracketed) { Modified: trunk/Panotools-Script/lib/Panotools/Photos.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Photos.pm 2010-04-07 21:32:20 UTC (rev 1263) +++ trunk/Panotools-Script/lib/Panotools/Photos.pm 2010-04-07 22:18:19 UTC (rev 1264) @@ -314,20 +314,20 @@ sub AverageRGB { my $self = shift; - my $WBRedLevel = 0; - my $WBGreenLevel = 0; - my $WBBlueLevel = 0; + my $RedBalance = 0; + my $GreenBalance = 0; + my $BlueBalance = 0; my $count = 0; for my $image (@{$self}) { - next unless $image->{exif}->{'WBRedLevel'}; - $WBRedLevel += ($image->{exif}->{'WBRedLevel'} || 1000); - $WBGreenLevel += ($image->{exif}->{'WBGreenLevel'} || 1000); - $WBBlueLevel += ($image->{exif}->{'WBBlueLevel'} || 1000); + next unless ($image->{exif}->{'RedBalance'} and $image->{exif}->{'GreenBalance'} and $image->{exif}->{'BlueBalance'}); + $RedBalance += $image->{exif}->{'RedBalance'}; + $GreenBalance += $image->{exif}->{'GreenBalance'}; + $BlueBalance += $image->{exif}->{'BlueBalance'}; $count++; } - return (1000,1000,1000) unless $count; - return ($WBRedLevel / $count, $WBGreenLevel / $count, $WBBlueLevel / $count); + return (1,1,1) unless $count; + return ($RedBalance / $count, $GreenBalance / $count, $BlueBalance / $count); } 1; Modified: trunk/Panotools-Script/t/106.photos.t =================================================================== --- trunk/Panotools-Script/t/106.photos.t 2010-04-07 21:32:20 UTC (rev 1263) +++ trunk/Panotools-Script/t/106.photos.t 2010-04-07 22:18:19 UTC (rev 1264) @@ -78,9 +78,14 @@ ok (Panotools::Photos::_longer (4, 0)); ok (Panotools::Photos::_longer ('1/4', 0)); -is ((join ':', $photos->AverageRGB), '1000:1000:1000'); +is ((join ':', $photos->AverageRGB), '1:1:1'); -$photos->[0]->{exif}->{WBRedLevel} = 500; -$photos->[1]->{exif}->{WBRedLevel} = 600; +$photos->[0]->{exif}->{RedBalance} = 2; +$photos->[1]->{exif}->{RedBalance} = 4; +is ((join ':', $photos->AverageRGB), '1:1:1'); +$photos->[0]->{exif}->{GreenBalance} = 2; +$photos->[1]->{exif}->{GreenBalance} = 2; +$photos->[0]->{exif}->{BlueBalance} = 2; +$photos->[1]->{exif}->{BlueBalance} = 2; -is ((join ':', $photos->AverageRGB), '550:1000:1000'); +is ((join ':', $photos->AverageRGB), '3:2:2'); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2011-05-31 21:01:21
|
Revision: 1328 http://panotools.svn.sourceforge.net/panotools/?rev=1328&view=rev Author: brunopostle Date: 2011-05-31 21:01:15 +0000 (Tue, 31 May 2011) Log Message: ----------- Fix some more bugs dealing with linked stacks Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2011-05-30 23:52:25 UTC (rev 1327) +++ trunk/Panotools-Script/Changes 2011-05-31 21:01:15 UTC (rev 1328) @@ -6,7 +6,7 @@ - tests: workaround math on Darwin - tests: Use 'copy' instead of 'cp' on windows when running tests - new tools: ptohalve and ptodouble - resizes pto project files - - fix Transform() bug with linked stacks + - fix Transform() and other potential bugs with linked stacks 0.25 - Image Radius() method and Panotools::Script OptimalWidth() method Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm 2011-05-30 23:52:25 UTC (rev 1327) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm 2011-05-31 21:01:15 UTC (rev 1328) @@ -382,7 +382,7 @@ } my $matrix = rollpitchyaw2matrix - (deg2rad ($self->{r}), deg2rad ($self->{p}), deg2rad ($self->{y})); + (deg2rad ($self->r), deg2rad ($self->p), deg2rad ($self->y)); multiply ($matrix, $point); } Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2011-05-30 23:52:25 UTC (rev 1327) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2011-05-31 21:01:15 UTC (rev 1328) @@ -797,8 +797,8 @@ my ($image0, $image1, $maxShift) = @_; my $minShift = 360.0 - $maxShift; return 1 - if ( (abs ($image0->{y} - $image1->{y}) < $maxShift || abs ($image0->{y} - $image1->{y}) > $minShift) - && abs ($image0->{p} - $image1->{p}) < $maxShift ); + if ( (abs ($image0->y - $image1->y) < $maxShift || abs ($image0->y - $image1->y) > $minShift) + && abs ($image0->p - $image1->p) < $maxShift ); return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2011-06-19 22:35:15
|
Revision: 1331 http://panotools.svn.sourceforge.net/panotools/?rev=1331&view=rev Author: brunopostle Date: 2011-06-19 22:35:09 +0000 (Sun, 19 Jun 2011) Log Message: ----------- apparently there is a bsd called dragonfly Modified Paths: -------------- trunk/Panotools-Script/lib/Panotools/Makefile.pm trunk/Panotools-Script/t/101.makerule.t Modified: trunk/Panotools-Script/lib/Panotools/Makefile.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Makefile.pm 2011-06-14 22:11:30 UTC (rev 1330) +++ trunk/Panotools-Script/lib/Panotools/Makefile.pm 2011-06-19 22:35:09 UTC (rev 1331) @@ -149,7 +149,7 @@ my $path_makefile = File::Spec->catfile ($tempdir, 'Makefile'); $self->Write ($path_makefile); my $make_exe = 'make'; - $make_exe = 'gmake' if ($^O =~ /^(.*bsd|irix|solaris|sunos)$/); + $make_exe = 'gmake' if ($^O =~ /^(.*bsd|dragonfly|irix|solaris|sunos)$/); system ($make_exe, '-f', $path_makefile, @_); return 1 if ($? == 0); return 0; Modified: trunk/Panotools-Script/t/101.makerule.t =================================================================== --- trunk/Panotools-Script/t/101.makerule.t 2011-06-14 22:11:30 UTC (rev 1330) +++ trunk/Panotools-Script/t/101.makerule.t 2011-06-19 22:35:09 UTC (rev 1331) @@ -121,7 +121,7 @@ my $make_exe = 'make'; # On bsd/irix/solaris 'make' doesn't support escaping special characters. # We need to use GNU make (gmake) on these platforms. - $make_exe = 'gmake' if ($^O =~ /^(.*bsd|irix|solaris|sunos)$/); + $make_exe = 'gmake' if ($^O =~ /^(.*bsd|dragonfly|irix|solaris|sunos)$/); system ($make_exe); return 1 if -e $filename_out; print $rule->Assemble; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2012-04-18 22:10:52
|
Revision: 1341 http://panotools.svn.sourceforge.net/panotools/?rev=1341&view=rev Author: brunopostle Date: 2012-04-18 22:10:42 +0000 (Wed, 18 Apr 2012) Log Message: ----------- New tool that implements morph-to-fit for Hugin projects Modified Paths: -------------- trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/Makefile.PL Added Paths: ----------- trunk/Panotools-Script/bin/ptomorph Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2012-04-17 21:08:59 UTC (rev 1340) +++ trunk/Panotools-Script/MANIFEST 2012-04-18 22:10:42 UTC (rev 1341) @@ -34,6 +34,7 @@ bin/ptoinfo bin/ptoinfo-gui bin/ptomerge +bin/ptomorph bin/ptopath bin/ptoreset bin/ptoset Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2012-04-17 21:08:59 UTC (rev 1340) +++ trunk/Panotools-Script/Makefile.PL 2012-04-18 22:10:42 UTC (rev 1341) @@ -5,7 +5,7 @@ 'NAME' => 'Panotools::Script', 'EXE_FILES' => [ 'bin/cubic2erect', 'bin/erect2cubic', 'bin/pafextract', 'bin/pto2mk2', 'bin/jpeg2qtvr', 'bin/erect2qtvr', 'bin/enblend-mask', 'bin/match-n-shift', 'bin/ptoset', 'bin/ptodouble', - 'bin/process-masks', 'bin/erect2planet', 'bin/ptoget', 'bin/enfuse-mask', 'bin/ptohalve', + 'bin/process-masks', 'bin/erect2planet', 'bin/ptoget', 'bin/enfuse-mask', 'bin/ptohalve', 'bin/ptomorph', 'bin/ptochain', 'bin/ptobind', 'bin/ptofill', 'bin/gigastart', 'bin/entile', 'bin/gigatile', 'bin/ptoreset', 'bin/tif2svg', 'bin/enblend-svg', 'bin/ptoinfo', 'bin/ptopath', 'bin/ptodummy', 'bin/ptoanchor', 'bin/qtvr2erect-gui', 'bin/tif2svg-gui', 'bin/ptoinfo-gui', 'bin/ptosort', 'bin/ptovariable', Added: trunk/Panotools-Script/bin/ptomorph =================================================================== --- trunk/Panotools-Script/bin/ptomorph (rev 0) +++ trunk/Panotools-Script/bin/ptomorph 2012-04-18 22:10:42 UTC (rev 1341) @@ -0,0 +1,125 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; +use Getopt::Long; +use Pod::Usage; +use Storable qw/ dclone /; + +my $help = 0; +my $path_out = 'morphed.pto'; + +GetOptions ('o|output=s' => \$path_out, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; + +my $path_pto = shift || pod2usage; +die "Can't find $path_pto" unless -e $path_pto; + +my $pto = new Panotools::Script; +$pto->Read ($path_pto); +$pto->InitTrafo ($path_pto); + +my $mapping; + +for my $cp (@{$pto->Control}) +{ + my $cp_new = dclone $cp; + if ($cp->{t} == 0) + { + my @uv = $pto->Trafo ($cp->{n}, $cp->{x}, $cp->{y}); + my @UV = $pto->Trafo ($cp->{N}, $cp->{X}, $cp->{Y}); + my @average = (($uv[0] + $UV[0])/2, ($uv[1] + $UV[1])/2); + + ($cp_new->{x}, $cp_new->{y}) = $pto->TrafoReverse ($cp->{n}, @average); + push @{$mapping->{$cp->{n}}}, join (',', $cp->{x}, $cp->{y}), join (',', $cp_new->{x}, $cp_new->{y}); + + ($cp_new->{X}, $cp_new->{Y}) = $pto->TrafoReverse ($cp->{N}, @average); + push @{$mapping->{$cp->{N}}}, join (',', $cp->{X}, $cp->{Y}), join (',', $cp_new->{X}, $cp_new->{Y}); + } + $cp = $cp_new; +} + +for my $id_image (0 .. scalar @{$pto->Image} -1) +{ + next unless defined $mapping->{$id_image}; + + my $path_original = $pto->Image->[$id_image]->Path ($path_pto); + my $path_new = $path_out; + $path_new =~ s/\.pto/_/i; + $path_new .= sprintf("%04d", $id_image) .'.png'; + + system ('convert', $path_original, '-alpha', 'on', + '-virtual-pixel', 'transparent', + '-distort', 'Shepards', join (' ', @{$mapping->{$id_image}}), + $path_new); + + $pto->Image->[$id_image]->{n} = '"'. $path_new . '"'; +} + +$pto->Write ($path_out); + +__END__ + +=head1 NAME + +ptomorph - Distort photos before stitching + +=head1 SYNOPSIS + +ptomorph [options] project.pto + + Options: + -h | --help Outputs help documentation + -o | --output name Output .pto project name, defaults to 'morphed.pto' + +=head1 DESCRIPTION + +B<ptomorph> looks at control points in a Hugin PTO panorama project and creates +a new set of photos that are distorted such that these control points line up +perfectly. Distortion is a 'rubber-sheet' type morph. + +A PTO project is created that references these distorted photos, this project +can then be stitched as normal. + +Temporary distorted images are in PNG format with filenames based on the prefix +of the new PTO filename. i.e. this command: + + ptomorph -o /path/to/morphed.pto project.pto + +..will produce the following files: + + /path/to/morphed.pto + /path/to/morphed_0000.png + /path/to/morphed_0001.png + /path/to/morphed_0002.png + etc... + +Control point positions are calculated using the 'pano_trafo' tool from the +Hugin project, the morphed photos are created with 'convert' from the +ImageMagick project. + +Masks and cropping settings are not distorted, so projects with masks that need +lots of distortion may not work so well. + +Note: Due to the way that the 'pano_trafo' process is spawned, it is likely +that this proof of concept tool doesn't currently work on Windows. + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> +L<http://www.imagemagick.org/> + +=head1 AUTHOR + +Bruno Postle - April 2012. + +=cut Property changes on: trunk/Panotools-Script/bin/ptomorph ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2012-04-20 21:19:48
|
Revision: 1342 http://panotools.svn.sourceforge.net/panotools/?rev=1342&view=rev Author: brunopostle Date: 2012-04-20 21:19:42 +0000 (Fri, 20 Apr 2012) Log Message: ----------- Add a ptomorph --polynomial parameter Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/ptomorph Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2012-04-18 22:10:42 UTC (rev 1341) +++ trunk/Panotools-Script/Changes 2012-04-20 21:19:42 UTC (rev 1342) @@ -8,6 +8,7 @@ - remove ptograph as superceded by Hugin layout mode - skip Panotools::Makefile tests if no suitable make executable found - some methods for fast querying of transformation coordinates via pano_trafo + - new tool: ptomorph - distort photos before stitching 0.26 - ptoanchor now uses cpfind instead of autopano-sift-c, requires Hugin 2010.4.0 Modified: trunk/Panotools-Script/bin/ptomorph =================================================================== --- trunk/Panotools-Script/bin/ptomorph 2012-04-18 22:10:42 UTC (rev 1341) +++ trunk/Panotools-Script/bin/ptomorph 2012-04-20 21:19:42 UTC (rev 1342) @@ -8,8 +8,10 @@ my $help = 0; my $path_out = 'morphed.pto'; +my $p_order = undef; GetOptions ('o|output=s' => \$path_out, + 'p|polynomial=f' => \$p_order, 'h|help' => \$help); pod2usage (-verbose => 2) if $help; @@ -44,16 +46,33 @@ for my $id_image (0 .. scalar @{$pto->Image} -1) { next unless defined $mapping->{$id_image}; + next unless scalar @{$mapping->{$id_image}} > 2; my $path_original = $pto->Image->[$id_image]->Path ($path_pto); my $path_new = $path_out; $path_new =~ s/\.pto/_/i; $path_new .= sprintf("%04d", $id_image) .'.png'; - system ('convert', $path_original, '-alpha', 'on', + if (defined $p_order) + { + my $o = $p_order; + while ((($o+1) * ($o+2) /2) > scalar @{$mapping->{$id_image}}) + { + # reduce the order of the polynomial if there are not enough control points + $o--; + } + system ('convert', $path_original, '-alpha', 'on', '-virtual-pixel', 'transparent', + '-distort', 'Polynomial', join (' ', $o, @{$mapping->{$id_image}}), + $path_new); + } + else + { + system ('convert', $path_original, '-alpha', 'on', + '-virtual-pixel', 'transparent', '-distort', 'Shepards', join (' ', @{$mapping->{$id_image}}), $path_new); + } $pto->Image->[$id_image]->{n} = '"'. $path_new . '"'; } @@ -73,6 +92,8 @@ Options: -h | --help Outputs help documentation -o | --output name Output .pto project name, defaults to 'morphed.pto' + -p | --polynomial num Uses a polynomial best fit, num is 'order' of polynomial + and must be 1, 2, 3, 4 or 5 =head1 DESCRIPTION @@ -100,6 +121,11 @@ Hugin project, the morphed photos are created with 'convert' from the ImageMagick project. +By default the 'Shepards' distortion is used, if a polynomial is specified then +the ImageMagick 'Polynomial' distortion is used, see +L<http://www.imagemagick.org/Usage/distorts/#polynomial> and +L<http://www.imagemagick.org/Usage/distorts/#shepards> + Masks and cropping settings are not distorted, so projects with masks that need lots of distortion may not work so well. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-01-03 23:05:05
|
Revision: 922 http://panotools.svn.sourceforge.net/panotools/?rev=922&view=rev Author: brunopostle Date: 2009-01-03 23:05:01 +0000 (Sat, 03 Jan 2009) Log Message: ----------- Quote VERSION Modified Paths: -------------- trunk/Panotools-Script/META.yml trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/META.yml =================================================================== --- trunk/Panotools-Script/META.yml 2009-01-03 07:22:57 UTC (rev 921) +++ trunk/Panotools-Script/META.yml 2009-01-03 23:05:01 UTC (rev 922) @@ -1,7 +1,7 @@ --- #YAML:1.0 name: Panotools-Script abstract: 'Read, write and manipulate hugin script files' -version: 0.20 +version: '0.20' license: 'GPLv2+' author: - 'Bruno Postle <br...@po...>' Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2009-01-03 07:22:57 UTC (rev 921) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2009-01-03 23:05:01 UTC (rev 922) @@ -36,7 +36,7 @@ use Storable qw/ dclone /; -our $VERSION = 0.20; +our $VERSION = '0.20'; our $CLEANUP = 1; $CLEANUP = 0 if defined $ENV{DEBUG}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-01-27 22:42:42
|
Revision: 925 http://panotools.svn.sourceforge.net/panotools/?rev=925&view=rev Author: brunopostle Date: 2009-01-27 22:08:27 +0000 (Tue, 27 Jan 2009) Log Message: ----------- don't give autooptimiser projects with invalid lenses Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/ptoclean Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-01-17 22:35:41 UTC (rev 924) +++ trunk/Panotools-Script/Changes 2009-01-27 22:08:27 UTC (rev 925) @@ -1,5 +1,8 @@ Revision history for Panotools::Script. +0.21 + - ptoclean, don't give autooptimiser projects with invalid lenses + 0.20 - Centre() method to try and place images in middle of the panorama - new tool ptocentre Modified: trunk/Panotools-Script/bin/ptoclean =================================================================== --- trunk/Panotools-Script/bin/ptoclean 2009-01-17 22:35:41 UTC (rev 924) +++ trunk/Panotools-Script/bin/ptoclean 2009-01-27 22:08:27 UTC (rev 925) @@ -50,7 +50,7 @@ my $p_temp = $p->Clone; $p_temp->{control} = $control_temp; - unless ($fast) + unless ($fast or scalar @{$p_temp->Control} == 0) { $p_temp->{variable} = new Panotools::Script::Line::Variable; $p_temp->Variable->{$index_b} = {r => 1, p => 1, y => 1}; @@ -58,9 +58,11 @@ $p_temp->Variable->{0}->{v} = 1 if (scalar @{$control_temp} > 4); $p_temp->Variable->{0}->{b} = 1 if (scalar @{$control_temp} > 6); $p_temp->Variable->{0}->{c} = 1 if (scalar @{$control_temp} > 8); - $p_temp->Image->[$index_a]->Set (a => 0, b => 0, c => 0, d => 0, e => 0); - $p_temp->Image->[$index_b]->Set (a => "=$index_a", b => "=$index_a", c => "=$index_a", - d => "=$index_a", e => "=$index_a"); + $p_temp->Image->[0]->Set (a => 0, b => 0, c => 0, d => 0, e => 0); + $p_temp->Image->[$index_a]->Set (a => "=0", b => "=0", c => "=0", + d => "=0", e => "=0") unless ($index_a == 0); + $p_temp->Image->[$index_b]->Set (a => "=0", b => "=0", c => "=0", + d => "=0", e => "=0"); my $pto_in_tmp = File::Spec->catfile ($tempdir, "$index_a-$index_b.in.pto"); my $pto_out_tmp = File::Spec->catfile ($tempdir, "$index_a-$index_b.out.pto"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-02-09 22:51:10
|
Revision: 947 http://panotools.svn.sourceforge.net/panotools/?rev=947&view=rev Author: brunopostle Date: 2009-02-09 22:03:45 +0000 (Mon, 09 Feb 2009) Log Message: ----------- More tools for editing project files and cleaning bad control points (Iouri Ivliev) Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/META.yml trunk/Panotools-Script/Makefile.PL trunk/Panotools-Script/dos/make_exe.pl trunk/Panotools-Script/lib/Panotools/Script.pm Added Paths: ----------- trunk/Panotools-Script/bin/ptscluster trunk/Panotools-Script/bin/ptsed Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-02-09 21:40:09 UTC (rev 946) +++ trunk/Panotools-Script/Changes 2009-02-09 22:03:45 UTC (rev 947) @@ -2,6 +2,10 @@ 0.21 - ptoclean, don't give autooptimiser projects with invalid lenses + - new tool ptsed for editing project files, also useful for converting + .pto projects to PToptimizer compatible scripts (Iouri Ivliev) + - ptscluster tool for removing bad control points, uses PToptimizer + output from libpano13-2.9.14 or later (Iouri Ivliev) 0.20 - Centre() method to try and place images in middle of the panorama Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2009-02-09 21:40:09 UTC (rev 946) +++ trunk/Panotools-Script/MANIFEST 2009-02-09 22:03:45 UTC (rev 947) @@ -27,6 +27,8 @@ bin/ptoset bin/ptosort bin/ptosplit +bin/ptsed +bin/ptscluster bin/qtvr2erect bin/qtvr2erect-gui bin/tif2svg Modified: trunk/Panotools-Script/META.yml =================================================================== --- trunk/Panotools-Script/META.yml 2009-02-09 21:40:09 UTC (rev 946) +++ trunk/Panotools-Script/META.yml 2009-02-09 22:03:45 UTC (rev 947) @@ -1,11 +1,7 @@ ---- #YAML:1.0 +# http://module-build.sourceforge.net/META-spec.html +#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: Panotools-Script -abstract: 'Read, write and manipulate hugin script files' -version: '0.20' -license: 'GPLv2+' -author: - - 'Bruno Postle <br...@po...>' -url: 'http://search.cpan.org/dist/Panotools-Script' +version: 0.21 version_from: lib/Panotools/Script.pm installdirs: site requires: @@ -14,6 +10,7 @@ File::Spec: 0.8 File::Temp: 0.1 Getopt::Long: 2 + Getopt::Std: 1 GraphViz: 1 Image::ExifTool: 6 Image::Size: 2.9 @@ -21,5 +18,6 @@ Pod::Usage: 1 Storable: 2 Test::More: 0.1 + distribution_type: module generated_by: ExtUtils::MakeMaker version 6.17 Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2009-02-09 21:40:09 UTC (rev 946) +++ trunk/Panotools-Script/Makefile.PL 2009-02-09 22:03:45 UTC (rev 947) @@ -9,11 +9,11 @@ 'bin/tif2svg', 'bin/enblend-svg', 'bin/pto2fulla', 'bin/ptoinfo', 'bin/ptopath', 'bin/qtvr2erect-gui', 'bin/tif2svg-gui', 'bin/ptoinfo-gui', 'bin/ptosort', 'bin/process-masks-gui', 'bin/enblend-svg-gui', 'bin/erect2qtvr-gui', 'bin/ptoclean', - 'bin/erect2mercator', 'bin/ptosplit', 'bin/ptomerge', 'bin/panostart', + 'bin/erect2mercator', 'bin/ptosplit', 'bin/ptomerge', 'bin/panostart', 'bin/ptsed', 'bin/ptscluster', 'bin/transform-pano', 'bin/nona-mask', 'bin/qtvr2erect', 'bin/ptocentre' ], 'VERSION_FROM' => 'lib/Panotools/Script.pm', # finds $VERSION 'PREREQ_PM' => {'bytes' => 0.0, 'File::Copy' => 1.0, 'Image::ExifTool' => 6.0, - 'Getopt::Long' => 2.0, 'Pod::Usage' => 1.0, 'GraphViz' => 1.0, + 'Getopt::Long' => 2.0, 'Pod::Usage' => 1.0, 'GraphViz' => 1.0, 'Getopt::Std' => 1.0, 'Test::More' => 0.1, 'Math::Trig' => 0.1, 'File::Temp' => 0.1, 'File::Spec' => 0.8, 'Image::Size' => 2.9, 'Storable' => 2.0}, ($] >= 5.005 ? ## Add these new keywords supported since 5.005 Added: trunk/Panotools-Script/bin/ptscluster =================================================================== --- trunk/Panotools-Script/bin/ptscluster (rev 0) +++ trunk/Panotools-Script/bin/ptscluster 2009-02-09 22:03:45 UTC (rev 947) @@ -0,0 +1,235 @@ +#!/usr/bin/perl -w + +# Iouri Ivliev 2008 + +use strict; +use Getopt::Std; +use Panotools::Script; + +$Getopt::Std::STANDARD_HELP_VERSION = 1; +our $VERSION = "0.0.2 (using Panotools::Script $Panotools::Script::VERSION)"; +our ($opt_D,$opt_d,$opt_o,$opt_r,$opt_x,$opt_y,$opt_O,$opt_B,$opt_b) = + (64, 3, undef, 0xa1 ,12, 9, 0, 0, 0); +getopts 'D:d:o:p:r:x:y:O:B:b:'; +(HELP_MESSAGE(\*STDERR),die "No input script\n") if $#ARGV<0; +(HELP_MESSAGE(\*STDERR),die "Only one input script allowed\n") if $#ARGV>0; + +sub HELP_MESSAGE { + my $h = shift; + my ($cmd) = ($0 =~ m,([^/\\]+)$,); + my $r = sprintf '0x%04x',$opt_r; + my $O = sprintf '0x%02x',$opt_O; + print $h <<EOM +Usage: $cmd [options] <script> +Options are: + -B - HFOV bounds size [$opt_B] + -b - VFOV bounds size [$opt_b] + -D - max distance [$opt_D] + -d - min distance [$opt_d] + -O - verbosity flags [$O] + 0x01 - script info + 0x02 - panorama info + 0x04 - images info + 0x08 - control points info + 0x10 - overall statistics + 0x20 - cluster statistics + -o - output script [undef] + -r - remove control points mask [$r] + 0x0001 - (point distance) > (max distance) + 0x0002 - (point distance) > (overall avg distance) + (overall stddev) + 0x0020 - (point distance) > (cluster avg distance) + (cluster stddev) + 0x0040 - (cluster avg distance) > (min distance) + and (point distance) - (cluster avg distance) > (cluster stddev) + 0x0080 - (point distance) > (min distance) + and (point direction) != (point direction of more then half + of points in cluster) + 0x2000 - control point near of panorama FOV bounds + 0x4000 - control point haven't corresponding morph control point, + probubly out of panorama FOV bounds + 0x8000 - "line" control point + -x - number of buckets on width [$opt_x] + -y - number of buckets on height [$opt_y] +EOM +} + +sub VERSION_MESSAGE { + my $h = shift; + my ($cmd) = ($0 =~ m,([^/\\]+)$,); + print $h <<EOM +$cmd $VERSION +Panorama Tools Script control points clustreing filter +EOM +} + +$opt_O = 0xff unless $opt_O or $opt_o; +sub verbose { + my $vf = shift; + printf STDOUT @_ if $vf & $opt_O; +} + +$opt_r = eval $opt_r; +$opt_O = eval $opt_O; + +use constant PI => 4*atan2(1,1); + +my $p = new Panotools::Script; +verbose 0x01,"Loading $ARGV[0]\n"; +$p->Read($ARGV[0]); +my ($i,$c,$C) = ($p->Image,$p->Control,$p->ControlMorph); +my ($in,$cn,$Cn) = (1+$#{$i},1+$#{$c},1+$#{$C}); +my ($W,$H,$V) = ($p->Panorama->{w},$p->Panorama->{h},$p->Panorama->{v}); +verbose 0x02,"Output panorama: %dx%d (HFOV: %d)\n",$W,$H,$V; +verbose 0x02,"Input images ('i'): $in\n"; +verbose 0x02,"Control points ('c'): $cn; Morph ('C'): $Cn\n"; + +my $NM = ($Cn and defined($C->[0]->{c})); # output of patched PToptimiser + +# overall statistics +my (@D,@F); +my ($MD,$mD,$aD,$aD2,$n,$N) = (-100000,100000,0,0,0,0); +my %ip; +CP: +for (my ($ci,$Ci)=(0,0); $ci<$cn; ++$ci) { + $c->[$ci]->{FLG} = 0x8000; + # skip "line" control points + next if $c->[$ci]->{t}; + ++$n; + $c->[$ci]->{FLG} = 0x4000; + $D[$ci] = 0; + $F[$ci] = 0; + # out of morph num or corresponding control point num greater (if defined) + next unless $Ci<$Cn and (not $NM or $C->[$Ci]->{c}==$ci); + #print "$Ci: ",join(':',%{$C->[$Ci]},"\n"); + ++$N; + $c->[$ci]->{FLG} = 0; + my $x = $C->[$Ci]->{x}; + my $y = $C->[$Ci]->{y}; + my $X = $C->[$Ci+1]->{x}; + my $Y = $C->[$Ci+1]->{y}; + my ($dx,$dy,$d); + if ($NM) { # patched PToptimiser - using distancies from morph control point line + $dx = $C->[$Ci]->{Dx}; + $dy = $C->[$Ci]->{Dy}; + $d = $C->[$Ci]->{D}; + } else { # original PToptimiser - using orthogonal as difference between morph (highly approximately) and distance as control point error. + $dx = $X-$x; + $dy = $Y-$y; + #$d = sqrt($dx*$dx+$dy*$dy); + $d = $c->[$ci]->Distance($p); + } + $Ci+=2; + if ($x<$opt_B or $y<$opt_b or $x>$W-$opt_B or $y>$H-$opt_b + or $X<$opt_B or $Y<$opt_b or $X>$W-$opt_B or $Y>$H-$opt_b) { + $c->[$ci]->{FLG} = 0x2000; + --$n; + --$N; + next CP; + } + my ($ipn,$ipN) = @{$c->[$ci]}{qw(n N)}; + my $ipk = sprintf '%04d/%04d',$ipn,$ipN; + ($ip{$ipk}->{n},$ip{$ipk}->{N}) = ($ipn,$ipN) unless exists $ip{$ipk}; + push @{$ip{$ipk}->{c}},$ci; + $D[$ci] = $d; + $F[$ci] = int(atan2($dx,$dy)*4/PI+.5)+4; + $MD = $d if $MD < $d; + $mD = $d if $mD > $d; + $aD += $d; + $aD2 += $d*$d; +} +verbose 0x10,"Normal control point(s) found: $n\n"; +verbose 0x10,"Morph control point pairs(s) found: $N\n"; +die "No control points\n" unless $n; +# overall stddev +$aD2 = sqrt(($aD2-$aD*$aD/$n)/$n); +# overall avg distance +$aD /= $n; +verbose 0x10,"Overall distance (min/avg/max stddev): %1.4f/%1.4f/%1.4f %1.4f\n", + $mD,$aD,$MD,$aD2; +die "No morph control points\n" unless $N; +die <<EOM +Each normal control point MUST have 2 morph control points (2*$n != $Cn) +Try to enlarge panorama HFOV ('v' variable) and/or height ('h' variable) +and run PToptimiser again +EOM + unless $NM or $N == $n; + +# cluster statistics +foreach my $ipk (sort keys %ip) { + my ($ii,$Ii) = @{$ip{$ipk}}{qw(n N)}; + my ($w,$h) = ($i->[$ii]->{w},$i->[$ii]->{h}); + my ($cw,$ch) = ($w/$opt_x,$h/$opt_y); + verbose 0x04,"Input images pair %d/%d: %dx%d/%dx%d; cluster size: %1.2fx%1.2f\n", + $ii,$Ii,$w,$h,$i->[$Ii]->{w},$i->[$Ii]->{h},$cw,$ch; + for (my $yi=0; $yi<$opt_y; ++$yi) { + for (my $xi=0; $xi<$opt_x; ++$xi) { + my ($x,$y) = ($xi*$cw,$yi*$ch); + my ($X,$Y) = ($x+$cw,$y+$ch); + verbose 0x04,"Cluster: (%1.2f,%1.2f)-(%1.2f,%1.2f)\n",$x,$y,$X,$Y; + my @cc = (); + foreach my $ci (@{$ip{$ipk}->{c}}) { + # out of this cluster + next if $c->[$ci]->{x}<$x or $c->[$ci]->{x}>=$X + or $c->[$ci]->{y}<$y or $c->[$ci]->{y}>=$Y; + # distance too big + if ($D[$ci]>$opt_D) { + $c->[$ci]->{FLG} |= 0x0001; + verbose 0x08,"%d\t0x%04x\t%1.4f %d%s\n", + $ci,$c->[$ci]->{FLG},$D[$ci],$F[$ci],($c->[$ci]->{FLG} & $opt_r)?' *':''; + } + # don't use for cluster statistics + next if $c->[$ci]->{FLG} & 0x0001; + push @cc,$ci; + } + $n = @cc; + verbose 0x08,"Control points found: %d\n",$n; + next if $n<1; + my ($cMD,$cmD,$caD,$caD2) = (-1000000,1000000,0,0); + my @ff = (undef,0,0,0,0,0,0,0,0); + foreach my $ci (@cc) { + $cMD = $D[$ci] if $cMD < $D[$ci]; + $cmD = $D[$ci] if $cmD > $D[$ci]; + $caD += $D[$ci]; + $caD2 += $D[$ci]*$D[$ci]; + ++$ff[$F[$ci]]; + } + # cluster stddev + $caD2 = sqrt(($caD2-$caD*$caD/$n)/$n); + # cluster avg distance + $caD /= $n; + verbose 0x20,"Cluster statistics:\n"; + verbose 0x20," distance (min/avg/max stddev): %1.4f/%1.4f/%1.4f %1.4f\n", + $cmD,$caD,$cMD,$caD2; + #cluster direction + my ($f,$fn) = (0,0); + foreach my $fi (1..8) { + if ($ff[$fi]>$fn) { + $f = $fi; + $fn = $ff[$fi]; + } + } + verbose 0x20," direction (val num/tot): %d %d/%d\n",$f,$fn,$n; + foreach my $ci (@cc) { + $c->[$ci]->{FLG} |= 0x0002 if $D[$ci]>$aD+$aD2*1.01; + $c->[$ci]->{FLG} |= 0x0020 if $D[$ci]>$caD+$caD2*1.01; + $c->[$ci]->{FLG} |= 0x0040 + if $caD>$opt_d and abs($D[$ci]-$caD)>$caD2*1.01; + $c->[$ci]->{FLG} |= 0x0080 + if $D[$ci]>$opt_d and $F[$ci]>0 and $fn>$n/2 and $F[$ci]!=$f; + verbose 0x08,"%d\t0x%04x\t%1.4f %d%s\n", + $ci,$c->[$ci]->{FLG},$D[$ci],$F[$ci],($c->[$ci]->{FLG} & $opt_r)?' *':''; + } + }} +} + +exit 0 unless defined $opt_o; + +verbose 0x01,'Removing bad control points:'; +for (my $ci=$cn; $ci--; ) { + (delete $c->[$ci]->{FLG},next) unless $c->[$ci]->{FLG} & $opt_r; + verbose 0x01," $ci"; + splice @$c,$ci,1; +} +verbose 0x01,"\n"; + +verbose 0x01,"Saving $opt_o\n"; +$p->Write($opt_o); Property changes on: trunk/Panotools-Script/bin/ptscluster ___________________________________________________________________ Added: svn:executable + * Added: trunk/Panotools-Script/bin/ptsed =================================================================== --- trunk/Panotools-Script/bin/ptsed (rev 0) +++ trunk/Panotools-Script/bin/ptsed 2009-02-09 22:03:45 UTC (rev 947) @@ -0,0 +1,226 @@ +#!/usr/bin/perl -w + +# Iouri Ivliev 2008 + +use strict; +use Getopt::Std; +use Panotools::Script; + +$Getopt::Std::STANDARD_HELP_VERSION = 1; +our $VERSION = "0.0.2 (using Panotools::Script $Panotools::Script::VERSION)"; +our ($opt_C,$opt_I,$opt_M,$opt_P,$opt_V) = + (undef, undef, undef, undef, undef); +our ($opt_O,$opt_i,$opt_o,$opt_r,$opt_s) = + (0, undef, undef, undef, undef); +getopts 'C:I:M:P:V:O:io:rs'; +(HELP_MESSAGE(\*STDERR),die "No input script\n") if $#ARGV<0; +(HELP_MESSAGE(\*STDERR),die "Only one input script allowed\n") if $#ARGV>0; + +sub HELP_MESSAGE { + my $h = shift; + my ($cmd) = ($0 =~ m,([^/\\]+)$,); + print $h <<EOM +Usage: $cmd [options] <script> +Options are: + -C - set control point line(s) variables + -I - set input image line(s) variables + -M - set mode line variables + -O - verbosity flags + 0x01 - script info + 0x02 - panorama and mode info + 0x04 - images info + 0x08 - control points info + -P - set panorama line variables + -V - set optimisation line(s) variables + -i - update input image line(s) based on PToptimiser output line(s) + implies -r + -o - output script file + -r - remove output line(s) and morph control point(s) + -s - remove variables unrecognized by PToptimiser +EOM +} + +sub VERSION_MESSAGE { + my $h = shift; + my ($cmd) = ($0 =~ m,([^/\\]+)$,); + print $h <<EOM +$cmd $VERSION +Panorama Tools Script command line editor +EOM +} + + +$opt_O = 0xff unless $opt_O or $opt_o; +$opt_O = eval $opt_O; +sub verbose { + my $vf = shift; + printf STDOUT @_ if $vf & $opt_O; +} + +sub getvars { + split /,/,shift; +} + +sub getnums { + my $n = shift; + --$n; + my @i; + foreach (@_) { + foreach (split /,/,$_) { + (push(@i,$_),next) unless /^(\d+)-(\d+)?/; + push @i,($1..($2?$2:$n)); + } + } + @i; +} + + +my $P = new Panotools::Script; +verbose 0x01,"Loading $ARGV[0]\n"; +$P->Read($ARGV[0]); +my ($p,$m) = ($P->Panorama,$P->Mode); +my ($i,$c,$o) = ($P->Image,$P->Control,$P->Output); +my ($in,$cn,$on) = (1+$#{$i},1+$#{$c},1+$#{$o}); +my $v = $P->Variable; +verbose 0x02,"Output panorama: %dx%d (HFOV: %d)\n",$p->{w},$p->{h},$p->{v}; +verbose 0x02,"Input images ('i'): $in; Output images ('o'): $on\n"; +verbose 0x02,"Control points ('c'): $cn\n"; + +$P->Output2Image if (!$in or $opt_i) and $on; + +if (defined $opt_P) { + verbose 0x8000,"DEBUG: panorama line variables '%s'\n",$opt_P; + my %p = split /:/,$opt_P; + foreach (keys %p) { + my $val = $p{$_}; + verbose 0x8000,"DEBUG: vars = '%s'; val = '%s'\n",$_,$val; + my @v = getvars $_; + verbose 0x8000,"DEBUG: vars = %s\n",join ',',@v; + my $valid = Panotools::Script::Line::Panorama::_valid; + foreach my $vn (@v) { + $vn =~ /$valid/ + or die "Incorrect panorama line variables syntax: expecting <vars>:<val>[:<vars>:<val>]\n\tvars are $valid\n"; + verbose 0x02, + "Panorama variable %s: %s => %s\n", + $vn,defined($p->{$vn})?$p->{$vn}:'<undef>',$val; + $p->{$vn} = $val; + } + } +} + +if (defined $opt_M) { + verbose 0x8000,"DEBUG: mode line variables '%s'\n",$opt_M; + my %m = split /:/,$opt_M; + foreach (keys %m) { + my $val = $m{$_}; + verbose 0x8000,"DEBUG: vars = '%s'; val = '%s'\n",$_,$val; + my @v = getvars $_; + verbose 0x8000,"DEBUG: vars = %s\n",join ',',@v; + my $valid = Panotools::Script::Line::Mode::_valid; + foreach my $vn (@v) { + $vn =~ /$valid/ + or die "Incorrect mode line variables syntax: expecting <vars>:<val>[:<vars>:<val>]\n\tvars are $valid\n"; + verbose 0x02, + "Mode variable %s: %s => %s\n", + $vn,defined($m->{$vn})?$m->{$vn}:'<undef>',$val; + $m->{$vn} = $val; + } + } +} + +if (defined $opt_I) { + verbose 0x8000,"DEBUG: input image line(s) variables '%s'\n",$opt_I; + my %i = split /:/,$opt_I; + foreach (keys %i) { + my ($vars,$imgs) = split /\//,$_; + my $val = $i{$_}; + verbose 0x8000,"DEBUG: vars = '%s'; imgs = '%s'\n",$vars,$imgs; + my @v = getvars $vars; + verbose 0x8000,"DEBUG: vars = %s\n",join ',',@v; + my @i = getnums $in,$imgs; + verbose 0x8000,"DEBUG: imgs = %s\n",join ',',@i; + my $valid = Panotools::Script::Line::Image::_valid; + foreach my $vn (@v) { + $vn =~ /$valid/ + or die "Incorrect input image line(s) variables syntax: expecting <vars>/<imgs>:<val>[:<vars>/<imgs>:<val>]\n\tvars are $valid\n"; + foreach my $ii (@i) { + my $nv = $val; + $nv = sprintf $val,$ii if $vn eq 'n'; + verbose 0x04, + "Input image %d variable %s: %s => %s\n", + $ii,$vn, + defined($i->[$ii]->{$vn})?$i->[$ii]->{$vn}:'<undef>', + $nv; + $i->[$ii]->{$vn} = $nv; + } + } + } +} + +if (defined $opt_V) { + delete @$v{keys %$v}; + verbose 0x8000,"DEBUG: optimisation line(s) variables '%s'\n",$opt_V; + foreach (split /:/,$opt_V) { + my ($vars,$imgs) = split /\//,$_; + verbose 0x8000,"DEBUG: vars = '%s'; imgs = '%s'\n",$vars,$imgs; + my @v = getvars $vars; + verbose 0x8000,"DEBUG: vars = %s\n",join ',',@v; + my @i = getnums $in,$imgs; + verbose 0x8000,"DEBUG: imgs = %s\n",join ',',@i; + my $valid = Panotools::Script::Line::Variable::_valid; + foreach my $vn (@v) { + $vn =~ /$valid/ + or die "Incorrect optimisation line(s) variables syntax: expecting <vars>/<imgs>[:<vars>/<imgs>]\n\tvars are $valid\n"; + foreach my $ii (@i) { + $v->{$ii}->{$vn} = 1; + if (defined($i->[$ii]->{$vn}) and $i->[$ii]->{$vn} eq '=0') { + $i->[$ii]->{$vn} = 0; + verbose 0x04, + "Input image %d variable %s: =0 => 0\n",$ii,$vn; + } + } + } + } +} + +if (defined $opt_C) { + verbose 0x8000,"DEBUG: control point line(s) variables '%s'\n",$opt_C; + my %c = split /:/,$opt_C; + foreach (keys %c) { + my ($vars,$cps) = split /\//,$_; + my $val = $c{$_}; + verbose 0x8000,"DEBUG: vars = '%s'; imgs = '%s'\n",$vars,$cps; + my @v = getvars $vars; + verbose 0x8000,"DEBUG: vars = %s\n",join ',',@v; + my @c = getnums $cn,$cps; + verbose 0x8000,"DEBUG: imgs = %s\n",join ',',@c; + my $valid = Panotools::Script::Line::Control::_valid; + foreach my $vn (@v) { + $vn =~ /$valid/ + or die "Incorrect control point line(s) variables syntax: expecting <vars>/<cps>:<val>[:<vars>/<cps>:<val>]\n\tvars are $valid\n"; + foreach my $ci (@c) { + verbose 0x04, + "Control point %d variable %s: %s => %s\n", + $ci,$vn, + defined($c->[$ci]->{$vn})?$c->[$ci]->{$vn}:'<undef>', + $val; + $c->[$ci]->{$vn} = $val; + } + } + } +} + +exit 0 unless defined $opt_o; + +verbose 0x10,"Saving $opt_o\n"; +if ($opt_s) { + delete $p->{E}; + delete $p->{R}; + delete $p->{S}; + delete @$_{qw(Eb Eev Er Ra Rb Rc Rd Re Va Vb Vc Vd Vx Vy)} for @$i; +} +if ($opt_r or $opt_i) { + splice @$o,0; + splice @{$P->ControlMorph},0; +} +$P->Write($opt_o); Property changes on: trunk/Panotools-Script/bin/ptsed ___________________________________________________________________ Added: svn:executable + * Modified: trunk/Panotools-Script/dos/make_exe.pl =================================================================== --- trunk/Panotools-Script/dos/make_exe.pl 2009-02-09 21:40:09 UTC (rev 946) +++ trunk/Panotools-Script/dos/make_exe.pl 2009-02-09 22:03:45 UTC (rev 947) @@ -31,6 +31,8 @@ ptoset ptosort ptosplit +ptsed +ptscluster qtvr2erect tif2svg transform-pano/; Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2009-02-09 21:40:09 UTC (rev 946) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2009-02-09 22:03:45 UTC (rev 947) @@ -36,7 +36,7 @@ use Storable qw/ dclone /; -our $VERSION = '0.20'; +our $VERSION = '0.21'; our $CLEANUP = 1; $CLEANUP = 0 if defined $ENV{DEBUG}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-02-26 21:05:42
|
Revision: 954 http://panotools.svn.sourceforge.net/panotools/?rev=954&view=rev Author: brunopostle Date: 2009-02-26 21:05:31 +0000 (Thu, 26 Feb 2009) Log Message: ----------- Use ImageMagick to workaround matchpoint alpha channel bug Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/match-n-shift Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-02-23 22:18:56 UTC (rev 953) +++ trunk/Panotools-Script/Changes 2009-02-26 21:05:31 UTC (rev 954) @@ -1,5 +1,8 @@ Revision history for Panotools::Script. +0.22 + - Use ImageMagick to workaround matchpoint alpha channel bug + 0.21 - ptoclean, don't give autooptimiser projects with invalid lenses - ptosplit choked on images without associated 'v' lines (Ryan Helinski) Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2009-02-23 22:18:56 UTC (rev 953) +++ trunk/Panotools-Script/bin/match-n-shift 2009-02-26 21:05:31 UTC (rev 954) @@ -187,6 +187,7 @@ next if (-e $path_key and not $clean); if ($matchpoint) { + system ('mogrify', '+matte', $path_output_small); system ('matchpoint', $path_output_small, $path_key); } else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-04-01 19:12:00
|
Revision: 958 http://panotools.svn.sourceforge.net/panotools/?rev=958&view=rev Author: brunopostle Date: 2009-04-01 19:11:52 +0000 (Wed, 01 Apr 2009) Log Message: ----------- panostart --nostacks option for point-and-shoot sequences with random exposure Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-03-19 20:26:16 UTC (rev 957) +++ trunk/Panotools-Script/Changes 2009-04-01 19:11:52 UTC (rev 958) @@ -2,6 +2,7 @@ 0.22 - Use ImageMagick to workaround matchpoint alpha channel bug + - panostart --nostacks option for point-and-shoot sequences with random exposure 0.21 - ptoclean, don't give autooptimiser projects with invalid lenses Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2009-03-19 20:26:16 UTC (rev 957) +++ trunk/Panotools-Script/bin/panostart 2009-04-01 19:11:52 UTC (rev 958) @@ -14,6 +14,7 @@ my $crop_s; my $help = 0; my $verbose = 0; +my $nostacks = 0; my @argv_save = @ARGV; @@ -23,6 +24,7 @@ 'v|fov=s' => \$deg_fov, 'k|selection=s' => \$crop_s, 'l|loquacious' => \$verbose, + 'n|nostacks' => \$nostacks, 'h|help' => \$help); pod2usage (-verbose => 2) if $help; @@ -106,7 +108,9 @@ my $rule_pto = new File::Pto::Mk::Rule; $rule_pto->Targets ("$stub.pto"); $rule_pto->Prerequisites (@{$group}); - $rule_pto->Command ('match-n-shift', '--stacks', '--align', + my @stacks = '--stacks'; + @stacks = () if $nostacks; + $rule_pto->Command ('match-n-shift', @stacks, '--align', '$(AP_EXTRA_ARGS)', '--output', "$stub.pto"); $rule_pto->Command ('--projection', $projection) if defined $projection; $rule_pto->Command ('--fov', $deg_fov) if defined $deg_fov; @@ -199,6 +203,7 @@ sub is_stacks { + return 0 if $nostacks; my $speeds = {}; for my $path_photo (@_) { @@ -283,6 +288,7 @@ 3 for full-frame fisheye images. -v | --fov Horizontal field of view in degrees -k | --selection Crop selection boundary, eg -459,2459,-57,2861 + -n | --nostacks Don't try and align stacks for point and shoot cameras -h | --help Outputs help documentation. -l | --loquacious Verbose output listing targets and numbers of images. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-04-15 16:30:28
|
Revision: 959 http://panotools.svn.sourceforge.net/panotools/?rev=959&view=rev Author: brunopostle Date: 2009-04-15 16:30:11 +0000 (Wed, 15 Apr 2009) Log Message: ----------- Oops Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/match-n-shift trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-04-01 19:11:52 UTC (rev 958) +++ trunk/Panotools-Script/Changes 2009-04-15 16:30:11 UTC (rev 959) @@ -3,6 +3,7 @@ 0.22 - Use ImageMagick to workaround matchpoint alpha channel bug - panostart --nostacks option for point-and-shoot sequences with random exposure + - match-n-shift workaround EXIF exposure time in both decimal and fractions 0.21 - ptoclean, don't give autooptimiser projects with invalid lenses Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2009-04-01 19:11:52 UTC (rev 958) +++ trunk/Panotools-Script/bin/match-n-shift 2009-04-15 16:30:11 UTC (rev 959) @@ -96,11 +96,18 @@ { my $longest; + my $sec_longest; for my $et (keys %{$speeds}) { - $et =~ s/1\///; + my $sec_et = $et; + if ($sec_et =~ /^1\/([0-9]+)$/) + { + $sec_et = 1 / $1; + } + $longest = $et unless defined $longest; - $longest = $et if $et < $longest; + $sec_longest = $sec_et unless defined $sec_longest; + $longest = $et if $sec_et > $sec_longest; } print STDERR "Longest exposure: $longest\n"; @@ -110,7 +117,7 @@ { my $exif_info = Image::ExifTool::ImageInfo ($path_photo, 'ExposureTime', 'ShutterSpeed'); my $et = $exif_info->{ExposureTime} || $exif_info->{ShutterSpeed}; - push @{$bases}, $path_photo if $et eq "1/$longest"; + push @{$bases}, $path_photo if $et eq $longest; } my $stacks; Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2009-04-01 19:11:52 UTC (rev 958) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2009-04-15 16:30:11 UTC (rev 959) @@ -36,7 +36,7 @@ use Storable qw/ dclone /; -our $VERSION = '0.21'; +our $VERSION = '0.22'; our $CLEANUP = 1; $CLEANUP = 0 if defined $ENV{DEBUG}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-04-28 16:20:12
|
Revision: 961 http://panotools.svn.sourceforge.net/panotools/?rev=961&view=rev Author: brunopostle Date: 2009-04-28 16:20:08 +0000 (Tue, 28 Apr 2009) Log Message: ----------- ptovariable tool to set optimisation variable 'v' lines Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/Makefile.PL trunk/Panotools-Script/lib/Panotools/Script/Line/Variable.pm Added Paths: ----------- trunk/Panotools-Script/bin/ptovariable Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-04-25 16:50:07 UTC (rev 960) +++ trunk/Panotools-Script/Changes 2009-04-28 16:20:08 UTC (rev 961) @@ -4,6 +4,7 @@ - Use ImageMagick to workaround matchpoint alpha channel bug - panostart --nostacks option for point-and-shoot sequences with random exposure - match-n-shift workaround EXIF exposure time in both decimal and fractions + - unfinished tool ptovariable for setting optimisation parameters 0.21 - ptoclean, don't give autooptimiser projects with invalid lenses Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2009-04-25 16:50:07 UTC (rev 960) +++ trunk/Panotools-Script/MANIFEST 2009-04-28 16:20:08 UTC (rev 961) @@ -27,6 +27,7 @@ bin/ptoset bin/ptosort bin/ptosplit +bin/ptovariable bin/ptsed bin/ptscluster bin/qtvr2erect Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2009-04-25 16:50:07 UTC (rev 960) +++ trunk/Panotools-Script/Makefile.PL 2009-04-28 16:20:08 UTC (rev 961) @@ -7,7 +7,7 @@ 'bin/jpeg2qtvr', 'bin/erect2qtvr', 'bin/enblend-mask', 'bin/match-n-shift', 'bin/ptoset', 'bin/process-masks', 'bin/erect2planet', 'bin/pto2tiff', 'bin/ptograph', 'bin/ptoget', 'bin/tif2svg', 'bin/enblend-svg', 'bin/pto2fulla', 'bin/ptoinfo', 'bin/ptopath', - 'bin/qtvr2erect-gui', 'bin/tif2svg-gui', 'bin/ptoinfo-gui', 'bin/ptosort', + 'bin/qtvr2erect-gui', 'bin/tif2svg-gui', 'bin/ptoinfo-gui', 'bin/ptosort', 'bin/ptovariable', 'bin/process-masks-gui', 'bin/enblend-svg-gui', 'bin/erect2qtvr-gui', 'bin/ptoclean', 'bin/erect2mercator', 'bin/ptosplit', 'bin/ptomerge', 'bin/panostart', 'bin/ptsed', 'bin/ptscluster', 'bin/transform-pano', 'bin/nona-mask', 'bin/qtvr2erect', 'bin/ptocentre' ], Added: trunk/Panotools-Script/bin/ptovariable =================================================================== --- trunk/Panotools-Script/bin/ptovariable (rev 0) +++ trunk/Panotools-Script/bin/ptovariable 2009-04-28 16:20:08 UTC (rev 961) @@ -0,0 +1,126 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; +use Getopt::Long; +use Pod::Usage; + +my $help = 0; +my $positions = 0; +my $view = 0; +my $barrel = 0; +my $centre = 0; +my $vignetting = 0; +my $vignetting_centre = 0; +my $response = 0; +my $exposure = 0; +my $white_balance = 0; +my $path_output; + +GetOptions ('p|positions' => \$positions, + 'v|view' => \$view, + 'b|barrel' => \$barrel, + 'c|centre' => \$centre, + 'p|positions' => \$positions, + 'm|vignetting' => \$vignetting, + 'n|vignetting-centre' => \$vignetting_centre, + 'r|response' => \$response, + 'e|exposure' => \$exposure, + 'w|white-balance' => \$white_balance, + 'o|output=s' => \$path_output, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; + +my $path_pto = shift || pod2usage; +die "Can't find $path_pto" unless -e $path_pto; +$path_output = $path_pto unless defined $path_output; + +my $pto = new Panotools::Script; +$pto->Read ($path_pto); + +my $variable = $pto->Variable; + +# FIXME assumes image 0 is anchor +my $anchor = $variable->{0}; + +$anchor->{v} = $view; + +$anchor->{b} = $barrel; + +$anchor->{d} = $centre; +$anchor->{e} = $centre; + +$anchor->{Vb} = $vignetting; +$anchor->{Vc} = $vignetting; +$anchor->{Vd} = $vignetting; + +$anchor->{Vx} = $vignetting_centre; +$anchor->{Vy} = $vignetting_centre; + +$anchor->{Ra} = $response; +$anchor->{Rb} = $response; +$anchor->{Rc} = $response; +$anchor->{Rd} = $response; +$anchor->{Re} = $response; + +# FIXME assumes image 0 is anchor +for my $index (1 .. scalar @{$pto->Image} -1) +{ + $variable->{$index}->{r} = $positions; + $variable->{$index}->{p} = $positions; + $variable->{$index}->{y} = $positions; + + $variable->{$index}->{Eev} = $exposure; + + $variable->{$index}->{Er} = $white_balance; + $variable->{$index}->{Eb} = $white_balance; +} + +$pto->Write ($path_output); + +__END__ + +=head1 NAME + +ptovariable - prepare a pto project for typical optimisation tasks + +=head1 SYNOPSIS + +ptovariable [options] project.pto + + Options: + -p | --positions Optimise positions + -v | --view Optimise angle of view + -b | --barrel Optimise barrel distortion + -c | --centre Optimise optical centre + -m | --vignetting Optimise vignetting + -n | --vignetting-centre Optimise vignetting centre + -r | --response Optimise camera response EMoR parameters + -e | --exposure Optimise exposure (EV) + -w | --white-balance Optimise colour balance + -o | --output OUTFILE Specify output file default is to overwrite input + -h | --help Outputs help documentation + +=head1 DESCRIPTION + +B<ptovariable> sets optimisation variable 'v' lines for a hugin .pto project. +Usually this is a preparation for optimisation with autooptimiser or +vig_optimize. + +=head1 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. + +=head1 SEE ALSO + +L<http://hugin.sourceforge.net/> + +=head1 AUTHOR + +Bruno Postle - April 2009. + +=cut Property changes on: trunk/Panotools-Script/bin/ptovariable ___________________________________________________________________ Added: svn:executable + * Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/Variable.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/Variable.pm 2009-04-25 16:50:07 UTC (rev 960) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/Variable.pm 2009-04-28 16:20:08 UTC (rev 961) @@ -77,6 +77,7 @@ my @tokens; for my $param (sort keys %{$self->{$image}}) { + next unless $self->{$image}->{$param}; push @tokens, $param . $image; } $string .= (join ' ', ($self->Identifier, @tokens)) ."\n"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-05-17 09:54:29
|
Revision: 971 http://panotools.svn.sourceforge.net/panotools/?rev=971&view=rev Author: brunopostle Date: 2009-05-17 09:54:23 +0000 (Sun, 17 May 2009) Log Message: ----------- match-n-shift does photometric optimisation unless --stacks specified Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/match-n-shift trunk/Panotools-Script/dos/make_exe.pl Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-05-15 08:09:27 UTC (rev 970) +++ trunk/Panotools-Script/Changes 2009-05-17 09:54:23 UTC (rev 971) @@ -5,6 +5,7 @@ - panostart --nostacks option for point-and-shoot sequences with random exposure - match-n-shift workaround EXIF exposure time in both decimal and fractions - unfinished tool ptovariable for setting optimisation parameters + - match-n-shift does photometric optimisation unless --stacks specified 0.21 - ptoclean, don't give autooptimiser projects with invalid lenses Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2009-05-15 08:09:27 UTC (rev 970) +++ trunk/Panotools-Script/bin/match-n-shift 2009-05-17 09:54:23 UTC (rev 971) @@ -339,6 +339,11 @@ system ('autooptimiser', '-a', '-l', '-s', '-o', $tempfile, $tempfile); system ('ptoclean', '-o', $tempfile, $tempfile); system ('autooptimiser', '-n', '-l', '-o', $path_oto, $tempfile); + unless ($dostacks) + { + system ('ptovariable', '--vignetting', '--response', '--exposure', $path_oto); + system ('vig_optimize', '-o', $path_oto, $path_oto); + } } # voodoo Modified: trunk/Panotools-Script/dos/make_exe.pl =================================================================== --- trunk/Panotools-Script/dos/make_exe.pl 2009-05-15 08:09:27 UTC (rev 970) +++ trunk/Panotools-Script/dos/make_exe.pl 2009-05-17 09:54:23 UTC (rev 971) @@ -31,6 +31,7 @@ ptoset ptosort ptosplit +ptovariable ptsed ptscluster qtvr2erect This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2009-05-24 12:53:43
|
Revision: 978 http://panotools.svn.sourceforge.net/panotools/?rev=978&view=rev Author: brunopostle Date: 2009-05-24 12:53:35 +0000 (Sun, 24 May 2009) Log Message: ----------- erect2qtvr uses sips instead of ImageMagick on OS X (Harry van der Wolf) Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/erect2qtvr Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2009-05-23 00:51:49 UTC (rev 977) +++ trunk/Panotools-Script/Changes 2009-05-24 12:53:35 UTC (rev 978) @@ -6,6 +6,7 @@ - match-n-shift workaround EXIF exposure time in both decimal and fractions - unfinished tool ptovariable for setting optimisation parameters - match-n-shift does photometric optimisation unless --stacks specified + - erect2qtvr uses sips instead of ImageMagick on OS X 0.21 - ptoclean, don't give autooptimiser projects with invalid lenses Modified: trunk/Panotools-Script/bin/erect2qtvr =================================================================== --- trunk/Panotools-Script/bin/erect2qtvr 2009-05-23 00:51:49 UTC (rev 977) +++ trunk/Panotools-Script/bin/erect2qtvr 2009-05-24 12:53:35 UTC (rev 978) @@ -71,7 +71,14 @@ # generate JPEG cubefaces for my $index (0 .. 5) { - system ('convert', '-quality', $quality, "$prefix-face000$index.tif", "$prefix-face000$index.jpg"); + if ($^O eq "darwin") + { + system ('sips', '-s', 'format', 'jpeg', '-s', 'formatOptions', $quality, "$prefix-face000$index.tif", '--out', "$prefix-face000$index.jpg"); + } + else + { + system ('convert', '-quality', $quality, "$prefix-face000$index.tif", "$prefix-face000$index.jpg"); + } } # fisheye cubefaces for preview track @@ -92,12 +99,26 @@ for my $index (0 .. 5) { # generate JPEG preview cubefaces - system ('mogrify', '-geometry', '32x32', "$prefix-preview000$index.tif"); + if ($^O eq "darwin") + { + system ('sips', '-z', '32', '32', "$prefix-preview000$index.tif"); + } + else + { + system ('mogrify', '-geometry', '32x32', "$prefix-preview000$index.tif"); + } $scratch->Image->[0]->Set (w => 32, h => 32, v => 100, f => 3, r => 0, p => 0, y => 0, n => "\"$prefix-preview000$index.tif\""); $scratch->Write ($pto_temp); system ('nona', '-o', "$prefix-preview-rectilinear.tif", $pto_temp); unlink $pto_temp; - system ('convert', '-quality', $quality, "$prefix-preview-rectilinear.tif", "$prefix-preview000$index.jpg"); + if ($^O eq "darwin") + { + system ('sips', '-s', 'format', 'jpeg', '-s', 'formatOptions', $quality, "$prefix-preview-rectilinear.tif", '--out', "$prefix-preview000$index.jpg"); + } + else + { + system ('convert', '-quality', $quality, "$prefix-preview-rectilinear.tif", "$prefix-preview000$index.jpg"); + } } print "Tempdir: $tempdir\n" unless $cleanup; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |