Update the changelog
[opencv] / apps / Hawk / demos / DistTrans.c
1 char wndname[] = "Distance transform";\r
2 char tbarname[] = "Threshold";\r
3 int edge_thresh = 1;\r
4 \r
5 // Load the source image\r
6 IPLIMAGE image = load_iplimage( "y2k.bmp" );\r
7 \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
14 \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
19 \r
20 // define a trackbar callback\r
21 void on_trackbar( int h )\r
22 {\r
23     int j;\r
24     int distStep = dist -> widthStep / 4;\r
25     float* currPointer;\r
26     \r
27     cvThreshold( gray, edge,\r
28                  ( float )( edge_thresh ),\r
29                  ( float )( edge_thresh ),\r
30                   CV_THRESH_BINARY );\r
31     //Distance transform                  \r
32     cvDistTransform( edge, dist,\r
33                      CV_DIST_L2,\r
34                      CV_DIST_MASK_5,\r
35                      NULL );\r
36 \r
37     cvConvertScale( dist, dist, 5000.0, 0 );\r
38     \r
39     for( j = 0, currPointer = dist -> imageData; j < dist -> height; j++, currPointer += distStep )\r
40     {\r
41         cvbSqrt( ( float* )( currPointer ),\r
42                  ( float* )( currPointer ),\r
43                  dist -> width );            \r
44     }\r
45     \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
54 }\r
55 \r
56 // Create a window\r
57 named_window( wndname, 0 );\r
58 \r
59 // create a toolbar \r
60 create_trackbar( tbarname, wndname, &edge_thresh, 255, on_trackbar );\r
61 \r
62 // Show the image\r
63 on_trackbar( 0 );\r
64 \r
65 // Wait for a key stroke; the same function arranges events processing\r
66 wait_key( 0 );\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
76 \r