distrans.c
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:4k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include <stdio.h>
  4. char wndname[] = "Distance transform";
  5. char tbarname[] = "Threshold";
  6. int mask_size = CV_DIST_MASK_5;
  7. int build_voronoi = 0;
  8. int edge_thresh = 100;
  9. // The output and temporary images
  10. IplImage* dist = 0;
  11. IplImage* dist8u1 = 0;
  12. IplImage* dist8u2 = 0;
  13. IplImage* dist8u = 0;
  14. IplImage* dist32s = 0;
  15. IplImage* gray = 0;
  16. IplImage* edge = 0;
  17. IplImage* labels = 0;
  18. // threshold trackbar callback
  19. void on_trackbar( int dummy )
  20. {
  21.     static const uchar colors[][3] = 
  22.     {
  23.         {0,0,0},
  24.         {255,0,0},
  25.         {255,128,0},
  26.         {255,255,0},
  27.         {0,255,0},
  28.         {0,128,255},
  29.         {0,255,255},
  30.         {0,0,255},
  31.         {255,0,255}
  32.     };
  33.     
  34.     int msize = mask_size;
  35.     cvThreshold( gray, edge, (float)edge_thresh, (float)edge_thresh, CV_THRESH_BINARY );
  36.     if( build_voronoi )
  37.         msize = CV_DIST_MASK_5;
  38.     cvDistTransform( edge, dist, CV_DIST_L2, msize, NULL, build_voronoi ? labels : NULL );
  39.     if( !build_voronoi )
  40.     {
  41.         // begin "painting" the distance transform result
  42.         cvConvertScale( dist, dist, 5000.0, 0 );
  43.         cvPow( dist, dist, 0.5 );
  44.     
  45.         cvConvertScale( dist, dist32s, 1.0, 0.5 );
  46.         cvAndS( dist32s, cvScalarAll(255), dist32s, 0 );
  47.         cvConvertScale( dist32s, dist8u1, 1, 0 );
  48.         cvConvertScale( dist32s, dist32s, -1, 0 );
  49.         cvAddS( dist32s, cvScalarAll(255), dist32s, 0 );
  50.         cvConvertScale( dist32s, dist8u2, 1, 0 );
  51.         cvMerge( dist8u1, dist8u2, dist8u2, 0, dist8u );
  52.         // end "painting" the distance transform result
  53.     }
  54.     else
  55.     {
  56.         int i, j;
  57.         for( i = 0; i < labels->height; i++ )
  58.         {
  59.             int* ll = (int*)(labels->imageData + i*labels->widthStep);
  60.             float* dd = (float*)(dist->imageData + i*dist->widthStep);
  61.             uchar* d = (uchar*)(dist8u->imageData + i*dist8u->widthStep);
  62.             for( j = 0; j < labels->width; j++ )
  63.             {
  64.                 int idx = ll[j] == 0 || dd[j] == 0 ? 0 : (ll[j]-1)%8 + 1;
  65.                 int b = cvRound(colors[idx][0]);
  66.                 int g = cvRound(colors[idx][1]);
  67.                 int r = cvRound(colors[idx][2]);
  68.                 d[j*3] = (uchar)b;
  69.                 d[j*3+1] = (uchar)g;
  70.                 d[j*3+2] = (uchar)r;
  71.             }
  72.         }
  73.     }
  74.     
  75.     cvShowImage( wndname, dist8u );
  76. }
  77. int main( int argc, char** argv )
  78. {
  79.     char* filename = argc == 2 ? argv[1] : (char*)"stuff.jpg";
  80.     if( (gray = cvLoadImage( filename, 0 )) == 0 )
  81.         return -1;
  82.     printf( "Hot keys: n"
  83.         "tESC - quit the programn"
  84.         "t3 - use 3x3 maskn"
  85.         "t5 - use 5x5 maskn"
  86.         "t0 - use precise distance transformn"
  87.         "tv - switch Voronoi diagram mode on/offn"
  88.         "tENTER - loop through all the modesn" );
  89.     dist = cvCreateImage( cvGetSize(gray), IPL_DEPTH_32F, 1 );
  90.     dist8u1 = cvCloneImage( gray );
  91.     dist8u2 = cvCloneImage( gray );
  92.     dist8u = cvCreateImage( cvGetSize(gray), IPL_DEPTH_8U, 3 );
  93.     dist32s = cvCreateImage( cvGetSize(gray), IPL_DEPTH_32S, 1 );
  94.     edge = cvCloneImage( gray );
  95.     labels = cvCreateImage( cvGetSize(gray), IPL_DEPTH_32S, 1 );
  96.     cvNamedWindow( wndname, 1 );
  97.     cvCreateTrackbar( tbarname, wndname, &edge_thresh, 255, on_trackbar );
  98.     for(;;)
  99.     {
  100.         int c;
  101.         
  102.         // Call to update the view
  103.         on_trackbar(0);
  104.         c = cvWaitKey(0);
  105.         if( (char)c == 27 )
  106.             break;
  107.         if( (char)c == '3' )
  108.             mask_size = CV_DIST_MASK_3;
  109.         else if( (char)c == '5' )
  110.             mask_size = CV_DIST_MASK_5;
  111.         else if( (char)c == '0' )
  112.             mask_size = CV_DIST_MASK_PRECISE;
  113.         else if( (char)c == 'v' )
  114.             build_voronoi ^= 1;
  115.         else if( (char)c == 'n' )
  116.         {
  117.             if( build_voronoi )
  118.             {
  119.                 build_voronoi = 0;
  120.                 mask_size = CV_DIST_MASK_3;
  121.             }
  122.             else if( mask_size == CV_DIST_MASK_3 )
  123.                 mask_size = CV_DIST_MASK_5;
  124.             else if( mask_size == CV_DIST_MASK_5 )
  125.                 mask_size = CV_DIST_MASK_PRECISE;
  126.             else if( mask_size == CV_DIST_MASK_PRECISE )
  127.                 build_voronoi = 1;
  128.         }
  129.     }
  130.     cvReleaseImage( &gray );
  131.     cvReleaseImage( &edge );
  132.     cvReleaseImage( &dist );
  133.     cvReleaseImage( &dist8u );
  134.     cvReleaseImage( &dist8u1 );
  135.     cvReleaseImage( &dist8u2 );
  136.     cvReleaseImage( &dist32s );
  137.     cvReleaseImage( &labels );
  138.     
  139.     cvDestroyWindow( wndname );
  140.     
  141.     return 0;
  142. }