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

use strict;
use warnings;
# use Test::More qw(no_plan);
use Test::More tests => 13;
use Test::Exception;
BEGIN { use_ok('Cv', -nomore) }

my $verbose = Cv->hasGUI;
my $win = $0;

if ($verbose) {
	Cv->NamedWindow($win);
}

my $image = &makeImage($win);
my $inrange;

sub sumInrange {
	${$inrange->Sum}[0] / 255;
}

my ($lower, $upper) = (0, 255);

if ($verbose) {
	Cv->CreateTrackbar("Lower", $win, $lower, 255, \&refresh);
	Cv->CreateTrackbar("Upper", $win, $upper, 255, \&refresh);
}

sub refresh {
	$inrange = 
		$image->cvtColor(CV_RGB2GRAY)->inRange(
			cvScalar($lower), cvScalar($upper),
			# $image->new(CV_8UC1),
		);
	my $src2 = Cv->merge([$inrange, $inrange, $inrange]);
	my $dst = $image->and($src2);
	if ($verbose) {
		$dst->show($0);
	}
}

&refresh;

foreach (
	# { Lower =>   0, Upper => 255, Sum => 76800 },
	{ Lower =>   0, Upper => 254, Sum => 46800 },
	{ Lower => 129, Upper => 254, Sum => 40000 },
	{ Lower => 129, Upper => 222, Sum => 30000 },
	{ Lower => 129, Upper => 205, Sum => 20000 },
	{ Lower => 129, Upper => 173, Sum => 10000 },
	{ Lower => 129, Upper => 162, Sum =>     0 },
	) {
	if ($verbose) {
		Cv->setTrackbarPos("Upper", $win, $_->{Upper});
		Cv->setTrackbarPos("Lower", $win, $_->{Lower});
		Cv->waitKey(1000);
	} else {
		$lower = $_->{Lower};
		$upper = $_->{Upper};
		&refresh;
	}
	is(&sumInrange, $_->{Sum});
}

if (10) {
	my $src = Cv::Mat->new([240, 320], CV_8UC1);
	my $lower = Cv::Mat->new([240, 320], CV_8UC2);
	my $upper = Cv::Mat->new([240, 320], CV_8UC2);
	throws_ok { $src->inRange($lower, $upper) } qr/OpenCV Error:/;
}

if (11) {
	my $src = Cv::Mat->new([240, 320], CV_32FC1);
	my $lower = Cv::Mat->new([240, 320], CV_32FC1);
	my $upper = Cv::Mat->new([240, 320], CV_32FC1);
	lives_ok { $src->inRange($lower, $upper) };
}

sub makeImage {
	my $win = shift;
	my $src = Cv::Image->new([240, 320], CV_8UC3);
	$src->fill(cvScalarAll(255));
	my $s1 = $src->width * $src->height * 255;
	is($src->sum->[0], $s1);

	if ($verbose) {
		$src->show($win);
		Cv->waitKey(100);
	}

	my ($x, $y, $w, $h) = ($src->width/2 - 50, $src->height/2 - 50, 100, 100);
	my $submat = $src->GetSubRect([ $x, $y, $w, $h ]);
	$submat->fill(cvScalarAll(127));
	my $s2 = $submat->width * $submat->height * 127;
	is($submat->sum->[0], $s2);

	if ($verbose) {
		$src->show($win);
		Cv->waitKey(100);
	}

	my $s3 = $submat->width * $submat->height * 255;
	is($src->sum->[0], $s1 + $s2 - $s3);

	$submat = undef;
	is($src->sum->[0], $s1 + $s2 - $s3);

	foreach (
		{ rect => [ $x - 80, $y - 60, $w, $h ], color => [ 255, 128, 196 ] },
		{ rect => [ $x + 80, $y - 60, $w, $h ], color => [ 196, 255, 128 ] },
		{ rect => [ $x + 80, $y + 60, $w, $h ], color => [ 255, 196, 128 ] },
		{ rect => [ $x - 80, $y + 60, $w, $h ], color => [ 196, 128, 255 ] },
		) {
		$submat = $src->GetSubRect($_->{rect});
		$submat->fill($_->{color});
	}

	if ($verbose) {
		$src->show($win);
		Cv->waitKey(100);
	}

	$src;
}