From: <bru...@us...> - 2008-07-31 21:57:19
|
Revision: 862 http://panotools.svn.sourceforge.net/panotools/?rev=862&view=rev Author: brunopostle Date: 2008-07-31 21:57:27 +0000 (Thu, 31 Jul 2008) Log Message: ----------- Preserve 'disabled' flag for images (Felix Hagemann) Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/lib/Panotools/Script/Line/ImageMetadata.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-07-30 17:56:15 UTC (rev 861) +++ trunk/Panotools-Script/Changes 2008-07-31 21:57:27 UTC (rev 862) @@ -3,6 +3,7 @@ 0.16 - Read() and Write() accept STDIN and STDOUT using '-' placeholder - ptosort now allows sorting many aspects of .pto projects (Felix Hagemann) + - Preserve 'disabled' flag for images (Felix Hagemann) 0.15 - Fix for ptograph negative coordinates (Felix Hagemann) Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/ImageMetadata.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/ImageMetadata.pm 2008-07-30 17:56:15 UTC (rev 861) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/ImageMetadata.pm 2008-07-31 21:57:27 UTC (rev 862) @@ -27,7 +27,14 @@ my @tokens; for my $entry (sort keys %{$self}) { - push @tokens, $entry .'='. $self->{$entry}; + if ($entry eq "disabled") + { + push @tokens, $entry; + } + else + { + push @tokens, $entry .'='. $self->{$entry}; + } } return (join ' ', ($self->Identifier, @tokens)) ."\n" if (@tokens); } @@ -37,7 +44,7 @@ my $self = shift; } -sub _valid { return '^([[:alnum:]]+)=(.*)' } +sub _valid { return '^([^=]+)(?:=(.*)|)$' } sub Identifier { @@ -51,7 +58,7 @@ my $valid = $self->_valid; for my $key (keys %{$self}) { - delete $self->{$key} unless (grep /$valid/, "$key="); + delete $self->{$key} unless ( grep /$valid/, "$key=" || grep /$valid/, "$key" ); } } @@ -61,9 +68,16 @@ my @report; for my $entry (sort keys %{$self}) { - my @tokens = $entry =~ /(^[a-z]+|[A-Z][a-z]+|[A-Z][A-Z]+(?=[A-Z][a-z]))/g; - my $name = join ' ', @tokens; - push @report, [$name, $self->{$entry}] unless ($self->{$entry} =~ /false/i); + if ($entry eq "disabled") + { + push @report, ["State",$entry]; + } + else + { + my @tokens = $entry =~ /(^[a-z]+|[A-Z][a-z]+|[A-Z][A-Z]+(?=[A-Z][a-z]))/g; + my $name = join ' ', @tokens; + push @report, [$name, $self->{$entry}] unless ($self->{$entry} =~ /false/i); + } } [@report]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-08-21 00:39:16
|
Revision: 871 http://panotools.svn.sourceforge.net/panotools/?rev=871&view=rev Author: brunopostle Date: 2008-08-21 00:39:26 +0000 (Thu, 21 Aug 2008) Log Message: ----------- match-n-shift --stacks option to use align_image_stack as well as autopano-sift when EXIF data suggests there are bracketed series 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 2008-08-12 03:28:10 UTC (rev 870) +++ trunk/Panotools-Script/Changes 2008-08-21 00:39:26 UTC (rev 871) @@ -4,6 +4,7 @@ - Read() and Write() accept STDIN and STDOUT using '-' placeholder - ptosort now allows sorting many aspects of .pto projects (Felix Hagemann) - Preserve 'disabled' flag for images (Felix Hagemann) + - match-n-shift --stacks option to use align_image_stack 0.15 - Fix for ptograph negative coordinates (Felix Hagemann) Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2008-08-12 03:28:10 UTC (rev 870) +++ trunk/Panotools-Script/bin/match-n-shift 2008-08-21 00:39:26 UTC (rev 871) @@ -6,6 +6,7 @@ use Getopt::Long; use Pod::Usage; use Image::Size; +use Image::ExifTool; use Math::Trig; use Panotools::Script; use File::Temp qw/tempdir/; @@ -16,6 +17,7 @@ my $noransac = 0; my $matchpoint = 0; my $refine = 0; +my $dostacks = 0; my $projection = 0; my $deg_fov = 50; my $crop_s = undef; @@ -29,6 +31,7 @@ 'n|noransac' => \$noransac, 'm|matchpoint' => \$matchpoint, 'r|refine' => \$refine, + 'b|stacks' => \$dostacks, 'f|projection=i' => \$projection, 'v|fov=s' => \$deg_fov, 'k|selection=s' => \$crop_s, @@ -36,6 +39,8 @@ 'c|clean' => \$clean, 'h|help' => \$help); +# code assumes images are sorted +@ARGV = sort @ARGV; my @paths_input = @ARGV; pod2usage (-verbose => 2) if $help; @@ -53,6 +58,70 @@ my $tempdir = tempdir (CLEANUP => $clean); print STDERR "using $tempdir\n"; + +# try and so something sane with bracketed stacks +my $index_stack = 0; +if ($dostacks) +{ + my @photos = map (File::Spec->rel2abs ($_), @ARGV); + + my $speeds; + for my $path_photo (@photos) + { + my $exif_info = Image::ExifTool::ImageInfo ($path_photo, 'ExposureTime', 'ShutterSpeed'); + my $et = $exif_info->{ExposureTime} || $exif_info->{ShutterSpeed}; + $speeds->{$et} = 'TRUE'; + } + + my $brackets = scalar keys (%{$speeds}); + print STDERR "$brackets shutter speeds found.\n"; + die "Number of images not divisible by $brackets" if scalar (@photos) % $brackets; + + if ($brackets < 2) + { + print STDERR "Not attempting to align stacks.\n"; + $dostacks = 0; + } + next unless ($dostacks); + + my $longest; + for my $et (keys %{$speeds}) + { + $et =~ s/1\///; + $longest = $et unless defined $longest; + $longest = $et if $et < $longest; + } + + print STDERR "Longest exposure: $longest\n"; + + my $bases; + for my $path_photo (@photos) + { + 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"; + } + + my $stacks; + while (@photos) + { + my @stack; + push @stack, shift @photos for (1 .. $brackets); + push @{$stacks}, [@stack]; + } + + for my $stack (@{$stacks}) + { + my @projection = (); + @projection = ('-e') if ($projection == 2 or $projection == 3); + system ('align_image_stack', @projection, '-f', $deg_fov, '-p', File::Spec->catfile ($tempdir, "stack_$index_stack.pto"), @{$stack}); + $index_stack++; + } + + @paths_input = @{$bases}; +} + + my $index = 0; for my $path_input (@paths_input) @@ -182,21 +251,62 @@ $point->{Y} *= $N_scale_h; } -# fix image lines +# revert to original image filenames $index = 0; for my $image (@{$oto->Image}) { $image->{n} = '"'. $paths_input[$index] .'"'; - ($image->{w}, $image->{h}) = imgsize (File::Spec->rel2abs ($paths_input[$index])); + $index++; +} + +# merge stacks +if ($dostacks) +{ + my $tempfile = File::Spec->catfile ($tempdir, 'bases.oto'); + $oto->Write ($tempfile); + + my @ptos = ($tempfile); + + for my $i (0 .. $index_stack -1) + { + push @ptos, File::Spec->catfile ($tempdir, "stack_$i.pto"); + } + + my $temp_merged = File::Spec->catfile ($tempdir, 'merged.oto'); + system ('ptomerge', @ptos, $temp_merged); + my $temp_sorted = File::Spec->catfile ($tempdir, 'sorted.oto'); + system ('ptosort', '--image', 'n', $temp_merged, $temp_sorted); + $oto->Read ($temp_sorted); + $oto->Option->{outputLDRBlended} = 'false'; + $oto->Option->{outputLDRExposureBlended} = 'true'; +} + +# FIXME +$oto->Write ('abc'); + +$index = 0; +for my $image (@{$oto->Image}) +{ + ($image->{w}, $image->{h}) = imgsize (File::Spec->rel2abs ($ARGV[$index])); $image->{S} = $crop_s if defined $crop_s; # link all lens parameters $image->Set (v => '=0', d => '=0', e => '=0', + a => '=0', b => '=0', c => '=0', g => '=0', t => '=0', Ra => '=0', Rb => '=0', Rc => '=0', Rd => '=0', Re => '=0', Va => '=0', Vb => '=0', Vc => '=0', Vd => '=0', Vx => '=0', Vy => '=0') if ($index > 0); + $image->Set (v => $deg_fov, d => 0, e => 0, + a => 0, b => 0, c => 0, g => 0, t => 0, + Ra => 0, Rb => 0, Rc => 0, Rd => 0, Re => 0, + Va => 1, Vb => 0, Vc => 0, Vd => 0, Vx => 0, Vy => 0) + if ($index == 0); + $image->Set (f => $projection); $index++; } +# FIXME +$oto->Write ('def'); + if ($align) { my $tempfile = File::Spec->catfile ($tempdir, 'align.oto'); @@ -294,6 +404,7 @@ is generatekeys from autopano-sift-C -r | --refine Refine the found control points using the original images, delete unrefinable. + -b | --stacks Use align_image_stack with bracketed stacks -f | --projection Panotools style input projection number. Use 0 for rectilinear, 2 for circular fisheye and 3 for full-frame fisheye images. @@ -314,6 +425,9 @@ versions of the input photos, the resulting .oto file should be applicable to the original photos. +Additionally if the --stacks option is used then align_image_stack is used to +assemble bracketed sequences within the set, usually with less error. + =head1 LICENSE This program is free software; you can redistribute it and/or Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-08-12 03:28:10 UTC (rev 870) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-08-21 00:39:26 UTC (rev 871) @@ -79,6 +79,7 @@ sub Read { my $self = shift; + $self->_defaults; my $path = shift || return 0; if ($path eq '-') { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-08-21 21:48:46
|
Revision: 873 http://panotools.svn.sourceforge.net/panotools/?rev=873&view=rev Author: brunopostle Date: 2008-08-21 21:48:56 +0000 (Thu, 21 Aug 2008) Log Message: ----------- Increment $VERSION Modified Paths: -------------- trunk/Panotools-Script/META.yml trunk/Panotools-Script/bin/match-n-shift trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/META.yml =================================================================== --- trunk/Panotools-Script/META.yml 2008-08-21 16:09:23 UTC (rev 872) +++ trunk/Panotools-Script/META.yml 2008-08-21 21:48:56 UTC (rev 873) @@ -1,7 +1,7 @@ --- #YAML:1.0 name: Panotools-Script abstract: 'Read, write and manipulate hugin script files' -version: 0.15 +version: 0.16 license: 'GPLv2+' author: - 'Bruno Postle <br...@po...>' Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2008-08-21 16:09:23 UTC (rev 872) +++ trunk/Panotools-Script/bin/match-n-shift 2008-08-21 21:48:56 UTC (rev 873) @@ -435,7 +435,10 @@ the original photos. Additionally if the --stacks option is used then align_image_stack is used to -assemble bracketed sequences within the set, usually with less error. +assemble bracketed sequences within the set, usually with less error. For this +to work photos need to be taken with the camera's auto-bracketing feature, e.g. +take three different exposures, move camera, take the same three exposures, +move camera etc... =head1 LICENSE Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-08-21 16:09:23 UTC (rev 872) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-08-21 21:48:56 UTC (rev 873) @@ -36,7 +36,7 @@ use Storable qw/ dclone /; -our $VERSION = 0.15; +our $VERSION = 0.16; 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...> - 2008-08-31 23:05:18
|
Revision: 874 http://panotools.svn.sourceforge.net/panotools/?rev=874&view=rev Author: brunopostle Date: 2008-08-31 23:05:24 +0000 (Sun, 31 Aug 2008) Log Message: ----------- New tool panostart for identifying panorama sets from directories of photos Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/Makefile.PL Added Paths: ----------- trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-08-21 21:48:56 UTC (rev 873) +++ trunk/Panotools-Script/Changes 2008-08-31 23:05:24 UTC (rev 874) @@ -5,6 +5,7 @@ - ptosort now allows sorting many aspects of .pto projects (Felix Hagemann) - Preserve 'disabled' flag for images (Felix Hagemann) - match-n-shift --stacks option to use align_image_stack + - panostart does everything 0.15 - Fix for ptograph negative coordinates (Felix Hagemann) Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2008-08-21 21:48:56 UTC (rev 873) +++ trunk/Panotools-Script/MANIFEST 2008-08-31 23:05:24 UTC (rev 874) @@ -10,6 +10,7 @@ bin/jpeg2qtvr bin/match-n-shift bin/nona-mask +bin/panostart bin/process-masks bin/process-masks-gui bin/pto2fulla Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2008-08-21 21:48:56 UTC (rev 873) +++ trunk/Panotools-Script/Makefile.PL 2008-08-31 23:05:24 UTC (rev 874) @@ -9,10 +9,10 @@ '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/erect2mercator', 'bin/ptosplit', 'bin/ptomerge', + 'bin/erect2mercator', 'bin/ptosplit', 'bin/ptomerge', 'bin/panostart', 'bin/transform-pano', 'bin/nona-mask', 'bin/qtvr2erect' ], 'VERSION_FROM' => 'lib/Panotools/Script.pm', # finds $VERSION - 'PREREQ_PM' => {'bytes' => 0.0, 'File::Copy' => 1.0, + 'PREREQ_PM' => {'bytes' => 0.0, 'File::Copy' => 1.0, 'Image::ExifTool' => 6.0, 'Getopt::Long' => 2.0, 'Pod::Usage' => 1.0, 'GraphViz' => 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}, Added: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart (rev 0) +++ trunk/Panotools-Script/bin/panostart 2008-08-31 23:05:24 UTC (rev 874) @@ -0,0 +1,192 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use Image::ExifTool; +use Getopt::Long; +use Pod::Usage; + +my $path_makefile; +my $d_inc = 15; +my $projection; +my $deg_fov; +my $crop_s; +my $help = 0; + +GetOptions ('o|output=s' => \$path_makefile, + 's|seconds=s' => \$d_inc, + 'f|projection=i' => \$projection, + 'v|fov=s' => \$deg_fov, + 'k|selection=s' => \$crop_s, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; +pod2usage (2) unless (defined $path_makefile and scalar @ARGV > 1); + +my $groups = []; + +my $group_tmp = []; +my $previous_time; +my $previous_inc = 0; +for my $path_photo (@ARGV) +{ + my $exif_info = Image::ExifTool::ImageInfo ($path_photo); + my $time_unix = Image::ExifTool::GetUnixTime ($exif_info->{'DateTimeOriginal'}); + $previous_time = $time_unix unless (defined $previous_time); + my $inc = $time_unix - $previous_time; + + if (($inc - $previous_inc) > $d_inc) + { + push (@{$groups}, $group_tmp); + $group_tmp = []; + } + push @{$group_tmp}, $path_photo; + + $previous_time = $time_unix; + $previous_inc = $inc; +} +push (@{$groups}, $group_tmp); + + +my $rule_ptos = new File::Pto::Mk::Rule; +$rule_ptos->Targets ('ptos'); +my $rule_mks = new File::Pto::Mk::Rule; +$rule_mks->Targets ('mks'); + +my @rules_pto; +my @rules_mk; +for my $group (@{$groups}) +{ + my $a = $group->[0]; + my $b = $group->[-1]; + $a =~ s/\.[[:alnum:]]+$//; + $b =~ s/\.[[:alnum:]]+$//; + $b =~ s/.*[\/\\]//; + my $stub = "$a-$b"; + + $rule_ptos->Prerequisites ("$stub.pto"); + $rule_mks->Prerequisites ("$stub.pto.mk"); + + 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', '--clean', + '--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}); + + push @rules_pto, $rule_pto; + + my $rule_mk = new File::Pto::Mk::Rule; + $rule_mk->Targets ("$stub.pto.mk"); + $rule_mk->Prerequisites ("$stub.pto"); + $rule_mk->Command ('pto2mk', '-o', "$stub.pto.mk", '-p', $stub, "$stub.pto"); + + push @rules_mk, $rule_mk; +} + +open MAKE, ">", $path_makefile or die "cannot write-open $path_makefile"; + +print MAKE "all : mks\n\n"; +print MAKE $rule_ptos->Assemble; +print MAKE $rule_mks->Assemble; +print MAKE map {$_->Assemble} @rules_pto; +print MAKE map {$_->Assemble} @rules_mk; + +close MAKE; + +package File::Pto::Mk::Rule; +use strict; +use warnings; + +sub new +{ + my $class = shift; + $class = ref $class || $class; + my $self = bless {targets => [], prerequisites => [], command => []}, $class; + return $self; +} + +sub Assemble +{ + my $self = shift; + return 0 unless scalar @{$self->{targets}}; + + my $text; + $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}}); + $text .= "\n\n"; + return $text; +} + +sub Targets +{ + my $self = shift; + push @{$self->{targets}}, @_; +} + +sub Prerequisites +{ + my $self = shift; + push @{$self->{prerequisites}}, @_; +} + +sub Command +{ + my $self = shift; + push @{$self->{command}}, @_; +} + +sub _quoteshell +{ + my $string = shift; + $string =~ s/(['"\[\] `&*()+~#:<?>|])/\\$1/g; + return $string; +} + +__END__ + +=head1 NAME + +panostart - identify likely panorama sequences + +=head1 SYNOPSIS + +panostart [options] --output Makefile image1 image2 [...] + + Options: + -o | --output name Filename of created Makefile + -s | --seconds Number of seconds between panoramas + -f | --projection Panotools style input projection number. Use + 0 for rectilinear, 2 for circular fisheye and + 3 for full-frame fisheye images. + -v | --fov Horizontal field of view in degrees + -k | --selection Crop selection boundary, eg -459,2459,-57,2861 + -h | --help Outputs help documentation. + +=head1 DESCRIPTION + +B<panostart> takes a list of image files and creates a Makefile +containing rules to generate panoramas from the images. + +=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 - August 2008. + +=cut Property changes on: trunk/Panotools-Script/bin/panostart ___________________________________________________________________ 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-09-06 11:34:29
|
Revision: 878 http://panotools.svn.sourceforge.net/panotools/?rev=878&view=rev Author: brunopostle Date: 2008-09-06 11:34:40 +0000 (Sat, 06 Sep 2008) Log Message: ----------- panostart --locquatious option Modified Paths: -------------- trunk/Panotools-Script/META.yml trunk/Panotools-Script/bin/match-n-shift trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/META.yml =================================================================== --- trunk/Panotools-Script/META.yml 2008-09-01 21:43:11 UTC (rev 877) +++ trunk/Panotools-Script/META.yml 2008-09-06 11:34:40 UTC (rev 878) @@ -15,6 +15,7 @@ File::Temp: 0.1 Getopt::Long: 2 GraphViz: 1 + Image::ExifTool: 6 Image::Size: 2.9 Math::Trig: 0.1 Pod::Usage: 1 Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2008-09-01 21:43:11 UTC (rev 877) +++ trunk/Panotools-Script/bin/match-n-shift 2008-09-06 11:34:40 UTC (rev 878) @@ -153,7 +153,7 @@ my $pto = new Panotools::Script; $pto->Panorama->Set (v => $deg_fov, E => 0, f => $projection_panorama, - w => $pix_width_small, h => $pix_height_small, n => '"TIFF_m"'); + w => $pix_width_small, h => $pix_height_small, n => '"TIFF_m c:NONE"'); $pto->Image->[0] = new Panotools::Script::Line::Image; $pto->Image->[0]->Set (w => $pix_width_input, h => $pix_height_input, v => $deg_fov, f => $projection_temp, Eev => 0, r => 0, p => 0, y => 0, n => "\"$path_input\""); Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2008-09-01 21:43:11 UTC (rev 877) +++ trunk/Panotools-Script/bin/panostart 2008-09-06 11:34:40 UTC (rev 878) @@ -12,12 +12,14 @@ my $deg_fov; my $crop_s; my $help = 0; +my $verbose = 0; GetOptions ('o|output=s' => \$path_makefile, 's|seconds=s' => \$d_inc, 'f|projection=i' => \$projection, 'v|fov=s' => \$deg_fov, 'k|selection=s' => \$crop_s, + 'l|locquatious' => \$verbose, 'h|help' => \$help); pod2usage (-verbose => 2) if $help; @@ -60,6 +62,8 @@ my @rules_img; for my $group (@{$groups}) { + next if scalar @{$group} == 1; + my $a = $group->[0]; my $b = $group->[-1]; $a =~ s/\.[[:alnum:]]+$//; @@ -67,6 +71,8 @@ $b =~ s/.*[\/\\]//; my $stub = "$a-$b"; + print STDERR "$stub: ". scalar @{$group} ." images\n" if $verbose; + $rule_ptos->Prerequisites ("$stub.pto"); $rule_mks->Prerequisites ("$stub.pto.mk"); $rule_imgs->Prerequisites ("$stub"); @@ -185,6 +191,7 @@ -v | --fov Horizontal field of view in degrees -k | --selection Crop selection boundary, eg -459,2459,-57,2861 -h | --help Outputs help documentation. + -l | --locquatious Verbose output listing targets and numbers of images. =head1 DESCRIPTION This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-06 21:30:50
|
Revision: 880 http://panotools.svn.sourceforge.net/panotools/?rev=880&view=rev Author: brunopostle Date: 2008-09-06 21:30:57 +0000 (Sat, 06 Sep 2008) Log Message: ----------- match-n-shift workaround PTmender failure with separate /tmp/ Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/META.yml trunk/Panotools-Script/bin/match-n-shift trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-06 11:38:14 UTC (rev 879) +++ trunk/Panotools-Script/Changes 2008-09-06 21:30:57 UTC (rev 880) @@ -1,5 +1,9 @@ Revision history for Panotools::Script. +0.17 + - match-n-shift workaround PTmender failure with separate /tmp/ + - panosort --loquacious verbose output + 0.16 - Read() and Write() accept STDIN and STDOUT using '-' placeholder - ptosort now allows sorting many aspects of .pto projects (Felix Hagemann) Modified: trunk/Panotools-Script/META.yml =================================================================== --- trunk/Panotools-Script/META.yml 2008-09-06 11:38:14 UTC (rev 879) +++ trunk/Panotools-Script/META.yml 2008-09-06 21:30:57 UTC (rev 880) @@ -1,7 +1,7 @@ --- #YAML:1.0 name: Panotools-Script abstract: 'Read, write and manipulate hugin script files' -version: 0.16 +version: 0.17 license: 'GPLv2+' author: - 'Bruno Postle <br...@po...>' Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2008-09-06 11:38:14 UTC (rev 879) +++ trunk/Panotools-Script/bin/match-n-shift 2008-09-06 21:30:57 UTC (rev 880) @@ -55,7 +55,12 @@ my @paths_output = (); -my $tempdir = tempdir (CLEANUP => $clean); +# PTmender can't write to /tmp/ if it is a separate partition, use the only +# known writable folder for temp files. +my ($split_vol, $split_dir, $split_file) + = File::Spec->splitpath (File::Spec->rel2abs ($path_oto)); +my $path_tmp = File::Spec->catpath ($split_vol, $split_dir, ''); +my $tempdir = tempdir (CLEANUP => $clean, DIR => $path_tmp); print STDERR "using $tempdir\n"; Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-06 11:38:14 UTC (rev 879) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-06 21:30:57 UTC (rev 880) @@ -36,7 +36,7 @@ use Storable qw/ dclone /; -our $VERSION = 0.16; +our $VERSION = 0.17; 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...> - 2008-09-06 22:18:26
|
Revision: 881 http://panotools.svn.sourceforge.net/panotools/?rev=881&view=rev Author: brunopostle Date: 2008-09-06 22:18:37 +0000 (Sat, 06 Sep 2008) Log Message: ----------- match-n-shift write output even if no points found Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/match-n-shift Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-06 21:30:57 UTC (rev 880) +++ trunk/Panotools-Script/Changes 2008-09-06 22:18:37 UTC (rev 881) @@ -2,6 +2,7 @@ 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ + - match-n-shift write output even if no points found - panosort --loquacious verbose output 0.16 Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2008-09-06 21:30:57 UTC (rev 880) +++ trunk/Panotools-Script/bin/match-n-shift 2008-09-06 22:18:37 UTC (rev 881) @@ -322,16 +322,14 @@ $oto->ImageMetadata->[$index_meta]->{autoCenterCrop} = 0 if defined $crop_s; } +$oto->Write ($path_oto); + if ($align) { my $tempfile = File::Spec->catfile ($tempdir, 'align.oto'); $oto->Write ($tempfile); system ('autooptimiser', '-a', '-l', '-s', '-o', $path_oto, $tempfile); } -else -{ - $oto->Write ($path_oto); -} # voodoo sub from_sgraphic This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-07 17:13:53
|
Revision: 882 http://panotools.svn.sourceforge.net/panotools/?rev=882&view=rev Author: brunopostle Date: 2008-09-07 17:14:04 +0000 (Sun, 07 Sep 2008) Log Message: ----------- panostart: use file date if no exif date; .PHONY rule Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-06 22:18:37 UTC (rev 881) +++ trunk/Panotools-Script/Changes 2008-09-07 17:14:04 UTC (rev 882) @@ -3,7 +3,9 @@ 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ - match-n-shift write output even if no points found - - panosort --loquacious verbose output + - panostart --loquacious verbose output + - panostart use file date if no exif date + - panostart .PHONY rule 0.16 - Read() and Write() accept STDIN and STDOUT using '-' placeholder Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2008-09-06 22:18:37 UTC (rev 881) +++ trunk/Panotools-Script/bin/panostart 2008-09-07 17:14:04 UTC (rev 882) @@ -33,7 +33,9 @@ for my $path_photo (@ARGV) { my $exif_info = Image::ExifTool::ImageInfo ($path_photo); - my $time_unix = Image::ExifTool::GetUnixTime ($exif_info->{'DateTimeOriginal'}); + my $datetime = $exif_info->{'FileModificationDateTime'}; + $datetime = $exif_info->{'DateTimeOriginal'} if (defined $exif_info->{'DateTimeOriginal'}); + my $time_unix = Image::ExifTool::GetUnixTime ($datetime); $previous_time = $time_unix unless (defined $previous_time); my $inc = $time_unix - $previous_time; @@ -108,8 +110,13 @@ $rule_all->Targets ('all'); $rule_all->Prerequisites ('images'); +my $rule_phony = new File::Pto::Mk::Rule; +$rule_phony->Targets ('.PHONY'); +$rule_phony->Prerequisites (qw/all images pto mk/); + open MAKE, ">", $path_makefile or die "cannot write-open $path_makefile"; +print MAKE $rule_phony->Assemble; print MAKE $rule_all->Assemble; print MAKE $rule_ptos->Assemble; print MAKE $rule_mks->Assemble; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-07 22:55:02
|
Revision: 883 http://panotools.svn.sourceforge.net/panotools/?rev=883&view=rev Author: brunopostle Date: 2008-09-07 22:55:12 +0000 (Sun, 07 Sep 2008) Log Message: ----------- panostart: create rules for all output types, try and identify likely stacks and populate default rule appropriately Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-07 17:14:04 UTC (rev 882) +++ trunk/Panotools-Script/Changes 2008-09-07 22:55:12 UTC (rev 883) @@ -6,6 +6,7 @@ - panostart --loquacious verbose output - panostart use file date if no exif date - panostart .PHONY rule + - panostart create rules for all output types 0.16 - Read() and Write() accept STDIN and STDOUT using '-' placeholder Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2008-09-07 17:14:04 UTC (rev 882) +++ trunk/Panotools-Script/bin/panostart 2008-09-07 22:55:12 UTC (rev 883) @@ -61,7 +61,10 @@ my @rules_pto; my @rules_mk; -my @rules_img; +my @rules_ldr_blended; +my @rules_ldr_stacked_blended; +my @rules_hdr_blended; + for my $group (@{$groups}) { next if scalar @{$group} == 1; @@ -73,12 +76,22 @@ $b =~ s/.*[\/\\]//; my $stub = "$a-$b"; - print STDERR "$stub: ". scalar @{$group} ." images\n" if $verbose; - $rule_ptos->Prerequisites ("$stub.pto"); $rule_mks->Prerequisites ("$stub.pto.mk"); - $rule_imgs->Prerequisites ("$stub"); + my $path_img; + if (is_stacks (@{$group})) + { + $path_img = $stub ."_fused.tif"; + } + else + { + $path_img = $stub .".tif"; + } + $rule_imgs->Prerequisites ($path_img); + + print STDERR "$path_img: ". scalar @{$group} ." images\n" if $verbose; + my $rule_pto = new File::Pto::Mk::Rule; $rule_pto->Targets ("$stub.pto"); $rule_pto->Prerequisites (@{$group}); @@ -98,12 +111,26 @@ push @rules_mk, $rule_mk; - my $rule_img = new File::Pto::Mk::Rule; - $rule_img->Targets ("$stub"); - $rule_img->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); - $rule_img->Command ('make', '-e', '-f', "$stub.pto.mk", 'all', 'clean'); + my $rule_ldr_blended = new File::Pto::Mk::Rule; + $rule_ldr_blended->Targets ($stub .".tif"); + $rule_ldr_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); + $rule_ldr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub .".tif", 'clean'); - push @rules_img, $rule_img; + push @rules_ldr_blended, $rule_ldr_blended; + + my $rule_ldr_stacked_blended = new File::Pto::Mk::Rule; + $rule_ldr_stacked_blended->Targets ($stub ."_fused.tif"); + $rule_ldr_stacked_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); + $rule_ldr_stacked_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_fused.tif", 'clean'); + + push @rules_ldr_stacked_blended, $rule_ldr_stacked_blended; + + my $rule_hdr_blended = new File::Pto::Mk::Rule; + $rule_hdr_blended->Targets ($stub ."_hdr.exr"); + $rule_hdr_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); + $rule_hdr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_hdr.exr", 'clean'); + + push @rules_hdr_blended, $rule_hdr_blended; } my $rule_all = new File::Pto::Mk::Rule; @@ -123,10 +150,28 @@ print MAKE $rule_imgs->Assemble; print MAKE map {$_->Assemble} @rules_pto; print MAKE map {$_->Assemble} @rules_mk; -print MAKE map {$_->Assemble} @rules_img; +print MAKE map {$_->Assemble} @rules_ldr_blended; +print MAKE map {$_->Assemble} @rules_ldr_stacked_blended; +print MAKE map {$_->Assemble} @rules_hdr_blended; close MAKE; +sub is_stacks +{ + my $speeds = {}; + for my $path_photo (@_) + { + my $exif_info = Image::ExifTool::ImageInfo ($path_photo, 'ExposureTime', 'ShutterSpeed'); + my $et = $exif_info->{ExposureTime} || $exif_info->{ShutterSpeed} || 0; + $speeds->{$et} = 'TRUE'; + } + + my $brackets = scalar keys (%{$speeds}); + return 0 if (scalar (@_) % $brackets); + return 0 if ($brackets < 2); + return 1; +} + package File::Pto::Mk::Rule; use strict; use warnings; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-09 20:36:49
|
Revision: 884 http://panotools.svn.sourceforge.net/panotools/?rev=884&view=rev Author: brunopostle Date: 2008-09-09 20:37:00 +0000 (Tue, 09 Sep 2008) Log Message: ----------- pafextract, tool for using panoglview as a pteditor replacement Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/Makefile.PL Added Paths: ----------- trunk/Panotools-Script/bin/pafextract Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-07 22:55:12 UTC (rev 883) +++ trunk/Panotools-Script/Changes 2008-09-09 20:37:00 UTC (rev 884) @@ -1,5 +1,8 @@ Revision history for Panotools::Script. +0.18 + - pafextract tool for using panoglview as a pteditor replacement + 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ - match-n-shift write output even if no points found Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2008-09-07 22:55:12 UTC (rev 883) +++ trunk/Panotools-Script/Makefile.PL 2008-09-09 20:37:00 UTC (rev 884) @@ -3,7 +3,7 @@ # the contents of the Makefile that is written. WriteMakefile( 'NAME' => 'Panotools::Script', - 'EXE_FILES' => [ 'bin/cubic2erect', 'bin/erect2cubic', + '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/tif2svg', 'bin/enblend-svg', 'bin/pto2fulla', 'bin/ptoinfo', 'bin/ptopath', Added: trunk/Panotools-Script/bin/pafextract =================================================================== --- trunk/Panotools-Script/bin/pafextract (rev 0) +++ trunk/Panotools-Script/bin/pafextract 2008-09-09 20:37:00 UTC (rev 884) @@ -0,0 +1,122 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; +use Math::Trig; +use Image::Size; +use File::Spec; + +die "Usage: $0 project.paf" unless (defined $ARGV[0] and -e $ARGV[0]); + +my $path_paf = File::Spec->rel2abs ($ARGV[0]); +open (PAF, '<'. $path_paf); +my $paf = {}; +for my $line (<PAF>) +{ + if ($line =~ /^(.+)=(.+)$/) + { + my ($key, $value) = ($1, $2); + $key =~ s/\\ / /g; + $paf->{$key} = $value; + } +} + +my ($v, $d, $f) = File::Spec->splitpath ($path_paf); +my $path_equirect = File::Spec->catpath ($v, $d, $paf->{'Panorama Image'}); + +my ($px_width_equirect, $px_height_equirect) = imgsize ($path_equirect); +die unless ($px_width_equirect * $px_height_equirect > 0); + +my $deg_hfov_equirect = $paf->{'Image Maximum Pan'} - $paf->{'Image Minimum Pan'}; +$deg_hfov_equirect = 360 if $deg_hfov_equirect < 1; + +my $px_radius_equirect = ($deg_hfov_equirect / 360) * $px_width_equirect / (2 * atan2(0,-1)); + +my $rad_vfov = $paf->{'Initial FOV'} * atan2(0,-1) / 180; + +my $px_height = int (tan ($rad_vfov/2) * $px_radius_equirect * 2); +my $px_width = int ($px_height * 4/3); + +my $rad_hfov = 2 * asin (sin ($rad_vfov/2) * $px_width / $px_height); + +# create a .pto project to extract the rectilinear view stored in the .paf file +my $pto_extract = new Panotools::Script; +$pto_extract->Panorama->Set (w => $px_width, h => $px_height, + n => 'TIFF', + v => ($rad_hfov * 180 / atan2(0,-1)), + f => 0); + +my $equirect = new Panotools::Script::Line::Image; +$equirect->Set (w => $px_width_equirect, h => $px_height_equirect, f => 4, + v => $deg_hfov_equirect, r => 0, p => 0, y => 0, + n => '"'. $path_equirect .'"'); +push @{$pto_extract->Image}, $equirect; + +$pto_extract->Transform (0, 0, 0 - $paf->{'Initial Pan'}); +$pto_extract->Transform (0, $paf->{'Initial Tilt'}, 0); + +my $path_temp_pto = $path_paf .'.'. $$ .'.temp.pto'; + +$pto_extract->Write ($path_temp_pto); + +# render the rectilinear view, delete the .pto project +system ('nona', '-o', $path_paf .'.extract', $path_temp_pto); +unlink $path_temp_pto; + +# create a .pto that reprojects the extracted rectilinear back into the original image +my $pto_insert = new Panotools::Script; +$pto_insert->Panorama->Set (w => $px_width_equirect, h => $px_height_equirect, + v => $deg_hfov_equirect, n => 'TIFF'); + +my $rectilinear = new Panotools::Script::Line::Image; +$rectilinear->Set (w => $px_width, h => $px_height, + f => 0, v => ($rad_hfov * 180 / atan2(0,-1)), + n => '"'. $path_paf .'.extract.tif"'); +push @{$pto_insert->Image}, $rectilinear; + +$pto_insert->Transform (0, 0 - $paf->{'Initial Tilt'}, 0); +$pto_insert->Transform (0, 0, $paf->{'Initial Pan'}); + +$pto_insert->Write ($path_paf .'.extract.pto'); + +__END__ + +=head1 NAME + +pafextract - render panoglview .paf projects + +=head1 SYNOPSIS + + panoglview equirectangular.tif + pafextract project.paf + gimp project.paf.extract.tif + nona -o overlay project.paf.extract.pto + composite overlay.tif equirectangular.tif merged.tif + +=head1 DESCRIPTION + +B<pafextract> takes a panoglview .paf file and renders the saved view as a +suitably sized .tif file. This is useful for simply extracting a 'normal' view +from an equirectangular panorama. + +A hugin .pto project is also created, containing all the information necessary +to reproject the extracted .tif image back into the same equirectangular space +as the original. This is useful for merging edits back into the original with +a tool such as ImageMagick or the Gimp. + +=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 - September 2008. + +=cut Property changes on: trunk/Panotools-Script/bin/pafextract ___________________________________________________________________ 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-09-09 20:52:56
|
Revision: 885 http://panotools.svn.sourceforge.net/panotools/?rev=885&view=rev Author: brunopostle Date: 2008-09-09 20:53:07 +0000 (Tue, 09 Sep 2008) Log Message: ----------- panostart allow specifying CLEAN= Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-09 20:37:00 UTC (rev 884) +++ trunk/Panotools-Script/Changes 2008-09-09 20:53:07 UTC (rev 885) @@ -2,6 +2,7 @@ 0.18 - pafextract tool for using panoglview as a pteditor replacement + - panostart allow specifying CLEAN= 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2008-09-09 20:37:00 UTC (rev 884) +++ trunk/Panotools-Script/bin/panostart 2008-09-09 20:53:07 UTC (rev 885) @@ -114,21 +114,21 @@ my $rule_ldr_blended = new File::Pto::Mk::Rule; $rule_ldr_blended->Targets ($stub .".tif"); $rule_ldr_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); - $rule_ldr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub .".tif", 'clean'); + $rule_ldr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub .".tif", '$(CLEAN)'); push @rules_ldr_blended, $rule_ldr_blended; my $rule_ldr_stacked_blended = new File::Pto::Mk::Rule; $rule_ldr_stacked_blended->Targets ($stub ."_fused.tif"); $rule_ldr_stacked_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); - $rule_ldr_stacked_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_fused.tif", 'clean'); + $rule_ldr_stacked_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_fused.tif", '$(CLEAN)'); push @rules_ldr_stacked_blended, $rule_ldr_stacked_blended; my $rule_hdr_blended = new File::Pto::Mk::Rule; $rule_hdr_blended->Targets ($stub ."_hdr.exr"); $rule_hdr_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); - $rule_hdr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_hdr.exr", 'clean'); + $rule_hdr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_hdr.exr", '$(CLEAN)'); push @rules_hdr_blended, $rule_hdr_blended; } @@ -148,6 +148,7 @@ print MAKE $rule_ptos->Assemble; print MAKE $rule_mks->Assemble; print MAKE $rule_imgs->Assemble; +print MAKE "CLEAN = clean\n\n"; print MAKE map {$_->Assemble} @rules_pto; print MAKE map {$_->Assemble} @rules_mk; print MAKE map {$_->Assemble} @rules_ldr_blended; @@ -220,7 +221,7 @@ sub _quoteshell { my $string = shift; - $string =~ s/(['"\[\] `&*()+~#:<?>|])/\\$1/g; + $string =~ s/(['"\[\] `&*+~#:<?>|])/\\$1/g; return $string; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-09 21:10:21
|
Revision: 886 http://panotools.svn.sourceforge.net/panotools/?rev=886&view=rev Author: brunopostle Date: 2008-09-09 21:10:32 +0000 (Tue, 09 Sep 2008) Log Message: ----------- panostart: pass EXTRA_ARGS to match-n-shift Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-09 20:53:07 UTC (rev 885) +++ trunk/Panotools-Script/Changes 2008-09-09 21:10:32 UTC (rev 886) @@ -2,7 +2,9 @@ 0.18 - pafextract tool for using panoglview as a pteditor replacement - - panostart allow specifying CLEAN= + - panostart allow unsetting CLEAN to keep intermediate images + - panostart rename -s parameter to -t + - panostart EXTRA_ARGS passed to match-n-shift 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2008-09-09 20:53:07 UTC (rev 885) +++ trunk/Panotools-Script/bin/panostart 2008-09-09 21:10:32 UTC (rev 886) @@ -15,7 +15,7 @@ my $verbose = 0; GetOptions ('o|output=s' => \$path_makefile, - 's|seconds=s' => \$d_inc, + 't|time=s' => \$d_inc, 'f|projection=i' => \$projection, 'v|fov=s' => \$deg_fov, 'k|selection=s' => \$crop_s, @@ -96,7 +96,7 @@ $rule_pto->Targets ("$stub.pto"); $rule_pto->Prerequisites (@{$group}); $rule_pto->Command ('match-n-shift', '--stacks', '--align', '--clean', - '--output', "$stub.pto"); + '$(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; @@ -148,7 +148,8 @@ print MAKE $rule_ptos->Assemble; print MAKE $rule_mks->Assemble; print MAKE $rule_imgs->Assemble; -print MAKE "CLEAN = clean\n\n"; +print MAKE "CLEAN = clean\n"; +print MAKE "EXTRA_ARGS =\n\n"; print MAKE map {$_->Assemble} @rules_pto; print MAKE map {$_->Assemble} @rules_mk; print MAKE map {$_->Assemble} @rules_ldr_blended; @@ -237,7 +238,7 @@ Options: -o | --output name Filename of created Makefile - -s | --seconds Number of seconds between panoramas + -t | --time Number of seconds between panoramas -f | --projection Panotools style input projection number. Use 0 for rectilinear, 2 for circular fisheye and 3 for full-frame fisheye images. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-15 23:26:28
|
Revision: 888 http://panotools.svn.sourceforge.net/panotools/?rev=888&view=rev Author: brunopostle Date: 2008-09-15 23:26:38 +0000 (Mon, 15 Sep 2008) Log Message: ----------- New Distance() method for reporting control point error distances. Working but unfinished, assumes rectilinear input and equirectangular output, also ignores d,e,g,t parameters. Interestingly, it appears that panotools gets this distance wrong by a factor of two. Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/lib/Panotools/Script/Line/Control.pm trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm Added Paths: ----------- trunk/Panotools-Script/t/032.image.t trunk/Panotools-Script/t/033.points.t Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-15 23:05:54 UTC (rev 887) +++ trunk/Panotools-Script/Changes 2008-09-15 23:26:38 UTC (rev 888) @@ -5,6 +5,7 @@ - panostart allow unsetting CLEAN to keep intermediate images - panostart rename -s parameter to -t - panostart EXTRA_ARGS passed to match-n-shift + - new Distance() method to report control point errors (unfinished) 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2008-09-15 23:05:54 UTC (rev 887) +++ trunk/Panotools-Script/MANIFEST 2008-09-15 23:26:38 UTC (rev 888) @@ -65,6 +65,8 @@ t/020.create-script.t t/021.morph.t t/031.matrix.t +t/032.image.t +t/033.points.t t/data/cemetery/dscn4905.jpg t/data/cemetery/dscn4906.jpg t/data/cemetery/dscn4907.jpg Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/Control.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/Control.pm 2008-09-15 23:05:54 UTC (rev 887) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/Control.pm 2008-09-15 23:26:38 UTC (rev 888) @@ -2,6 +2,7 @@ use strict; use warnings; +use Math::Trig; use Panotools::Script::Line; use vars qw /@ISA/; @@ -76,5 +77,60 @@ } } +=pod + +Get a value for control point error distance (measured in pixels in the panorama +output): + + print $point->Distance ($pto); + +Note that it is necessary to pass a Panotools::Script object to this method. +Note also that the values returned are approximately half those returned by +panotools itself, go figure. + +=cut + +sub Distance +{ + my $self = shift; + my $p = shift; + + my $image_N = $p->Image->[$self->{N}]; + my $image_n = $p->Image->[$self->{n}]; + + my $vec_N = $image_N->To_Cartesian ($p, [$self->{X},$self->{Y}]); + my $vec_n = $image_n->To_Cartesian ($p, [$self->{x},$self->{y}]); + + $vec_N = _normalise ($vec_N); + $vec_n = _normalise ($vec_n); + + my $angle = acos (($vec_N->[0]->[0] * $vec_n->[0]->[0]) + + ($vec_N->[1]->[0] * $vec_n->[1]->[0]) + + ($vec_N->[2]->[0] * $vec_n->[2]->[0])); + + # FIXME assumes an equirectangular panorama + return $angle / atan2 (0,-1) * $p->Panorama->{w} / 2; +} + +sub _normalise +{ + my $vector = shift; + + my $magnitude = _magnitude ($vector->[0]->[0], $vector->[1]->[0], $vector->[2]->[0]); + return $vector if $magnitude == 1; + + $vector->[0]->[0] = $vector->[0]->[0] / $magnitude; + $vector->[1]->[0] = $vector->[1]->[0] / $magnitude; + $vector->[2]->[0] = $vector->[2]->[0] / $magnitude; + + return $vector; +} + +sub _magnitude +{ + my ($x, $y, $z) = @_; + sqrt ($x*$x + $y*$y + $z*$z); +} + 1; Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm 2008-09-15 23:05:54 UTC (rev 887) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm 2008-09-15 23:26:38 UTC (rev 888) @@ -5,6 +5,7 @@ use Panotools::Script::Line; use Panotools::Matrix qw(matrix2rollpitchyaw rollpitchyaw2matrix multiply); use Math::Trig; +use Math::Trig ':radial'; use vars qw /@ISA/; @ISA = qw /Panotools::Script::Line/; @@ -210,6 +211,147 @@ [@report]; } +sub W2 +{ + my $self = shift; + return ($self->{w} / 2) if ($self->{w} < $self->{h}); + return ($self->{h} / 2); +} +sub V +{ + my $self = shift; + my $pto = shift; + if ($self->{v} =~ /^=([0-9]+)$/) {return $pto->Image->[$1]->{v}}; + return $self->{v}; +} + +sub A +{ + my $self = shift; + my $pto = shift; + return 0.0 unless defined ($self->{a}); + if ($self->{a} =~ /^=([0-9]+)$/) {return $pto->Image->[$1]->{a}}; + return $self->{a}; +} + +sub B +{ + my $self = shift; + my $pto = shift; + return 0.0 unless defined ($self->{b}); + if ($self->{b} =~ /^=([0-9]+)$/) {return $pto->Image->[$1]->{b}}; + return $self->{b}; +} + +sub C +{ + my $self = shift; + my $pto = shift; + return 0.0 unless defined ($self->{c}); + if ($self->{c} =~ /^=([0-9]+)$/) {return $pto->Image->[$1]->{c}}; + return $self->{c}; +} + +sub D +{ + my $self = shift; + my $pto = shift; + return 0.0 unless defined ($self->{d}); + if ($self->{d} =~ /^=([0-9]+)$/) {return $pto->Image->[$1]->{d}}; + return $self->{d}; +} + +sub E +{ + my $self = shift; + my $pto = shift; + return 0.0 unless defined ($self->{e}); + if ($self->{e} =~ /^=([0-9]+)$/) {return $pto->Image->[$1]->{e}}; + return $self->{e}; +} + +# copied from libpano12 math.c inverse polynomial using Newton's method +sub _inv_radial +{ + my $self = shift; + my $pto = shift; + my $dest = shift; + my $a = $self->A ($pto); + my $b = $self->B ($pto); + my $c = $self->C ($pto); + my $d = 1 - $a - $b - $c; + + my $iter = 0; + my $MAXITER = 100; + my $R_EPS = 0.000001; + + my $rd = (sqrt ($dest->[0] * $dest->[0] + $dest->[1] * $dest->[1])) / $self->W2; + + return [0, 0] if $rd == 0; + + my $rs = $rd; + my $f = ((($a * $rs + $b) * $rs + $c) * $rs + $d) * $rs; + + while (abs ($f - $rd) > $R_EPS && $iter < $MAXITER) + { + $rs = $rs - ($f - $rd) / (((4 * $a * $rs + 3 * $b) * $rs + 2 * $c) * $rs + $d); + $f = ((($a * $rs + $b) * $rs + $c) * $rs + $d) * $rs; + $iter++; + } + + my $scale = $rs / $rd; + # print "scale = $scale iter = $iter\n"; + + return [$dest->[0] * $scale, $dest->[1] * $scale]; +} + +sub _radial +{ + my $self = shift; + my $pto = shift; + my $dest = shift; + my $a = $self->A ($pto); + my $b = $self->B ($pto); + my $c = $self->C ($pto); + my $d = 1 - $a - $b - $c; + + my $r = (sqrt ($dest->[0] * $dest->[0] + $dest->[1] * $dest->[1])) / $self->W2; + my $scale = (($a * $r + $b) * $r + $c) * $r + $d; + + return [$dest->[0] * $scale, $dest->[1] * $scale]; +} + +=pod + +For any given coordinate in this image (top left is 0,0), calculate an x,y,z +cartesian coordinate, accounting for lens distortion, projection and rotation. + +=cut + +sub To_Cartesian +{ + my $self = shift; + my $pto = shift; + my $pix = shift; + + # FIXME this doesn't account for d,e shift and g,t shear + $pix->[0] = ($self->{w}/2) - $pix->[0]; + $pix->[1] = ($self->{h}/2) - $pix->[1]; + $pix = $self->_inv_radial ($pto, $pix); + + my $rad = ($self->{w}/2) / tan (_deg2rad ($self->V ($pto)) / 2); + + # FIXME this assumes a rectilinear image + my $point = [[$rad], [$pix->[0]], [$pix->[1]]]; + + my $matrix = rollpitchyaw2matrix + (_deg2rad ($self->{r}), _deg2rad ($self->{p}), _deg2rad ($self->{y})); + + multiply ($matrix, $point); +} + +sub _deg2rad { my $deg = shift; return $deg * atan2 (0,-1) / 180 } + 1; Added: trunk/Panotools-Script/t/032.image.t =================================================================== --- trunk/Panotools-Script/t/032.image.t (rev 0) +++ trunk/Panotools-Script/t/032.image.t 2008-09-15 23:26:38 UTC (rev 888) @@ -0,0 +1,40 @@ +#!/usr/bin/perl +#Editor vim:syn=perl + +use strict; +use warnings; +use Test::More 'no_plan'; +use lib 'lib'; +use File::Temp qw/ tempdir /; +use File::Spec; + +my $tempdir = tempdir (CLEANUP => 1); + +use Panotools::Script; + +my $p = new Panotools::Script; +$p->Read ('t/data/cemetery/hugin.pto'); + +my $image = $p->Image->[1]; + +# image is 239x320 +is ($image->W2, 119.5); +is ($image->A ($p), 0.0); +is ($image->B ($p), -0.0258324); +is ($image->C ($p), 0.0); + +my $coor_1 = $image->_inv_radial ($p, [50,50]); +like ($coor_1->[0], '/^49.159907/'); +like ($coor_1->[1], '/^49.159907/'); + +my $coor_2 = $image->_radial ($p, $coor_1); +like ($coor_2->[0], '/^49.99999/'); +like ($coor_2->[1], '/^49.99999/'); + +my $vec = $image->To_Cartesian ($p, [119.5,160]); + +$image->{r} = 0; $image->{p} = 90; $image->{y} = 0; +$vec = $image->To_Cartesian ($p, [119.5,160]); + +my $distance = $p->Control->[0]->Distance ($p); + Added: trunk/Panotools-Script/t/033.points.t =================================================================== --- trunk/Panotools-Script/t/033.points.t (rev 0) +++ trunk/Panotools-Script/t/033.points.t 2008-09-15 23:26:38 UTC (rev 888) @@ -0,0 +1,34 @@ +#!/usr/bin/perl +#Editor vim:syn=perl + +use strict; +use warnings; +use Test::More 'no_plan'; +use lib 'lib'; + +use Panotools::Script; + +my $p = new Panotools::Script; + +$p->Image->[0] = new Panotools::Script::Line::Image; +$p->Image->[0]->Set (w => 100, h => 100, f => 0, v => 90, + r => 0, p => 0, y => 0, n => '"foo.jpg"'); + +$p->Image->[1] = new Panotools::Script::Line::Image; +$p->Image->[1]->Set (w => 100, h => 100, f => 0, v => 90, + r => 0, p => 0, y => 90, n => '"bar.jpg"'); + +$p->Control->[0] = new Panotools::Script::Line::Control; +$p->Control->[0]->Set (N => 0, n => 1, X => 100, Y => 0, x => 0, y => 0); + +$p->Control->[1] = new Panotools::Script::Line::Control; +$p->Control->[1]->Set (N => 0, n => 1, X => 50, Y => 50, x => 50, y => 50); + +is ($p->Control->[0]->Distance ($p), 0, 'points are 0 pixel distance'); +is ($p->Control->[1]->Distance ($p), 250, 'points are 250 pixel distance'); + +$p->Transform (10,20,30); + +is (int ($p->Control->[0]->Distance ($p)), 0, 'points are 0 pixel distance'); +is ($p->Control->[1]->Distance ($p), 250, 'points are 250 pixel distance'); + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-16 20:14:39
|
Revision: 889 http://panotools.svn.sourceforge.net/panotools/?rev=889&view=rev Author: brunopostle Date: 2008-09-16 20:14:49 +0000 (Tue, 16 Sep 2008) Log Message: ----------- Fix control point distance code and add simplistic control point reaper command-line tool. Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/META.yml trunk/Panotools-Script/Makefile.PL trunk/Panotools-Script/lib/Panotools/Script/Line/Control.pm trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm trunk/Panotools-Script/lib/Panotools/Script.pm Added Paths: ----------- trunk/Panotools-Script/bin/ptoclean Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-15 23:26:38 UTC (rev 888) +++ trunk/Panotools-Script/Changes 2008-09-16 20:14:49 UTC (rev 889) @@ -5,7 +5,9 @@ - panostart allow unsetting CLEAN to keep intermediate images - panostart rename -s parameter to -t - panostart EXTRA_ARGS passed to match-n-shift - - new Distance() method to report control point errors (unfinished) + - new Distance() method to report control point errors, + doesn't know about equirectangular/cylindrical input yet + - new tool ptoclean control point reaper 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2008-09-15 23:26:38 UTC (rev 888) +++ trunk/Panotools-Script/MANIFEST 2008-09-16 20:14:49 UTC (rev 889) @@ -15,6 +15,7 @@ bin/process-masks-gui bin/pto2fulla bin/pto2tiff +bin/ptoclean bin/ptograph bin/ptoinfo bin/ptoinfo-gui Modified: trunk/Panotools-Script/META.yml =================================================================== --- trunk/Panotools-Script/META.yml 2008-09-15 23:26:38 UTC (rev 888) +++ trunk/Panotools-Script/META.yml 2008-09-16 20:14:49 UTC (rev 889) @@ -1,7 +1,7 @@ --- #YAML:1.0 name: Panotools-Script abstract: 'Read, write and manipulate hugin script files' -version: 0.17 +version: 0.18 license: 'GPLv2+' author: - 'Bruno Postle <br...@po...>' Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2008-09-15 23:26:38 UTC (rev 888) +++ trunk/Panotools-Script/Makefile.PL 2008-09-16 20:14:49 UTC (rev 889) @@ -8,7 +8,7 @@ 'bin/process-masks', 'bin/erect2planet', 'bin/pto2tiff', 'bin/ptograph', '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/process-masks-gui', 'bin/enblend-svg-gui', 'bin/erect2qtvr-gui', 'bin/ptoclean', 'bin/erect2mercator', 'bin/ptosplit', 'bin/ptomerge', 'bin/panostart', 'bin/transform-pano', 'bin/nona-mask', 'bin/qtvr2erect' ], 'VERSION_FROM' => 'lib/Panotools/Script.pm', # finds $VERSION Added: trunk/Panotools-Script/bin/ptoclean =================================================================== --- trunk/Panotools-Script/bin/ptoclean (rev 0) +++ trunk/Panotools-Script/bin/ptoclean 2008-09-16 20:14:49 UTC (rev 889) @@ -0,0 +1,60 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; + +# TODO doesn't yet do everything that APClean does. +# TODO should run an optimisation strategy on each image pair and reap on results. + +my $n = 5; + +for my $path_pto (@ARGV) +{ + my $p = new Panotools::Script; + $p->Read ($path_pto); + + my @distances; + for my $point (@{$p->Control}) + { + push @distances, $point->Distance ($p); + } + + my $sum = 0; + my $max_distance = 0; + for my $distance (@distances) + { + $sum += $distance; + $max_distance = $distance if ($max_distance < $distance); + } + $max_distance = sprintf ("%.3f", $max_distance); + my $average = sprintf ("%.3f", ($sum / scalar (@distances))); + + $sum = 0; + for my $distance (@distances) + { + my $variation = $distance - $average; + $sum += $variation * $variation; + } + my $variance = $sum / scalar (@distances); + my $standard_deviation = sprintf ("%.3f", sqrt ($variance)); + + my $points_new = []; + + for my $point (@{$p->Control}) + { + push @{$points_new}, $point if ($point->Distance ($p) < ($average + ($n * $standard_deviation))); + } + + my $removed = scalar (@{$p->Control}) - scalar (@{$points_new}); + + print STDERR "Project: ". $path_pto ."\n"; + print STDERR "Points: ". scalar (@distances) .". "; + print STDERR "Average: $average. "; + print STDERR "Sigma: $standard_deviation. Max: $max_distance\n"; + print STDERR "$removed points cleaned\n"; + + $p->{control} = $points_new; + + $p->Write ($path_pto); +} + Property changes on: trunk/Panotools-Script/bin/ptoclean ___________________________________________________________________ Added: svn:executable + * Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/Control.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/Control.pm 2008-09-15 23:26:38 UTC (rev 888) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/Control.pm 2008-09-16 20:14:49 UTC (rev 889) @@ -108,8 +108,13 @@ + ($vec_N->[1]->[0] * $vec_n->[1]->[0]) + ($vec_N->[2]->[0] * $vec_n->[2]->[0])); - # FIXME assumes an equirectangular panorama - return $angle / atan2 (0,-1) * $p->Panorama->{w} / 2; + if ($p->Panorama->{f} == 0) # special case for rectilinear output + { + my $radius = $p->Panorama->{w} / 2 / tan (deg2rad ($p->Panorama->{v}/2)); + return $radius * $angle; + } + + return $angle / pi() * $p->Panorama->{w} / 2; } sub _normalise @@ -117,7 +122,6 @@ my $vector = shift; my $magnitude = _magnitude ($vector->[0]->[0], $vector->[1]->[0], $vector->[2]->[0]); - return $vector if $magnitude == 1; $vector->[0]->[0] = $vector->[0]->[0] / $magnitude; $vector->[1]->[0] = $vector->[1]->[0] / $magnitude; Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm 2008-09-15 23:26:38 UTC (rev 888) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/Image.pm 2008-09-16 20:14:49 UTC (rev 889) @@ -335,23 +335,35 @@ my $pto = shift; my $pix = shift; - # FIXME this doesn't account for d,e shift and g,t shear - $pix->[0] = ($self->{w}/2) - $pix->[0]; - $pix->[1] = ($self->{h}/2) - $pix->[1]; + $pix->[0] = ($self->{w}/2) - $pix->[0] + $self->D ($pto); + $pix->[1] = ($self->{h}/2) - $pix->[1] + $self->E ($pto); $pix = $self->_inv_radial ($pto, $pix); - my $rad = ($self->{w}/2) / tan (_deg2rad ($self->V ($pto)) / 2); + # FIXME returns false value for cylindrical and equirectangular images + my $point = [[1],[0],[0]]; - # FIXME this assumes a rectilinear image - my $point = [[$rad], [$pix->[0]], [$pix->[1]]]; + if ($self->{f} == 0) + { + my $rad = ($self->{w}/2) / tan (deg2rad ($self->V ($pto)) / 2); + $point = [[$rad], [$pix->[0]], [$pix->[1]]]; + } + if ($self->{f} == 2 or $self->{f} == 3) + { + my ($rho, $theta, $z) = cartesian_to_cylindrical ($pix->[1], $pix->[0], 1); + my $phi = $rho * deg2rad ($self->V ($pto)) / $self->{w}; + $rho = $z; + ($point->[2]->[0], + $point->[1]->[0], + $point->[0]->[0]) + = spherical_to_cartesian ($rho, $theta, $phi); + } + my $matrix = rollpitchyaw2matrix - (_deg2rad ($self->{r}), _deg2rad ($self->{p}), _deg2rad ($self->{y})); + (deg2rad ($self->{r}), deg2rad ($self->{p}), deg2rad ($self->{y})); multiply ($matrix, $point); } -sub _deg2rad { my $deg = shift; return $deg * atan2 (0,-1) / 180 } - 1; Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-15 23:26:38 UTC (rev 888) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-16 20:14:49 UTC (rev 889) @@ -36,7 +36,7 @@ use Storable qw/ dclone /; -our $VERSION = 0.17; +our $VERSION = 0.18; 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...> - 2008-09-22 21:22:17
|
Revision: 890 http://panotools.svn.sourceforge.net/panotools/?rev=890&view=rev Author: brunopostle Date: 2008-09-22 21:22:06 +0000 (Mon, 22 Sep 2008) Log Message: ----------- new Stats() method for reporting on control point errors, Prune() deletes all points with an error greater than a threshold. Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/ptoclean trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-16 20:14:49 UTC (rev 889) +++ trunk/Panotools-Script/Changes 2008-09-22 21:22:06 UTC (rev 890) @@ -7,6 +7,7 @@ - panostart EXTRA_ARGS passed to match-n-shift - new Distance() method to report control point errors, doesn't know about equirectangular/cylindrical input yet + - new Prune() and Stats() methods for working with control point errors - new tool ptoclean control point reaper 0.17 Modified: trunk/Panotools-Script/bin/ptoclean =================================================================== --- trunk/Panotools-Script/bin/ptoclean 2008-09-16 20:14:49 UTC (rev 889) +++ trunk/Panotools-Script/bin/ptoclean 2008-09-22 21:22:06 UTC (rev 890) @@ -3,6 +3,7 @@ use warnings; use Panotools::Script; +# TODO should use GetOpt # TODO doesn't yet do everything that APClean does. # TODO should run an optimisation strategy on each image pair and reap on results. @@ -13,48 +14,18 @@ my $p = new Panotools::Script; $p->Read ($path_pto); - my @distances; - for my $point (@{$p->Control}) - { - push @distances, $point->Distance ($p); - } + my ($total, $min, $max, $average, $sigma) = $p->Stats; - my $sum = 0; - my $max_distance = 0; - for my $distance (@distances) - { - $sum += $distance; - $max_distance = $distance if ($max_distance < $distance); - } - $max_distance = sprintf ("%.3f", $max_distance); - my $average = sprintf ("%.3f", ($sum / scalar (@distances))); + my $threshold = $average + ($n * $sigma); + my $pruned = $p->Prune ($threshold); - $sum = 0; - for my $distance (@distances) - { - my $variation = $distance - $average; - $sum += $variation * $variation; - } - my $variance = $sum / scalar (@distances); - my $standard_deviation = sprintf ("%.3f", sqrt ($variance)); + $p->Write ($path_pto); - my $points_new = []; + ($min, $max, $average, $sigma, $threshold) = map {sprintf ('%.3f', $_)} + ($min, $max, $average, $sigma, $threshold); - for my $point (@{$p->Control}) - { - push @{$points_new}, $point if ($point->Distance ($p) < ($average + ($n * $standard_deviation))); - } - - my $removed = scalar (@{$p->Control}) - scalar (@{$points_new}); - - print STDERR "Project: ". $path_pto ."\n"; - print STDERR "Points: ". scalar (@distances) .". "; - print STDERR "Average: $average. "; - print STDERR "Sigma: $standard_deviation. Max: $max_distance\n"; - print STDERR "$removed points cleaned\n"; - - $p->{control} = $points_new; - - $p->Write ($path_pto); + print STDERR "Project: $path_pto\n"; + print STDERR "Points: $total. Min: $min. Max: $max. Average: $average. Sigma: $sigma.\n"; + print STDERR scalar (@{$pruned}) ." points cleaned using threshold: $threshold\n"; } Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-16 20:14:49 UTC (rev 889) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-22 21:22:06 UTC (rev 890) @@ -384,6 +384,39 @@ =pod +Remove all points with an error distance greater than a threshold measured in +pixels, returns a list of deleted points: + + my $pruned = $p->Prune (12.345); + +=cut + +sub Prune +{ + my $self = shift; + my $threshold = shift; + return [] unless $threshold > 0; + my $points_new = []; + my $points_pruned = []; + + for my $point (@{$self->Control}) + { + if ($point->Distance ($self) < $threshold) + { + push @{$points_new}, $point; + } + else + { + push @{$points_pruned}, $point; + } + } + + $self->{control} = $points_new; + return $points_pruned; +} + +=pod + Extract a new object consisting of just the requested images, related control points and optimisation settings: @@ -535,6 +568,57 @@ return 1; } +=pod + +Get a summary of control point error distances in pixel units scaled to the +output panorama: + + my ($total, $min, $max, $average, $sigma) = $p->Stats; + +=cut + +sub Stats +{ + my $self = shift; + + # get a list of all the distances + my @distances; + for my $point (@{$self->Control}) + { + push @distances, $point->Distance ($self); + } + + my $total = scalar (@distances); + + return (0,0,0,0,0) unless $total; + + # calculate maximum and average distance + my $max = undef; + my $min = undef; + my $sum = 0; + for my $distance (@distances) + { + $min = $distance unless defined $min; + $min = $distance if ($min > $distance); + $max = $distance unless defined $max; + $max = $distance if ($max < $distance); + $sum += $distance; + } + my $average = $sum / $total; + + # calculate variation and standard deviation (sigma) + $sum = 0; + for my $distance (@distances) + { + my $variation = $distance - $average; + $sum += $variation * $variation; + } + my $variance = $sum / $total; + my $sigma = sqrt ($variance); + + return ($total, $min, $max, $average, $sigma); +} + =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...> - 2008-09-23 20:36:26
|
Revision: 892 http://panotools.svn.sourceforge.net/panotools/?rev=892&view=rev Author: brunopostle Date: 2008-09-23 20:36:16 +0000 (Tue, 23 Sep 2008) Log Message: ----------- Support for extra morph control point parameters (Iouri Ivliev) Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/lib/Panotools/Script/Line/ControlMorph.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-22 23:21:16 UTC (rev 891) +++ trunk/Panotools-Script/Changes 2008-09-23 20:36:16 UTC (rev 892) @@ -9,6 +9,7 @@ doesn't know about equirectangular/cylindrical input yet - new Prune() and Stats() methods for working with control point errors - new tool ptoclean control point reaper + - support for extra morph parameters (Iouri Ivliev) 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ Modified: trunk/Panotools-Script/lib/Panotools/Script/Line/ControlMorph.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script/Line/ControlMorph.pm 2008-09-22 23:21:16 UTC (rev 891) +++ trunk/Panotools-Script/lib/Panotools/Script/Line/ControlMorph.pm 2008-09-23 20:36:16 UTC (rev 892) @@ -22,12 +22,16 @@ Created automatically by optimizer i0 image + c0 control point x363.726 starting x point position y125.738 starting y point position X363.838 morphed x point position Y125.618 morphed y point position + D12.34 control point error + Dx7.89 control point error in horisontal direction + Dy-9.49 control point error in vertical direction - C i0 x363.726 y125.738 X363.838 Y125.618 + C i0 c0 x363.726 y125.738 X363.838 Y125.618 D12.34 Dx7.89 Dy-9.49 =cut @@ -36,7 +40,7 @@ my $self = shift; } -sub _valid { return '^([ixXyY])(.*)' } +sub _valid { return '^([icxXyY]|D[xy]?)(.*)' } sub Identifier { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-23 20:46:14
|
Revision: 893 http://panotools.svn.sourceforge.net/panotools/?rev=893&view=rev Author: brunopostle Date: 2008-09-23 20:46:03 +0000 (Tue, 23 Sep 2008) Log Message: ----------- match-n-shift now runs ptoclean when --align option is used Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/match-n-shift Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-23 20:36:16 UTC (rev 892) +++ trunk/Panotools-Script/Changes 2008-09-23 20:46:03 UTC (rev 893) @@ -10,6 +10,7 @@ - new Prune() and Stats() methods for working with control point errors - new tool ptoclean control point reaper - support for extra morph parameters (Iouri Ivliev) + - match-n-shift runs ptoclean with --align option 0.17 - match-n-shift workaround PTmender failure with separate /tmp/ Modified: trunk/Panotools-Script/bin/match-n-shift =================================================================== --- trunk/Panotools-Script/bin/match-n-shift 2008-09-23 20:36:16 UTC (rev 892) +++ trunk/Panotools-Script/bin/match-n-shift 2008-09-23 20:46:03 UTC (rev 893) @@ -328,7 +328,9 @@ { my $tempfile = File::Spec->catfile ($tempdir, 'align.oto'); $oto->Write ($tempfile); - system ('autooptimiser', '-a', '-l', '-s', '-o', $path_oto, $tempfile); + system ('autooptimiser', '-a', '-l', '-s', '-o', $tempfile, $tempfile); + system ('ptoclean', '-o', $tempfile, $tempfile); + system ('autooptimiser', '-n', '-l', '-o', $path_oto, $tempfile); } # voodoo This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-23 21:59:56
|
Revision: 898 http://panotools.svn.sourceforge.net/panotools/?rev=898&view=rev Author: brunopostle Date: 2008-09-23 21:59:49 +0000 (Tue, 23 Sep 2008) Log Message: ----------- ptoinfo reports global control point error distance Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/ptoinfo Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-23 21:52:43 UTC (rev 897) +++ trunk/Panotools-Script/Changes 2008-09-23 21:59:49 UTC (rev 898) @@ -8,6 +8,7 @@ - new Distance() method to report control point errors, doesn't know about equirectangular/cylindrical input yet - new Prune() and Stats() methods for working with control point errors + - ptoinfo reports global control point error distance - new tool ptoclean control point reaper - support for extra morph parameters (Iouri Ivliev) - match-n-shift runs ptoclean with --align option Modified: trunk/Panotools-Script/bin/ptoinfo =================================================================== --- trunk/Panotools-Script/bin/ptoinfo 2008-09-23 21:52:43 UTC (rev 897) +++ trunk/Panotools-Script/bin/ptoinfo 2008-09-23 21:59:49 UTC (rev 898) @@ -28,6 +28,9 @@ } print STDOUT " Normal control points: ". $results->{0} ."\n" if (defined $results->{0}); delete $results->{0}; + my ($total, $min, $max, $average, $sigma) = $pto->Stats; + print STDOUT " Average normal control point error: $average\n"; + print STDOUT " Maximum normal control point error: $max\n"; print STDOUT " Horizontal control points: ". $results->{1} ."\n" if (defined $results->{1}); delete $results->{1}; print STDOUT " Vertical control points: ". $results->{2} ."\n" if (defined $results->{2}); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-23 22:34:16
|
Revision: 895 http://panotools.svn.sourceforge.net/panotools/?rev=895&view=rev Author: brunopostle Date: 2008-09-23 21:31:23 +0000 (Tue, 23 Sep 2008) Log Message: ----------- panostart, saner method of passing extra args to make and match-n-shift Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-23 20:47:40 UTC (rev 894) +++ trunk/Panotools-Script/Changes 2008-09-23 21:31:23 UTC (rev 895) @@ -2,9 +2,9 @@ 0.18 - pafextract tool for using panoglview as a pteditor replacement - - panostart allow unsetting CLEAN to keep intermediate images + - panostart MAKE_EXTRA_ARGS passed to make - panostart rename -s parameter to -t - - panostart EXTRA_ARGS passed to match-n-shift + - panostart AP_EXTRA_ARGS passed to match-n-shift - new Distance() method to report control point errors, doesn't know about equirectangular/cylindrical input yet - new Prune() and Stats() methods for working with control point errors Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2008-09-23 20:47:40 UTC (rev 894) +++ trunk/Panotools-Script/bin/panostart 2008-09-23 21:31:23 UTC (rev 895) @@ -98,8 +98,8 @@ 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', '--clean', - '$(EXTRA_ARGS)', '--output', "$stub.pto"); + $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; @@ -117,21 +117,21 @@ my $rule_ldr_blended = new File::Pto::Mk::Rule; $rule_ldr_blended->Targets ($stub .".tif"); $rule_ldr_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); - $rule_ldr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub .".tif", '$(CLEAN)'); + $rule_ldr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub .".tif", '$(MAKE_EXTRA_ARGS)'); push @rules_ldr_blended, $rule_ldr_blended; my $rule_ldr_stacked_blended = new File::Pto::Mk::Rule; $rule_ldr_stacked_blended->Targets ($stub ."_fused.tif"); $rule_ldr_stacked_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); - $rule_ldr_stacked_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_fused.tif", '$(CLEAN)'); + $rule_ldr_stacked_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_fused.tif", '$(MAKE_EXTRA_ARGS)'); push @rules_ldr_stacked_blended, $rule_ldr_stacked_blended; my $rule_hdr_blended = new File::Pto::Mk::Rule; $rule_hdr_blended->Targets ($stub ."_hdr.exr"); $rule_hdr_blended->Prerequisites ("$stub.pto", "$stub.pto.mk", @{$group}); - $rule_hdr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_hdr.exr", '$(CLEAN)'); + $rule_hdr_blended->Command ('make', '-e', '-f', "$stub.pto.mk", $stub ."_hdr.exr", '$(MAKE_EXTRA_ARGS)'); push @rules_hdr_blended, $rule_hdr_blended; } @@ -153,8 +153,8 @@ print MAKE $rule_ptos->Assemble; print MAKE $rule_mks->Assemble; print MAKE $rule_imgs->Assemble; -print MAKE "CLEAN = clean\n"; -print MAKE "EXTRA_ARGS =\n\n"; +print MAKE "MAKE_EXTRA_ARGS=clean\n"; +print MAKE "AP_EXTRA_ARGS=--clean\n\n"; print MAKE map {$_->Assemble} @rules_pto; print MAKE map {$_->Assemble} @rules_mk; print MAKE map {$_->Assemble} @rules_ldr_blended; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-09-24 08:45:34
|
Revision: 900 http://panotools.svn.sourceforge.net/panotools/?rev=900&view=rev Author: brunopostle Date: 2008-09-24 08:45:23 +0000 (Wed, 24 Sep 2008) Log Message: ----------- add pafextract to MANIFEST, bump to 0.19 Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/META.yml trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-23 22:27:36 UTC (rev 899) +++ trunk/Panotools-Script/Changes 2008-09-24 08:45:23 UTC (rev 900) @@ -1,5 +1,8 @@ Revision history for Panotools::Script. +0.19 + - add pafextract to MANIFEST + 0.18 - pafextract tool for using panoglview as a pteditor replacement - panostart MAKE_EXTRA_ARGS passed to make Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2008-09-23 22:27:36 UTC (rev 899) +++ trunk/Panotools-Script/MANIFEST 2008-09-24 08:45:23 UTC (rev 900) @@ -10,6 +10,7 @@ bin/jpeg2qtvr bin/match-n-shift bin/nona-mask +bin/pafextract bin/panostart bin/process-masks bin/process-masks-gui Modified: trunk/Panotools-Script/META.yml =================================================================== --- trunk/Panotools-Script/META.yml 2008-09-23 22:27:36 UTC (rev 899) +++ trunk/Panotools-Script/META.yml 2008-09-24 08:45:23 UTC (rev 900) @@ -1,7 +1,7 @@ --- #YAML:1.0 name: Panotools-Script abstract: 'Read, write and manipulate hugin script files' -version: 0.18 +version: 0.19 license: 'GPLv2+' author: - 'Bruno Postle <br...@po...>' Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-23 22:27:36 UTC (rev 899) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-24 08:45:23 UTC (rev 900) @@ -36,7 +36,7 @@ use Storable qw/ dclone /; -our $VERSION = 0.18; +our $VERSION = 0.19; 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...> - 2008-09-24 23:46:29
|
Revision: 901 http://panotools.svn.sourceforge.net/panotools/?rev=901&view=rev Author: brunopostle Date: 2008-09-24 23:46:23 +0000 (Wed, 24 Sep 2008) Log Message: ----------- Centre() method to try and place images in middle of the panorama Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-09-24 08:45:23 UTC (rev 900) +++ trunk/Panotools-Script/Changes 2008-09-24 23:46:23 UTC (rev 901) @@ -1,5 +1,8 @@ Revision history for Panotools::Script. +0.20 + - Centre() method to try and place images in middle of the panorama + 0.19 - add pafextract to MANIFEST Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-24 08:45:23 UTC (rev 900) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-09-24 23:46:23 UTC (rev 901) @@ -620,6 +620,65 @@ return ($total, $min, $max, $average, $sigma); } +=pod + +Centre input images into the final panorama: + + $p->Centre ('y'); + $p->Centre ('p'); + $p->Centre ('r'); + +=cut + +sub Centre +{ + my $self = shift; + my $param = shift; + + for my $image (@{$self->Image}) + { + my $sigma_old = $self->_sigma ($param); + $image->{$param} += 360; + next if $self->_sigma ($param) < $sigma_old; + $image->{$param} -= 720; + next if $self->_sigma ($param) < $sigma_old; + $image->{$param} += 360; + } + + my $average = $self->_average ($param); + + $self->Transform (0 - $average, 0, 0) if $param eq 'r'; + $self->Transform (0, 0 - $average, 0) if $param eq 'p'; + $self->Transform (0, 0, 0 - $average) if $param eq 'y'; +} + +sub _average +{ + my $self = shift; + my $param = shift; + my $sum = 0; + for my $image (@{$self->Image}) + { + $sum += $image->{$param} + } + return $sum / scalar @{$self->Image}; +} + +sub _sigma +{ + my $self = shift; + my $param = shift; + my $sum = 0; + my $average = $self->_average ($param); + for my $image (@{$self->Image}) + { + my $variation = $image->{$param} - $average; + $sum += $variation * $variation; + } + my $variance = $sum / scalar @{$self->Image}; + return sqrt ($variance); +} + =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...> - 2008-10-06 22:15:45
|
Revision: 903 http://panotools.svn.sourceforge.net/panotools/?rev=903&view=rev Author: brunopostle Date: 2008-10-06 22:15:38 +0000 (Mon, 06 Oct 2008) Log Message: ----------- New tool ptocentre Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/MANIFEST trunk/Panotools-Script/Makefile.PL trunk/Panotools-Script/lib/Panotools/Script.pm Added Paths: ----------- trunk/Panotools-Script/bin/ptocentre Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-10-05 19:32:12 UTC (rev 902) +++ trunk/Panotools-Script/Changes 2008-10-06 22:15:38 UTC (rev 903) @@ -2,6 +2,7 @@ 0.20 - Centre() method to try and place images in middle of the panorama + - new tool ptocentre 0.19 - add pafextract to MANIFEST Modified: trunk/Panotools-Script/MANIFEST =================================================================== --- trunk/Panotools-Script/MANIFEST 2008-10-05 19:32:12 UTC (rev 902) +++ trunk/Panotools-Script/MANIFEST 2008-10-06 22:15:38 UTC (rev 903) @@ -16,6 +16,7 @@ bin/process-masks-gui bin/pto2fulla bin/pto2tiff +bin/ptocentre bin/ptoclean bin/ptograph bin/ptoinfo Modified: trunk/Panotools-Script/Makefile.PL =================================================================== --- trunk/Panotools-Script/Makefile.PL 2008-10-05 19:32:12 UTC (rev 902) +++ trunk/Panotools-Script/Makefile.PL 2008-10-06 22:15:38 UTC (rev 903) @@ -10,7 +10,7 @@ '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/transform-pano', 'bin/nona-mask', 'bin/qtvr2erect' ], + '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, Added: trunk/Panotools-Script/bin/ptocentre =================================================================== --- trunk/Panotools-Script/bin/ptocentre (rev 0) +++ trunk/Panotools-Script/bin/ptocentre 2008-10-06 22:15:38 UTC (rev 903) @@ -0,0 +1,86 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Panotools::Script; +use Getopt::Long; +use Pod::Usage; + +my $path_output; +my $roll; +my $pitch; +my $yaw; +my $help; + +GetOptions ('o|output=s' => \$path_output, + 'r|roll' => \$roll, + 'p|pitch' => \$pitch, + 'y|yaw' => \$yaw, + 'h|help' => \$help); + +pod2usage (-verbose => 2) if $help; + +my $path_pto = shift || pod2usage; +$path_output = $path_pto unless (defined $path_output); + +my $pto = new Panotools::Script; +$pto->Read ($path_pto); +$pto->Centre ('y') if $yaw; +$pto->Centre ('p') if $pitch; +$pto->Centre ('r') if $roll; + +# if images are aligned then d,e is probably bogus +if ($pto->Sigma ('r') < 100 and $pto->Sigma ('p') < 100 and $pto->Sigma ('y') < 100) +{ + for my $image (@{$pto->Image}) + { + $image->{d} = 0 unless $image->{d} =~ '='; + $image->{e} = 0 unless $image->{e} =~ '='; + } + for my $key (keys %{$pto->Variable}) + { + delete $pto->Variable->{$key}->{d}; + delete $pto->Variable->{$key}->{e}; + } +} + +$pto->Write ($path_output); + +__END__ + +=head1 NAME + +ptocentre - centre images in a panorama + +=head1 SYNOPSIS + +ptocentre [options] [--output centred.pto] input.pto + + Options: + -o | --output Filename of centred project (can be the the same as the input) + -r | --roll Centre roll + -p | --pitch Centre pitch + -y | --yaw Centre yaw + -h | --help Outputs help documentation + +=head1 DESCRIPTION + +B<ptocentre> takes a hugin .pto project and centres the images in the panorama. + +If --output isn't specified then input file is overwritten with output. + +=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 - October 2008. + +=cut Property changes on: trunk/Panotools-Script/bin/ptocentre ___________________________________________________________________ Added: svn:executable + * Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-10-05 19:32:12 UTC (rev 902) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-10-06 22:15:38 UTC (rev 903) @@ -637,19 +637,36 @@ for my $image (@{$self->Image}) { - my $sigma_old = $self->_sigma ($param); + my $sigma_old = $self->Sigma ($param); $image->{$param} += 360; - next if $self->_sigma ($param) < $sigma_old; + next if $self->Sigma ($param) < $sigma_old; $image->{$param} -= 720; - next if $self->_sigma ($param) < $sigma_old; + next if $self->Sigma ($param) < $sigma_old; $image->{$param} += 360; } - my $average = $self->_average ($param); + my $average_r = $self->_average ('r'); + my $average_p = $self->_average ('p'); + my $average_y = $self->_average ('y'); - $self->Transform (0 - $average, 0, 0) if $param eq 'r'; - $self->Transform (0, 0 - $average, 0) if $param eq 'p'; - $self->Transform (0, 0, 0 - $average) if $param eq 'y'; + if ($param eq 'r') + { + $self->Transform (0, 0, 0 - $average_y); + $self->Transform (0, 0 - $average_p, 0); + $self->Transform (0 - $average_r, 0, 0); + $self->Transform (0, $average_p, 0); + $self->Transform (0, 0, $average_y); + } + if ($param eq 'p') + { + $self->Transform (0, 0, 0 - $average_y); + $self->Transform (0, 0 - $average_p, 0); + $self->Transform (0, 0, $average_y); + } + if ($param eq 'y') + { + $self->Transform (0, 0, 0 - $average_y); + } } sub _average @@ -664,7 +681,7 @@ return $sum / scalar @{$self->Image}; } -sub _sigma +sub Sigma { my $self = shift; my $param = shift; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-10-06 22:53:29
|
Revision: 904 http://panotools.svn.sourceforge.net/panotools/?rev=904&view=rev Author: brunopostle Date: 2008-10-06 22:53:22 +0000 (Mon, 06 Oct 2008) Log Message: ----------- sync o lines with i lines when saving Modified Paths: -------------- trunk/Panotools-Script/bin/ptocentre trunk/Panotools-Script/lib/Panotools/Script.pm Modified: trunk/Panotools-Script/bin/ptocentre =================================================================== --- trunk/Panotools-Script/bin/ptocentre 2008-10-06 22:15:38 UTC (rev 903) +++ trunk/Panotools-Script/bin/ptocentre 2008-10-06 22:53:22 UTC (rev 904) @@ -33,11 +33,17 @@ { for my $image (@{$pto->Image}) { + $image->{a} = 0 unless $image->{a} =~ '='; + $image->{b} = 0 unless $image->{b} =~ '='; + $image->{c} = 0 unless $image->{c} =~ '='; $image->{d} = 0 unless $image->{d} =~ '='; $image->{e} = 0 unless $image->{e} =~ '='; } for my $key (keys %{$pto->Variable}) { + delete $pto->Variable->{$key}->{a}; + delete $pto->Variable->{$key}->{b}; + delete $pto->Variable->{$key}->{c}; delete $pto->Variable->{$key}->{d}; delete $pto->Variable->{$key}->{e}; } Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-10-06 22:15:38 UTC (rev 903) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-10-06 22:53:22 UTC (rev 904) @@ -152,6 +152,7 @@ sub Write { my $self = shift; + $self->Image2Output; my $path = shift || return 0; my $vector = shift || ''; if ($path eq '-') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-10-12 16:12:10
|
Revision: 907 http://panotools.svn.sourceforge.net/panotools/?rev=907&view=rev Author: brunopostle Date: 2008-10-12 16:12:00 +0000 (Sun, 12 Oct 2008) Log Message: ----------- rules for building qtvr etc... Modified Paths: -------------- trunk/Panotools-Script/Changes trunk/Panotools-Script/bin/panostart Modified: trunk/Panotools-Script/Changes =================================================================== --- trunk/Panotools-Script/Changes 2008-10-12 16:10:20 UTC (rev 906) +++ trunk/Panotools-Script/Changes 2008-10-12 16:12:00 UTC (rev 907) @@ -3,6 +3,7 @@ 0.20 - Centre() method to try and place images in middle of the panorama - new tool ptocentre + - panostart rules for building qtvr, mercator, planet views etc... 0.19 - add pafextract to MANIFEST Modified: trunk/Panotools-Script/bin/panostart =================================================================== --- trunk/Panotools-Script/bin/panostart 2008-10-12 16:10:20 UTC (rev 906) +++ trunk/Panotools-Script/bin/panostart 2008-10-12 16:12:00 UTC (rev 907) @@ -61,6 +61,8 @@ $rule_mks->Targets ('mk'); my $rule_imgs = new File::Pto::Mk::Rule; $rule_imgs->Targets ('images'); +my $rule_movs = new File::Pto::Mk::Rule; +$rule_movs->Targets ('qtvr'); my @rules_pto; my @rules_mk; @@ -85,15 +87,19 @@ $rule_mks->Prerequisites ("$stub.pto.mk"); my $path_img; + my $path_mov; if (is_stacks (@{$group})) { $path_img = $stub ."_fused.tif"; + $path_mov = $stub ."_fused.mov"; } else { $path_img = $stub .".tif"; + $path_mov = $stub .".mov"; } $rule_imgs->Prerequisites ($path_img); + $rule_movs->Prerequisites ($path_mov); print STDERR "$path_img: ". scalar @{$group} ." images\n" if $verbose; @@ -163,15 +169,20 @@ $rule_phony->Targets ('.PHONY'); $rule_phony->Prerequisites (qw/all images pto mk/); +my $rule_self = new File::Pto::Mk::Rule; +$rule_self->Targets ($path_makefile); +$rule_self->Prerequisites (@ARGV); +$rule_self->Command ($0, @argv_save); + open MAKE, ">", $path_makefile or die "cannot write-open $path_makefile"; print MAKE "# Created by Panotools::Script $Panotools::Script::VERSION\n"; -print MAKE "# $0 ". join (' ', @argv_save). "\n\n"; print MAKE $rule_phony->Assemble; print MAKE $rule_all->Assemble; print MAKE $rule_ptos->Assemble; print MAKE $rule_mks->Assemble; print MAKE $rule_imgs->Assemble; +print MAKE $rule_movs->Assemble; print MAKE "MAKE_EXTRA_ARGS=clean\n"; print MAKE "HUGINDATADIR=/usr/share/hugin\n"; print MAKE "AP_EXTRA_ARGS=--clean\n\n"; @@ -182,6 +193,7 @@ print MAKE map {$_->Assemble} @rules_ldr_blended_equirect; print MAKE map {$_->Assemble} @rules_ldr_stacked_blended_equirect; print MAKE map {$_->Assemble} @rules_hdr_blended; +print MAKE $rule_self->Assemble; close MAKE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bru...@us...> - 2008-10-12 21:08:27
|
Revision: 908 http://panotools.svn.sourceforge.net/panotools/?rev=908&view=rev Author: brunopostle Date: 2008-10-12 21:08:14 +0000 (Sun, 12 Oct 2008) Log Message: ----------- Old test case was correct, only update 'o' lines if project already contains 'o' lines. Modified Paths: -------------- trunk/Panotools-Script/lib/Panotools/Script.pm trunk/Panotools-Script/t/020.create-script.t Modified: trunk/Panotools-Script/lib/Panotools/Script.pm =================================================================== --- trunk/Panotools-Script/lib/Panotools/Script.pm 2008-10-12 16:12:00 UTC (rev 907) +++ trunk/Panotools-Script/lib/Panotools/Script.pm 2008-10-12 21:08:14 UTC (rev 908) @@ -152,7 +152,7 @@ sub Write { my $self = shift; - $self->Image2Output; + $self->Image2Output if scalar @{$self->Output}; my $path = shift || return 0; my $vector = shift || ''; if ($path eq '-') Modified: trunk/Panotools-Script/t/020.create-script.t =================================================================== --- trunk/Panotools-Script/t/020.create-script.t 2008-10-12 16:12:00 UTC (rev 907) +++ trunk/Panotools-Script/t/020.create-script.t 2008-10-12 21:08:14 UTC (rev 908) @@ -45,13 +45,13 @@ push @{$p->Image}, $image; } -ok (@{$p->Output} == 0, 'no o lines yet'); - { my $tempfile = File::Spec->catfile ($tempdir, '020.txt'); ok ($p->Write ($tempfile), "script written to $tempfile"); } +ok (@{$p->Output} == 0, 'no o lines yet'); +$p->Image2Output; ok (@{$p->Output} == 2, 'two o lines after Image2Output()'); ok ($p->Output->[1]->{v} == 50, 'second image inherits fov from first'); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |