#!/usr/bin/python
import sys
from opencv.cv import *
from opencv.highgui import *

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

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

gray = 0;
edge = 0;

# define a trackbar callback
def on_trackbar( edge_thresh ):

    cvThreshold( gray, edge, float(edge_thresh), float(edge_thresh), CV_THRESH_BINARY );
    #Distance transform                  
    cvDistTransform( edge, dist, CV_DIST_L2, CV_DIST_MASK_5, None, None );

    cvConvertScale( dist, dist, 5000.0, 0 );
    cvPow( dist, dist, 0.5 );
    
    cvConvertScale( dist, dist32s, 1.0, 0.5 );
    cvAndS( dist32s, cvScalarAll(255), dist32s, None );
    cvConvertScale( dist32s, dist8u1, 1, 0 );
    cvConvertScale( dist32s, dist32s, -1, 0 );
    cvAddS( dist32s, cvScalarAll(255), dist32s, None );
    cvConvertScale( dist32s, dist8u2, 1, 0 );
    cvMerge( dist8u1, dist8u2, dist8u2, None, dist8u );
    cvShowImage( wndname, dist8u );


if __name__ == "__main__":
    edge_thresh = 100;

    filename = "../c/stuff.jpg"
    if len(sys.argv) > 1:
        filename = sys.argv[1]

    gray = cvLoadImage( filename, 0 )
    if not gray:
        print "Failed to load %s" % filename
        sys.exit(-1)

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

    # Convert to grayscale
    edge = cvCloneImage( gray );

    # Create a window
    cvNamedWindow( wndname, 1 );

    # create a toolbar 
    cvCreateTrackbar( tbarname, 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);