some samples updated according to new CommandLineParser class
[profile/ivi/opencv.git] / samples / c / morphology.c
1 #include "opencv2/highgui/highgui.hpp"
2 #include "opencv2/imgproc/imgproc_c.h"
3
4 #include <stdio.h>
5
6 IplImage* src = 0;
7 IplImage* dst = 0;
8
9 IplConvKernel* element = 0;
10 int element_shape = CV_SHAPE_RECT;
11
12 //the address of variable which receives trackbar position update
13 int max_iters = 10;
14 int open_close_pos = 0;
15 int erode_dilate_pos = 0;
16
17 // callback function for open/close trackbar
18 void OpenClose(int pos)
19 {
20     int n = open_close_pos - max_iters;
21     int an = n > 0 ? n : -n;
22     element = cvCreateStructuringElementEx( an*2+1, an*2+1, an, an, element_shape, 0 );
23     if( n < 0 )
24     {
25         cvErode(src,dst,element,1);
26         cvDilate(dst,dst,element,1);
27     }
28     else
29     {
30         cvDilate(src,dst,element,1);
31         cvErode(dst,dst,element,1);
32     }
33     cvReleaseStructuringElement(&element);
34     cvShowImage("Open/Close",dst);
35 }
36
37 // callback function for erode/dilate trackbar
38 void ErodeDilate(int pos)
39 {
40     int n = erode_dilate_pos - max_iters;
41     int an = n > 0 ? n : -n;
42     element = cvCreateStructuringElementEx( an*2+1, an*2+1, an, an, element_shape, 0 );
43     if( n < 0 )
44     {
45         cvErode(src,dst,element,1);
46     }
47     else
48     {
49         cvDilate(src,dst,element,1);
50     }
51     cvReleaseStructuringElement(&element);
52     cvShowImage("Erode/Dilate",dst);
53 }
54
55 void help()
56 {
57     printf( "This program demonstrated the use of the morphology operator, especially open, close, erode, dilate operations\n"
58                 "Morphology operators are built on max (close) and min (open) operators as measured by pixels covered by small structuring elements.\n"
59                 "These operators are very efficient.\n"
60                 "This program also allows you to play with elliptical, rectangluar and cross structure elements\n"
61                 "Call:\n"
62                 "./morphologyc [image_name -- Default baboon.jpg]\n"
63                 "\nHot keys: \n"
64         "\tESC - quit the program\n"
65         "\tr - use rectangle structuring element\n"
66         "\te - use elliptic structuring element\n"
67         "\tc - use cross-shaped structuring element\n"
68         "\tSPACE - loop through all the options\n" );
69 }
70
71 int main( int argc, char** argv )
72 {
73     char* filename = argc == 2 ? argv[1] : (char*)"baboon.jpg";
74     if( (src = cvLoadImage(filename,1)) == 0 )
75         return -1;
76
77     help();
78
79     dst = cvCloneImage(src);
80
81     //create windows for output images
82     cvNamedWindow("Open/Close",1);
83     cvNamedWindow("Erode/Dilate",1);
84
85     open_close_pos = erode_dilate_pos = max_iters;
86     cvCreateTrackbar("iterations", "Open/Close",&open_close_pos,max_iters*2+1,OpenClose);
87     cvCreateTrackbar("iterations", "Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ErodeDilate);
88
89     for(;;)
90     {
91         int c;
92
93         OpenClose(open_close_pos);
94         ErodeDilate(erode_dilate_pos);
95         c = cvWaitKey(0);
96
97         if( (char)c == 27 )
98             break;
99         if( (char)c == 'e' )
100             element_shape = CV_SHAPE_ELLIPSE;
101         else if( (char)c == 'r' )
102             element_shape = CV_SHAPE_RECT;
103         else if( (char)c == 'c' )
104             element_shape = CV_SHAPE_CROSS;
105         else if( (char)c == ' ' )
106             element_shape = (element_shape + 1) % 3;
107     }
108
109     //release images
110     cvReleaseImage(&src);
111     cvReleaseImage(&dst);
112
113     //destroy windows
114     cvDestroyWindow("Open/Close");
115     cvDestroyWindow("Erode/Dilate");
116
117     return 0;
118 }