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 )