#! /usr/bin/env octave
cv;
highgui;

global g;

g.wndname = "Distance transform";
g.tbarname = "Threshold";

## The output images
g.dist = 0;
g.dist8u1 = 0;
g.dist8u2 = 0;
g.dist8u = 0;
g.dist32s = 0;

g.gray = 0;
g.edge = 0;

## define a trackbar callback
function on_trackbar( edge_thresh )
  global g;
  global cv;

  cvThreshold( g.gray, g.edge, double(edge_thresh), double(edge_thresh), cv.CV_THRESH_BINARY );
  ## Distance transform                  
  cvDistTransform( g.edge, g.dist, cv.CV_DIST_L2, cv.CV_DIST_MASK_5, [], [] );

  cvConvertScale( g.dist, g.dist, 5000.0, 0 );
  cvPow( g.dist, g.dist, 0.5 );

  cvConvertScale( g.dist, g.dist32s, 1.0, 0.5 );
  cvAndS( g.dist32s, cvScalarAll(255), g.dist32s, [] );
  cvConvertScale( g.dist32s, g.dist8u1, 1, 0 );
  cvConvertScale( g.dist32s, g.dist32s, -1, 0 );
  cvAddS( g.dist32s, cvScalarAll(255), g.dist32s, [] );
  cvConvertScale( g.dist32s, g.dist8u2, 1, 0 );
  cvMerge( g.dist8u1, g.dist8u2, g.dist8u2, [], g.dist8u );
  cvShowImage( g.wndname, g.dist8u );
endfunction


edge_thresh = 100;

filename = "../c/stuff.jpg";
if (size(argv, 1) > 1)
  filename = argv(){1};
endif

g.gray = cvLoadImage( filename, 0 );
if (!swig_this(g.gray))
  printf("Failed to load %s\n",filename);
  exit(-1);
endif

## Create the output image
g.dist = cvCreateImage( cvSize(g.gray.width,g.gray.height), IPL_DEPTH_32F, 1 );
g.dist8u1 = cvCloneImage( g.gray );
g.dist8u2 = cvCloneImage( g.gray );
g.dist8u = cvCreateImage( cvSize(g.gray.width,g.gray.height), IPL_DEPTH_8U, 3 );
g.dist32s = cvCreateImage( cvSize(g.gray.width,g.gray.height), IPL_DEPTH_32S, 1 );

## Convert to grayscale
g.edge = cvCloneImage( g.gray );

## Create a window
cvNamedWindow( g.wndname, 1 );

## create a toolbar 
cvCreateTrackbar( g.tbarname, g.wndname, edge_thresh, 255, @on_trackbar );

## Show the image
on_trackbar(edge_thresh);

## Wait for a key stroke; the same function arranges events processing
cvWaitKey(0);