PDL-OpenCV
view release on metacpan or search on metacpan
maint/genlists view on Meta::CPAN
#!perl
use strict;
use warnings;
use JSON::PP;
use File::Basename;
use File::Spec::Functions;
use File::Temp qw(tempdir);
use File::Path qw(make_path);
use File::Basename qw(dirname);
use Cwd;
use IPC::Open2;
use Data::Dumper;
my $HEADERS_FILE = 'maint/headers.txt';
my $HEADERS_DIR = '/usr/include/opencv4/opencv2';
my $CVDIR = '../opencv/modules/python/src2';
my $PYSCRIPT = <<'EOF';
import hdr_parser, json, sys
parser = hdr_parser.CppHeaderParser()
json.dump([[*x,parser.parse(x[1])] for x in [json.loads(x) for x in sys.stdin.read().splitlines()]], sys.stdout)
EOF
my @HEADERS = map {
chomp; my ($dest, @files) = split / /; map [$dest, $_], @files;
} do { local @ARGV = $HEADERS_FILE; grep !/^\s*#/, <> };
my %dest2headers; push @{$dest2headers{$_->[0]}}, $_->[1] for @HEADERS;
my $tdir = tempdir(CLEANUP=>1);
my %force_wrap = (
RotatedRect => [['.*angle.*']],
RNG => [['.*']],
TermCriteria => [['.*']],
);
my $class_re = join '|', keys %force_wrap;
my $cons_re = join '|',
map "$_\\((?:".join('|', '', @{$force_wrap{$_}[0]}).")\\)", # always default
keys %force_wrap;
sub process_header {
my ($dir, $file) = @_;
open my $fh, '<', catfile($dir, "$file.hpp") or die "$file.hpp: $!";
my $outfile = catfile($tdir, "$file.hpp");
my $outdir = dirname $outfile;
make_path $outdir or die "$outdir: $!" if !-d $outdir;
open my $outfh, '>', $outfile or die "$outfile: $!";
my $intext = do { local $/; <$fh> };
$intext =~ s/(class\s+)(CV_EXPORTS)(\s+(?:$class_re))/$1${2}_W$3/g;
$intext =~ s/^(\s*)($cons_re)/${1}CV_WRAP $2/gm;
$intext =~ s/^(\s*)((?:.*?boundingRect|void\s+fill)\()/${1}CV_WRAP $2/gm;
print $outfh $intext;
$outfile;
}
my $json_data;
{
my $old_dir = getcwd();
chdir $CVDIR or die "chdir: $!";
my $pid = open2(my $child_out, my $child_in, qw(python3 -c), $PYSCRIPT);
print $child_in map encode_json([$_->[0], process_header($HEADERS_DIR, $_->[1])])."\n", @HEADERS;
close $child_in;
$json_data = decode_json do { local $/; <$child_out> };
chdir $old_dir or die "chdir: $!";
}
my %force = map +($_=>1), qw(
cv.batchDistance
cv.sum
cv.wrapperEMD
cv.GeneralizedHough.detect
cv.RNG.fill
cv.Algorithm.read
cv.Algorithm.write
cv.FileNode.keys
cv.FileNode.rawSize
cv.FileStorage.getFirstTopLevelNode
cv.FileStorage.operator[]
cv.KeyPoint.overlap
cv.KeyPoint.convert
cv.RotatedRect.boundingRect
cv.cvtColor
cv.rectangle
cv.ellipse2Poly
cv.getAffineTransform
cv.getGaborKernel
cv.fitEllipseDirect
cv.drawContours
( run in 1.506 second using v1.01-cache-2.11-cpan-140bd7fdf52 )