The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
# -*- mode: perl; coding: utf-8; tab-width: 4; -*-

use strict;
use warnings;
use lib qw(blib/lib blib/arch);
use Cv;
use File::Basename;

my $filename = @ARGV > 0 ? shift : dirname($0).'/'."fruits.jpg";
my $image = Cv->LoadImage($filename, CV_LOAD_IMAGE_COLOR) or 
	die "Image was not loaded.\n";

# Convert to grayscale
my $gray = $image->CvtColor(CV_BGR2GRAY);
my $edge = Cv::Image->new($image->sizes, CV_MAKETYPE(CV_8U, 1));

# Create the output image
my $cedge = Cv::Image->new($image->sizes, CV_MAKETYPE(CV_8U, 3));

# Create a window
Cv->NamedWindow("Edge");
Cv->CreateTrackbar("Edge", "Threshold", my $edge_thresh = 1, 100, \&on_trackbar);

# Show the image
&on_trackbar;

# Wait for a key stroke; the same function arranges events processing
Cv->WaitKey;

# define a trackbar callback
sub on_trackbar {

    $edge = $gray->Smooth(CV_BLUR, 3, 3);

    # Run the edge detector on grayscale
    $edge = $gray->Canny($edge_thresh, $edge_thresh*3);

    # copy edge points
    $cedge->Zero;
    $image->Copy($cedge, $edge);

    $cedge->ShowImage("Edge");
}