106 lines
2.6 KiB
C++
106 lines
2.6 KiB
C++
/**
|
|
* @file Morphology_1.cpp
|
|
* @brief Erosion and Dilation sample code
|
|
* @author OpenCV team
|
|
*/
|
|
|
|
#include "opencv2/imgproc/imgproc.hpp"
|
|
#include "opencv2/highgui/highgui.hpp"
|
|
#include "highgui.h"
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
using namespace cv;
|
|
|
|
/// Global variables
|
|
Mat src, erosion_dst, dilation_dst;
|
|
|
|
int erosion_elem = 0;
|
|
int erosion_size = 0;
|
|
int dilation_elem = 0;
|
|
int dilation_size = 0;
|
|
int const max_elem = 2;
|
|
int const max_kernel_size = 21;
|
|
|
|
/** Function Headers */
|
|
void Erosion( int, void* );
|
|
void Dilation( int, void* );
|
|
|
|
/**
|
|
* @function main
|
|
*/
|
|
int main( int argc, char** argv )
|
|
{
|
|
/// Load an image
|
|
src = imread( argv[1] );
|
|
|
|
if( !src.data )
|
|
{ return -1; }
|
|
|
|
/// Create windows
|
|
namedWindow( "Erosion Demo", CV_WINDOW_AUTOSIZE );
|
|
namedWindow( "Dilation Demo", CV_WINDOW_AUTOSIZE );
|
|
cvMoveWindow( "Dilation Demo", src.cols, 0 );
|
|
|
|
/// Create Erosion Trackbar
|
|
createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",
|
|
&erosion_elem, max_elem,
|
|
Erosion );
|
|
|
|
createTrackbar( "Kernel size:\n 2n +1", "Erosion Demo",
|
|
&erosion_size, max_kernel_size,
|
|
Erosion );
|
|
|
|
/// Create Dilation Trackbar
|
|
createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",
|
|
&dilation_elem, max_elem,
|
|
Dilation );
|
|
|
|
createTrackbar( "Kernel size:\n 2n +1", "Dilation Demo",
|
|
&dilation_size, max_kernel_size,
|
|
Dilation );
|
|
|
|
/// Default start
|
|
Erosion( 0, 0 );
|
|
Dilation( 0, 0 );
|
|
|
|
waitKey(0);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @function Erosion
|
|
*/
|
|
void Erosion( int, void* )
|
|
{
|
|
int erosion_type;
|
|
if( erosion_elem == 0 ){ erosion_type = MORPH_RECT; }
|
|
else if( erosion_elem == 1 ){ erosion_type = MORPH_CROSS; }
|
|
else if( erosion_elem == 2) { erosion_type = MORPH_ELLIPSE; }
|
|
|
|
Mat element = getStructuringElement( erosion_type,
|
|
Size( 2*erosion_size + 1, 2*erosion_size+1 ),
|
|
Point( erosion_size, erosion_size ) );
|
|
/// Apply the erosion operation
|
|
erode( src, erosion_dst, element );
|
|
imshow( "Erosion Demo", erosion_dst );
|
|
}
|
|
|
|
/**
|
|
* @function Dilation
|
|
*/
|
|
void Dilation( int, void* )
|
|
{
|
|
int dilation_type;
|
|
if( dilation_elem == 0 ){ dilation_type = MORPH_RECT; }
|
|
else if( dilation_elem == 1 ){ dilation_type = MORPH_CROSS; }
|
|
else if( dilation_elem == 2) { dilation_type = MORPH_ELLIPSE; }
|
|
|
|
Mat element = getStructuringElement( dilation_type,
|
|
Size( 2*dilation_size + 1, 2*dilation_size+1 ),
|
|
Point( dilation_size, dilation_size ) );
|
|
/// Apply the dilation operation
|
|
dilate( src, dilation_dst, element );
|
|
imshow( "Dilation Demo", dilation_dst );
|
|
}
|