1 char wndname[] = "Distance transform";
\r
2 char tbarname[] = "Threshold";
\r
5 // Load the source image
\r
6 IPLIMAGE image = load_iplimage( "y2k.bmp" );
\r
8 // Create the output image
\r
9 IPLIMAGE dist = cvCreateImage( cvSize( image -> width, image -> height ), IPL_DEPTH_32F, 1 );
\r
10 IPLIMAGE dist8u1 = cvCreateImage( cvSize( image -> width, image -> height ), IPL_DEPTH_8U, 1 );
\r
11 IPLIMAGE dist8u2 = cvCreateImage( cvSize( image -> width, image -> height ), IPL_DEPTH_8U, 1 );
\r
12 IPLIMAGE dist8u = cvCreateImage( cvSize( image -> width, image -> height ), IPL_DEPTH_8U, 3 ); // Converted depth32f to depth8u
\r
13 IPLIMAGE dist32s = cvCreateImage( cvSize( image -> width, image -> height ), IPL_DEPTH_32S, 1 );
\r
15 // Convert to grayscale
\r
16 IPLIMAGE gray = cvCreateImage( cvSize(image->width, image->height), IPL_DEPTH_8U, 1 );
\r
17 IPLIMAGE edge = cvCreateImage( cvSize(image->width, image->height), IPL_DEPTH_8U, 1 ); // After Threshold
\r
18 cvCvtColor( image, gray, CV_BGR2GRAY );
\r
20 // define a trackbar callback
\r
21 void on_trackbar( int h )
\r
24 int distStep = dist -> widthStep / 4;
\r
27 cvThreshold( gray, edge,
\r
28 ( float )( edge_thresh ),
\r
29 ( float )( edge_thresh ),
\r
31 //Distance transform
\r
32 cvDistTransform( edge, dist,
\r
37 cvConvertScale( dist, dist, 5000.0, 0 );
\r
39 for( j = 0, currPointer = dist -> imageData; j < dist -> height; j++, currPointer += distStep )
\r
41 cvbSqrt( ( float* )( currPointer ),
\r
42 ( float* )( currPointer ),
\r
46 cvConvertScale( dist, dist32s, 1.0, 0.5 );
\r
47 cvAndS( dist32s, cvScalarAll(255), dist32s, 0 );
\r
48 cvConvertScale( dist32s, dist8u1, 1, 0 );
\r
49 cvConvertScale( dist32s, dist32s, -1, 0 );
\r
50 cvAddS( dist32s, cvScalarAll(255), dist32s, 0 );
\r
51 cvConvertScale( dist32s, dist8u2, 1, 0 );
\r
52 cvCvtPlaneToPix( dist8u1, dist8u2, dist8u2, 0, dist8u );
\r
53 show_iplimage( wndname, dist8u );
\r
57 named_window( wndname, 0 );
\r
59 // create a toolbar
\r
60 create_trackbar( tbarname, wndname, &edge_thresh, 255, on_trackbar );
\r
65 // Wait for a key stroke; the same function arranges events processing
\r
67 cvReleaseImage( &image );
\r
68 cvReleaseImage( &gray );
\r
69 cvReleaseImage( &edge );
\r
70 cvReleaseImage( &dist );
\r
71 cvReleaseImage( &dist8u );
\r
72 cvReleaseImage( &dist8u1 );
\r
73 cvReleaseImage( &dist8u2 );
\r
74 cvReleaseImage( &dist32s );
\r
75 destroy_window( wndname );
\r