samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp#

Sample code for simple filters Sample screenshot
Check the corresponding tutorial for more details

  1/**
  2 * file Smoothing.cpp
  3 * brief Sample code for simple filters
  4 * author OpenCV team
  5 */
  6
  7#include <iostream>
  8#include "opencv2/imgproc.hpp"
  9#include "opencv2/imgcodecs.hpp"
 10#include "opencv2/highgui.hpp"
 11
 12using namespace std;
 13using namespace cv;
 14
 15/// Global Variables
 16int DELAY_CAPTION = 1500;
 17int DELAY_BLUR = 100;
 18int MAX_KERNEL_LENGTH = 31;
 19
 20Mat src; Mat dst;
 21char window_name[] = "Smoothing Demo";
 22
 23/// Function headers
 24int display_caption( const char* caption );
 25int display_dst( int delay );
 26
 27
 28/**
 29 * function main
 30 */
 31int main( int argc, char ** argv )
 32{
 33    namedWindow( window_name, WINDOW_AUTOSIZE );
 34
 35    /// Load the source image
 36    const char* filename = argc >=2 ? argv[1] : "lena.jpg";
 37
 38    src = imread( samples::findFile( filename ), IMREAD_COLOR );
 39    if (src.empty())
 40    {
 41        printf(" Error opening image\n");
 42        printf(" Usage:\n %s [image_name-- default lena.jpg] \n", argv[0]);
 43        return EXIT_FAILURE;
 44    }
 45
 46    if( display_caption( "Original Image" ) != 0 )
 47    {
 48        return 0;
 49    }
 50
 51    dst = src.clone();
 52    if( display_dst( DELAY_CAPTION ) != 0 )
 53    {
 54        return 0;
 55    }
 56
 57    /// Applying Homogeneous blur
 58    if( display_caption( "Homogeneous Blur" ) != 0 )
 59    {
 60        return 0;
 61    }
 62
 63    //![blur]
 64    for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
 65    {
 66        blur( src, dst, Size( i, i ), Point(-1,-1) );
 67        if( display_dst( DELAY_BLUR ) != 0 )
 68        {
 69            return 0;
 70        }
 71    }
 72    //![blur]
 73
 74    /// Applying Gaussian blur
 75    if( display_caption( "Gaussian Blur" ) != 0 )
 76    {
 77        return 0;
 78    }
 79
 80    //![gaussianblur]
 81    for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
 82    {
 83        GaussianBlur( src, dst, Size( i, i ), 0, 0 );
 84        if( display_dst( DELAY_BLUR ) != 0 )
 85        {
 86            return 0;
 87        }
 88    }
 89    //![gaussianblur]
 90
 91    /// Applying Median blur
 92    if( display_caption( "Median Blur" ) != 0 )
 93    {
 94        return 0;
 95    }
 96
 97    //![medianblur]
 98    for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
 99    {
100        medianBlur ( src, dst, i );
101        if( display_dst( DELAY_BLUR ) != 0 )
102        {
103            return 0;
104        }
105    }
106    //![medianblur]
107
108    /// Applying Bilateral Filter
109    if( display_caption( "Bilateral Blur" ) != 0 )
110    {
111        return 0;
112    }
113
114    //![bilateralfilter]
115    for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
116    {
117        bilateralFilter ( src, dst, i, i*2, i/2 );
118        if( display_dst( DELAY_BLUR ) != 0 )
119        {
120            return 0;
121        }
122    }
123    //![bilateralfilter]
124
125    /// Done
126    display_caption( "Done!" );
127
128    return 0;
129}
130
131/**
132 * @function display_caption
133 */
134int display_caption( const char* caption )
135{
136    dst = Mat::zeros( src.size(), src.type() );
137    putText( dst, caption,
138             Point( src.cols/4, src.rows/2),
139             FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );
140
141    return display_dst(DELAY_CAPTION);
142}
143
144/**
145 * @function display_dst
146 */
147int display_dst( int delay )
148{
149    imshow( window_name, dst );
150    int c = waitKey ( delay );
151    if( c >= 0 ) { return -1; }
152    return 0;
153}