Re: webcam that can make "instant shots"?



On Thu, 22 Dec 2005 19:36:39 GMT, Ignoramus16420
<ignoramus16420@xxxxxxxxxxxxxxxxxxxx> wrote:


>What I would like to know is if something like that is available for
>linux. I have a logitech webcam. I do not mind writing shell or perl
>scripts and such to make it convenient, as long as it is somehow
>supported.
>
>Anyone knows anything?
>
>Again, what I want is to be able to take a webcam, press a button, and
>get a picture on the hard drive.
>
>thanks

The xawtv program does that, just select composite as your video source,
but you may need a tv card.

Antways, here is a Perl script that does it, let me know if you need
help getting it to run. Works fine here, but I have my camera feeding
into a TV card.
The way it works, is that it displays a photo( the first screenshot it
finds), then you hit 'Update' to get another snapshot. When you like the
shot, click "Save" and it will be saved as a timestamped jpg.


#!/usr/bin/perl
use warnings;
use strict;
use Video::Capture::V4l;
use Imager;
use Tk;
use Tk::JPEG;
use MIME::Base64;

my $timestamp;
my $temp = '';

sub grab_one {
$temp = '';
$timestamp = scalar(localtime);
$timestamp =~ tr/ /_/;
$| = 1;

my $grab = new Video::Capture::V4l
or die "Unable to open Videodevice: $!";

# the following initializes the camera for NTSC
my $channel = $grab->channel(1); #1 is composite 0 is for tuner
my $tuner = $grab->tuner(0);
$tuner->mode(1);
$channel->norm(1);
$tuner->set;
$channel->set;

my $frame = 0;
my $fr = $grab->capture( $frame, 320, 240 );
my $count = 0;

for ( 0 .. 1 ) {
my $nfr = $grab->capture( 1 - $frame, 320, 240 );
$grab->sync($frame) or die "unable to sync";

unless ( $count == 0 ) {

# save $fr now, as it contains the raw BGR data
$temp = '';
open( JP, '>', \$temp ) or die $!;
print JP "P6\n320 240\n255\n"; #header
$nfr = reverse $nfr;
print JP $nfr;
close JP;

my $img = Imager->new();
$img->read( data => $temp, type => 'pnm' )
or warn $img->errstr();
$img->flip( dir => "hv" );
$img->write( data => \$temp, type => 'jpeg' )
or warn $img->errstr;
}
$count++;
$frame = 1 - $frame;
$fr = $nfr;
}
}

grab_one();

my $mw = MainWindow->new();
my $image = $mw->Photo( -data => encode_base64($temp) );
$mw->Label( -image => $image )->pack( -expand => 1, -fill => 'both' );

my $label =
$mw->Label( -text => $timestamp )->pack( -side => 'top', -padx => 3 );

my $center = $mw->Frame->pack( -anchor => 'center' );
$center->Button( -text => 'Quit', -command => [ destroy => $mw ] )
->pack( -side => 'left', -padx => 3 );
$center->Button( -text => 'Update', -command => \&update )
->pack( -side => 'left', -padx => 3 );
$center->Button( -text => 'Save', -command => \&save_it )
->pack( -side => 'left', -padx => 3 );

MainLoop;

sub save_it {
open( JP, "> $timestamp.jpg" ) or die $!;
print JP $temp;
close JP;
$label->configure( -text => "$timestamp.jpg SAVED" );
$label->update;
}

sub update {
grab_one();
$label->configure( -text => "$timestamp" );
$label->update;
$image->configure( -data => encode_base64($temp) );
$image->update;
$mw->update;
}

__END__


--
I'm not really a human, but I play one on earth.
http://zentara.net/japh.html
.