reverse
den Bytestring zu
nä
;chst
um
Dies hat zur Folge,
dass die Daten
nun im etwas gängigeren RGB-Format vorl
iegen.
001 ###########################################
002 package Camcap;
003 ###########################################
004 use strict;
005 use warnings;
006 use Video::Capture::V4l;
007 use Imager;
008 use Imager::Misc;
009 use Log::Log4perl qw(:easy);
010
011 ###########################################
012 sub new {};
025
026 $self->{} =
027 Video::Capture::V4l->new() or
028 LOGDIE "Open video failed: $!";
029
030 bless $self, $class;
031 }
032
033 ###########################################
034 sub cam_bright {}->picture();
039 $pic->brightness($brightness);
040 $pic->set();
041 }
042
043 ###########################################
044 sub img_avg {}
052
053 ###########################################
054 sub calibrate {}))
062 > $self->{};
063
064 return if
065 img_avg($self->capture($self->{}))
066 < $self->{};
067
068 # Binary search
069 my($low, $high) = ($self->{},
070 $self->{});
071
072 for(my $max = 5;
073 $low <= $high && $max;
074 $max--) {}) <=
082 $self->{};
083
084 if($br < $self->{}) {} else {}
089 }
090 # Nothing found, use last setting
091 }
092
093 ###########################################
094 sub capture {}->capture(
103 $frameno, $self->{},
104 $self->{});
105
106 $self->{}->sync($frameno) or
107 LOGDIE "Unable to sync";
108 }
109
110 my $i = Imager->new();
111 $frame = reverse $frame;
112 $i->read(
113 type => "pnm",
114 data => "P6\n$self->{} " .
115 "$self->{}\n255\n" .
116 $frame
117 );
118 $i->flip(dir => "hv");
119 return $i;
120 }
121
122 1;
Wird das Ganze, wie in Zeile 113 geschehen,
noch von einem ``P6''-Header eingeleitet und die Breite
und Höhe des Bildes angegeben, kann die Methode read() des
CPAN-Moduls Imager daraus ein Bild im PNM-Format zaubern.
Allerdings hat sich durch die Umkehrung mit reverse auch die Reihenfolge
der Pixel umgedreht, so dass das Bild nun auf dem Kopf steht. Dies
wird sofort durch einen Aufruf der Methode flip rückgängig gemacht,
die mit den Parametern dir => "hv" eine vertikale
180-Grad-Spiegelung
vornimmt. Die Methode capture() liefert ein Objekt vom Typ
Imager zurück, das die aufrufende Funktion dann weiterverarbeiten kann.
Um die Kamera auf das Umgebungslicht einzustellen, wird ein Testbild untersucht und anhand dessen Helligkeit die Empfindlichkeit der Kamera entweder nach oben oder unten korrigiert. Doch wie misst man, ob ein Bild 'richtig' belichtet wurde?
Die Abbildungen 2 und 3 zeigen die Verteilungen aller RGB-Werte der Pixel zweier unterschiedlicher Bilder. Das Histogramm in Abbildung 2 stammt von einem stark unterbelichteten Bild, das zwar einige RGB-Werte im unteren Bereich aufweist, dann aber schlagartig abreisst und keinerlei hellere Töne zeigt. Abbildung 3 hingegen zeigt ein Histogramm eines normal belichteten Bildes. Fast alle Werte zwischen 0 und 255 sind gleichmäßig vertreten.
| Abbildung 3: Histogramm eines schwach ausgeleuchteten Fotos |
| Abbildung 4: Histogramm eines normal ausgeleuchtetes Bildes |
Um nun die Helligkeit eines aufgenommenen Testbildes zu bestimmen, verwenden wir eine primitiven Algorithmus: Alle RGB-Werte werden aufaddiert, durch drei und die Anzahl der Pixel geteilt, und wenn dann etwa die Hälfte von 256 herauskommt, ist das Bild einigermaßen ausgewogen.
Allerdings ist Perl nicht gerade für solche Sprints konzipiert. Ein Bild mit 320 mal 240 Pixeln, von denen jeder einen Wert im Rot-, Blau- und Grün-Kanal hat, besitzt 230.400 Datenpunkte. Diese alle abzuklappern, dauert Zeit, und wenn nicht jeder Zugriff blitzschnell erfolgt, gestaltet sich die Berechnung äußerst schleppend.
bGlossy Nakedwomenprancing Naked Newsafety Naked Celebrity Celebs Naked Women Prancing Celebrity Celebs Celebrities Cunt Nude Celebrity Porn Celebrity Cunt Nude Nude Male Celebrities Sexy Cunt Naked Panties Topless Tgp Topless Lesbians Topless Tiny Topless Fuck Topless Cunt Russian Cunt Models Non Nude Topless Lita Naked Topless Celebs Topless Celebrities Sluts Topless Celeb Topless Little Topless Xxx Topless Celebrity Topless Topless Picture Topless Porn Spione wie wire Non Cunt Models uGlossy Nakedwomenprancing Naked Newsafety Naked Celebrity Celebs Naked Women Prancing Celebrity Celebs Celebrities Cunt Nude Celebrity Porn Celebrity Cunt Nude Nude Male Celebrities Sexy Cunt Naked Panties Topless Tgp Topless Lesbians Topless Tiny Topless Fuck Topless Cunt Russian Cunt Models Non Nude Topless Lita Naked Topless Celebs Topless Celebrities Sluts Topless Celeb Topless Little Topless Xxx Topless Celebrity Topless Topless Picture Topless Porn Spione wie wirr Tgp Celebrity