From: Ana Huaman Date: Tue, 21 Jun 2011 05:06:25 +0000 (+0000) Subject: Reorganized code and added Morphology 2 cpp code X-Git-Tag: submit/tizen/20180620.034203~3^2~6887 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2819438fe6ffab4958ae8025e0826ff5c4740201;p=platform%2Fupstream%2Fopencv.git Reorganized code and added Morphology 2 cpp code --- diff --git a/samples/cpp/tutorial_code/Basic/AddingImages.cpp b/samples/cpp/tutorial_code/Basic/AddingImages.cpp deleted file mode 100644 index af2edf0bc6..0000000000 --- a/samples/cpp/tutorial_code/Basic/AddingImages.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file AddingImages.cpp - * @brief Simple linear blender ( dst = alpha*src1 + beta*src2 ) - * @author OpenCV team - */ - -#include -#include -#include - -using namespace cv; - -/** - * @function main - * @brief Main function - */ -int main( int argc, char** argv ) -{ - - double alpha = 0.5; double beta; double input; - - Mat src1, src2, dst; - - /// Ask the user enter alpha - std::cout<<" Simple Linear Blender "<>input; - - // We use the alpha provided by the user iff it is between 0 and 1 - if( alpha >= 0 && alpha <= 1 ) - { alpha = input; } - - /// Read image ( same size, same type ) - src1 = imread("../images/LinuxLogo.jpg"); - src2 = imread("../images/WindowsLogo.jpg"); - - if( !src1.data ) { printf("Error loading src1 \n"); return -1; } - if( !src2.data ) { printf("Error loading src2 \n"); return -1; } - - /// Create Windows - namedWindow("Linear Blend", 1); - - beta = ( 1.0 - alpha ); - addWeighted( src1, alpha, src2, beta, 0.0, dst); - - imshow( "Linear Blend", dst ); - - - waitKey(0); - return 0; -} diff --git a/samples/cpp/tutorial_code/Basic/AddingImagesTrackbar.cpp b/samples/cpp/tutorial_code/Basic/AddingImagesTrackbar.cpp deleted file mode 100644 index 047474ad01..0000000000 --- a/samples/cpp/tutorial_code/Basic/AddingImagesTrackbar.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @file LinearBlend.cpp - * @brief Simple linear blender ( dst = alpha*src1 + beta*src2 ) - * @author OpenCV team - */ - -#include -#include - -using namespace cv; - -/** Global Variables */ -const int alpha_slider_max = 100; -int alpha_slider; -double alpha; -double beta; - -/** Matrices to store images */ -Mat src1; -Mat src2; -Mat dst; - -/** - * @function on_trackbar - * @brief Callback for trackbar - */ -void on_trackbar( int, void* ) -{ - alpha = (double) alpha_slider/alpha_slider_max ; - - beta = ( 1.0 - alpha ); - - addWeighted( src1, alpha, src2, beta, 0.0, dst); - - imshow( "Linear Blend", dst ); -} - - -/** - * @function main - * @brief Main function - */ -int main( int argc, char** argv ) -{ - /// Read image ( same size, same type ) - src1 = imread("../images/LinuxLogo.jpg"); - src2 = imread("../images/WindowsLogo.jpg"); - - if( !src1.data ) { printf("Error loading src1 \n"); return -1; } - if( !src2.data ) { printf("Error loading src2 \n"); return -1; } - - /// Initialize values - alpha_slider = 0; - - /// Create Windows - namedWindow("Linear Blend", 1); - - /// Create Trackbars - char TrackbarName[50]; - sprintf( TrackbarName, "Alpha x %d", alpha_slider_max ); - createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar ); - - /// Show some stuff - on_trackbar( alpha_slider, 0 ); - - /// Wait until user press some key - waitKey(0); - return 0; -} diff --git a/samples/cpp/tutorial_code/Basic/BasicLinearTransforms.cpp b/samples/cpp/tutorial_code/Basic/BasicLinearTransforms.cpp deleted file mode 100644 index 698cfa90ed..0000000000 --- a/samples/cpp/tutorial_code/Basic/BasicLinearTransforms.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file BasicLinearTransforms.cpp - * @brief Simple program to change contrast and brightness - * @author OpenCV team - */ - -#include -#include -#include - -using namespace cv; - -double alpha; /**< Simple contrast control */ -int beta; /**< Simple brightness control */ - -/** - * @function main - * @brief Main function - */ -int main( int argc, char** argv ) -{ - /// Read image given by user - Mat image = imread( argv[1] ); - Mat new_image = Mat::zeros( image.size(), image.type() ); - - /// Initialize values - std::cout<<" Basic Linear Transforms "<>alpha; - std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta; - - - /// Do the operation new_image(i,j) = alpha*image(i,j) + beta - /// Instead of these 'for' loops we could have used simply: - /// image.convertTo(new_image, -1, alpha, beta); - /// but we wanted to show you how to access the pixels :) - for( int y = 0; y < image.rows; y++ ) - { for( int x = 0; x < image.cols; x++ ) - { for( int c = 0; c < 3; c++ ) - { - new_image.at(y,x)[c] = saturate_cast( alpha*( image.at(y,x)[c] ) + beta ); - } - } - } - - /// Create Windows - namedWindow("Original Image", 1); - namedWindow("New Image", 1); - - /// Show stuff - imshow("Original Image", image); - imshow("New Image", new_image); - - - /// Wait until user press some key - waitKey(); - return 0; -} diff --git a/samples/cpp/tutorial_code/Basic/BasicLinearTransformsTrackbar.cpp b/samples/cpp/tutorial_code/Basic/BasicLinearTransformsTrackbar.cpp deleted file mode 100644 index fef74558f0..0000000000 --- a/samples/cpp/tutorial_code/Basic/BasicLinearTransformsTrackbar.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @file LinearTransforms.cpp - * @brief Simple program to change contrast and brightness - * @date Mon, June 6, 2011 - * @author OpenCV team - */ - -#include -#include - -using namespace cv; - -/** Global Variables */ -const int alpha_max = 5; -const int beta_max = 125; -int alpha; /**< Simple contrast control */ -int beta; /**< Simple brightness control*/ - -/** Matrices to store images */ -Mat image; -Mat new_image; - -/** - * @function on_trackbar - * @brief Called whenever any of alpha or beta changes - */ -void on_trackbar( int, void* ) -{ - Mat new_image = Mat::zeros( image.size(), image.type() ); - - for( int y = 0; y < image.rows; y++ ) - { for( int x = 0; x < image.cols; x++ ) - { for( int c = 0; c < 3; c++ ) - { - new_image.at(y,x)[c] = saturate_cast( alpha*( image.at(y,x)[c] ) + beta ); - } - } - } - imshow("New Image", new_image); -} - - -/** - * @function main - * @brief Main function - */ -int main( int argc, char** argv ) -{ - /// Read image given by user - image = imread( argv[1] ); - - /// Initialize values - alpha = 1; - beta = 0; - - /// Create Windows - namedWindow("Original Image", 1); - namedWindow("New Image", 1); - - /// Create Trackbars - createTrackbar( "Contrast Trackbar", "New Image", &alpha, alpha_max, on_trackbar ); - createTrackbar( "Brightness Trackbar", "New Image", &beta, beta_max, on_trackbar ); - - /// Show some stuff - imshow("Original Image", image); - imshow("New Image", image); - - /// Wait until user press some key - waitKey(); - return 0; -} diff --git a/samples/cpp/tutorial_code/Basic/DisplayImage.cpp b/samples/cpp/tutorial_code/Basic/DisplayImage.cpp deleted file mode 100644 index 99ce674c3d..0000000000 --- a/samples/cpp/tutorial_code/Basic/DisplayImage.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @file DisplayImage.cpp - * @brief Sample code that show how to read and display an image in a OpenCV window - * @author OpenCV team - */ -#include -#include - -using namespace cv; - -int main( int argc, char** argv ) -{ - Mat image; - image = imread( argv[1], 1 ); - - if( argc != 2 || !image.data ) - { - printf( "No image data \n" ); - return -1; - } - - namedWindow( "Display Image", CV_WINDOW_AUTOSIZE ); - imshow( "Display Image", image ); - - waitKey(0); - - return 0; -} diff --git a/samples/cpp/tutorial_code/Basic/Drawing_1.cpp b/samples/cpp/tutorial_code/Basic/Drawing_1.cpp deleted file mode 100644 index ecd40dd689..0000000000 --- a/samples/cpp/tutorial_code/Basic/Drawing_1.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/** - * @file Drawing_1.cpp - * @brief Simple sample code - */ - -#include -#include - -#define w 400 - -using namespace cv; - -/// Function headers -void MyEllipse( Mat img, double angle ); -void MyFilledCircle( Mat img, Point center ); -void MyPolygon( Mat img ); -void MyLine( Mat img, Point start, Point end ); - -/** - * @function main - * @brief Main function - */ -int main( int argc, char **argv ){ - - /// Windows names - char atom_window[] = "Drawing 1: Atom"; - char rook_window[] = "Drawing 2: Rook"; - - /// Create black empty images - Mat atom_image = Mat::zeros( w, w, CV_8UC3 ); - Mat rook_image = Mat::zeros( w, w, CV_8UC3 ); - - /// 1. Draw a simple atom: - /// ----------------------- - - /// 1.a. Creating ellipses - MyEllipse( atom_image, 90 ); - MyEllipse( atom_image, 0 ); - MyEllipse( atom_image, 45 ); - MyEllipse( atom_image, -45 ); - - /// 1.b. Creating circles - MyFilledCircle( atom_image, Point( w/2.0, w/2.0) ); - - /// 2. Draw a rook - /// ------------------ - - /// 2.a. Create a convex polygon - MyPolygon( rook_image ); - - /// 2.b. Creating rectangles - rectangle( rook_image, - Point( 0, 7*w/8.0 ), - Point( w, w), - Scalar( 0, 255, 255 ), - -1, - 8 ); - - /// 2.c. Create a few lines - MyLine( rook_image, Point( 0, 15*w/16 ), Point( w, 15*w/16 ) ); - MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) ); - MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) ); - MyLine( rook_image, Point( 3*w/4, 7*w/8 ), Point( 3*w/4, w ) ); - - /// 3. Display your stuff! - imshow( atom_window, atom_image ); - cvMoveWindow( atom_window, 0, 200 ); - imshow( rook_window, rook_image ); - cvMoveWindow( rook_window, w, 200 ); - - waitKey( 0 ); - return(0); -} - -/// Function Declaration - -/** - * @function MyEllipse - * @brief Draw a fixed-size ellipse with different angles - */ -void MyEllipse( Mat img, double angle ) -{ - int thickness = 2; - int lineType = 8; - - ellipse( img, - Point( w/2.0, w/2.0 ), - Size( w/4.0, w/16.0 ), - angle, - 0, - 360, - Scalar( 255, 0, 0 ), - thickness, - lineType ); -} - -/** - * @function MyFilledCircle - * @brief Draw a fixed-size filled circle - */ -void MyFilledCircle( Mat img, Point center ) -{ - int thickness = -1; - int lineType = 8; - - circle( img, - center, - w/32.0, - Scalar( 0, 0, 255 ), - thickness, - lineType ); -} - -/** - * @function MyPolygon - * @function Draw a simple concave polygon (rook) - */ -void MyPolygon( Mat img ) -{ - int lineType = 8; - - /** Create some points */ - Point rook_points[1][20]; - rook_points[0][0] = Point( w/4.0, 7*w/8.0 ); - rook_points[0][1] = Point( 3*w/4.0, 7*w/8.0 ); - rook_points[0][2] = Point( 3*w/4.0, 13*w/16.0 ); - rook_points[0][3] = Point( 11*w/16.0, 13*w/16.0 ); - rook_points[0][4] = Point( 19*w/32.0, 3*w/8.0 ); - rook_points[0][5] = Point( 3*w/4.0, 3*w/8.0 ); - rook_points[0][6] = Point( 3*w/4.0, w/8.0 ); - rook_points[0][7] = Point( 26*w/40.0, w/8.0 ); - rook_points[0][8] = Point( 26*w/40.0, w/4.0 ); - rook_points[0][9] = Point( 22*w/40.0, w/4.0 ); - rook_points[0][10] = Point( 22*w/40.0, w/8.0 ); - rook_points[0][11] = Point( 18*w/40.0, w/8.0 ); - rook_points[0][12] = Point( 18*w/40.0, w/4.0 ); - rook_points[0][13] = Point( 14*w/40.0, w/4.0 ); - rook_points[0][14] = Point( 14*w/40.0, w/8.0 ); - rook_points[0][15] = Point( w/4.0, w/8.0 ); - rook_points[0][16] = Point( w/4.0, 3*w/8.0 ); - rook_points[0][17] = Point( 13*w/32.0, 3*w/8.0 ); - rook_points[0][18] = Point( 5*w/16.0, 13*w/16.0 ); - rook_points[0][19] = Point( w/4.0, 13*w/16.0) ; - - const Point* ppt[1] = { rook_points[0] }; - int npt[] = { 20 }; - - fillPoly( img, - ppt, - npt, - 1, - Scalar( 255, 255, 255 ), - lineType ); -} - -/** - * @function MyLine - * @brief Draw a simple line - */ -void MyLine( Mat img, Point start, Point end ) -{ - int thickness = 2; - int lineType = 8; - line( img, - start, - end, - Scalar( 0, 0, 0 ), - thickness, - lineType ); -} - - diff --git a/samples/cpp/tutorial_code/Basic/Drawing_2.cpp b/samples/cpp/tutorial_code/Basic/Drawing_2.cpp deleted file mode 100644 index f66f205e7a..0000000000 --- a/samples/cpp/tutorial_code/Basic/Drawing_2.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/** - * @file Drawing_2.cpp - * @brief Simple sample code - */ - -#include -#include -#include -#include - -using namespace cv; - -/// Global Variables -const int NUMBER = 100; -const int DELAY = 5; - -const int window_width = 900; -const int window_height = 600; -int x_1 = -window_width/2; -int x_2 = window_width*3/2; -int y_1 = -window_width/2; -int y_2 = window_width*3/2; - -/// Function headers -static Scalar randomColor( RNG& rng ); -int Drawing_Random_Lines( Mat image, char* window_name, RNG rng ); -int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng ); -int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng ); -int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng ); -int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng ); -int Drawing_Random_Circles( Mat image, char* window_name, RNG rng ); -int Displaying_Random_Text( Mat image, char* window_name, RNG rng ); -int Displaying_Big_End( Mat image, char* window_name, RNG rng ); - - -/** - * @function main - */ -int main( int argc, char** argv ) -{ - int c; - - /// Start creating a window - char window_name[] = "Drawing_2 Tutorial"; - - /// Also create a random object (RNG) - RNG rng( 0xFFFFFFFF ); - - /// Initialize a matrix filled with zeros - Mat image = Mat::zeros( window_height, window_width, CV_8UC3 ); - /// Show it in a window during DELAY ms - imshow( window_name, image ); - waitKey( DELAY ); - - /// Now, let's draw some lines - c = Drawing_Random_Lines(image, window_name, rng); - if( c != 0 ) return 0; - - /// Go on drawing, this time nice rectangles - c = Drawing_Random_Rectangles(image, window_name, rng); - if( c != 0 ) return 0; - - /// Draw some ellipses - c = Drawing_Random_Ellipses( image, window_name, rng ); - if( c != 0 ) return 0; - - /// Now some polylines - c = Drawing_Random_Polylines( image, window_name, rng ); - if( c != 0 ) return 0; - - /// Draw filled polygons - c = Drawing_Random_Filled_Polygons( image, window_name, rng ); - if( c != 0 ) return 0; - - /// Draw circles - c = Drawing_Random_Circles( image, window_name, rng ); - if( c != 0 ) return 0; - - /// Display text in random positions - c = Displaying_Random_Text( image, window_name, rng ); - if( c != 0 ) return 0; - - /// Displaying the big end! - c = Displaying_Big_End( image, window_name, rng ); - if( c != 0 ) return 0; - - waitKey(0); - return 0; -} - -/// Function definitions - -/** - * @function randomColor - * @brief Produces a random color given a random object - */ -static Scalar randomColor( RNG& rng ) -{ - int icolor = (unsigned) rng; - return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 ); -} - - -/** - * @function Drawing_Random_Lines - */ -int Drawing_Random_Lines( Mat image, char* window_name, RNG rng ) -{ - int lineType = 8; - Point pt1, pt2; - - for( int i = 0; i < NUMBER; i++ ) - { - pt1.x = rng.uniform( x_1, x_2 ); - pt1.y = rng.uniform( y_1, y_2 ); - pt2.x = rng.uniform( x_1, x_2 ); - pt2.y = rng.uniform( y_1, y_2 ); - - line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 ); - imshow( window_name, image ); - if( waitKey( DELAY ) >= 0 ) - { return -1; } - } - - return 0; -} - -/** - * @function Drawing_Rectangles - */ -int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng ) -{ - Point pt1, pt2; - int lineType = 8; - int thickness = rng.uniform( -3, 10 ); - - for( int i = 0; i < NUMBER; i++ ) - { - pt1.x = rng.uniform( x_1, x_2 ); - pt1.y = rng.uniform( y_1, y_2 ); - pt2.x = rng.uniform( x_1, x_2 ); - pt2.y = rng.uniform( y_1, y_2 ); - - rectangle( image, pt1, pt2, randomColor(rng), MAX( thickness, -1 ), lineType ); - - imshow( window_name, image ); - if( waitKey( DELAY ) >= 0 ) - { return -1; } - } - - return 0; -} - -/** - * @function Drawing_Random_Ellipses - */ -int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng ) -{ - int lineType = 8; - - for ( int i = 0; i < NUMBER; i++ ) - { - Point center; - center.x = rng.uniform(x_1, x_2); - center.y = rng.uniform(y_1, y_2); - - Size axes; - axes.width = rng.uniform(0, 200); - axes.height = rng.uniform(0, 200); - - double angle = rng.uniform(0, 180); - - ellipse( image, center, axes, angle, angle - 100, angle + 200, - randomColor(rng), rng.uniform(-1,9), lineType ); - - imshow( window_name, image ); - - if( waitKey(DELAY) >= 0 ) - { return -1; } - } - - return 0; -} - -/** - * @function Drawing_Random_Polylines - */ -int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng ) -{ - int lineType = 8; - - for( int i = 0; i< NUMBER; i++ ) - { - Point pt[2][3]; - pt[0][0].x = rng.uniform(x_1, x_2); - pt[0][0].y = rng.uniform(y_1, y_2); - pt[0][1].x = rng.uniform(x_1, x_2); - pt[0][1].y = rng.uniform(y_1, y_2); - pt[0][2].x = rng.uniform(x_1, x_2); - pt[0][2].y = rng.uniform(y_1, y_2); - pt[1][0].x = rng.uniform(x_1, x_2); - pt[1][0].y = rng.uniform(y_1, y_2); - pt[1][1].x = rng.uniform(x_1, x_2); - pt[1][1].y = rng.uniform(y_1, y_2); - pt[1][2].x = rng.uniform(x_1, x_2); - pt[1][2].y = rng.uniform(y_1, y_2); - - const Point* ppt[2] = {pt[0], pt[1]}; - int npt[] = {3, 3}; - - polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1,10), lineType); - - imshow( window_name, image ); - if( waitKey(DELAY) >= 0 ) - { return -1; } - } - return 0; -} - -/** - * @function Drawing_Random_Filled_Polygons - */ -int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng ) -{ - int lineType = 8; - - for ( int i = 0; i < NUMBER; i++ ) - { - Point pt[2][3]; - pt[0][0].x = rng.uniform(x_1, x_2); - pt[0][0].y = rng.uniform(y_1, y_2); - pt[0][1].x = rng.uniform(x_1, x_2); - pt[0][1].y = rng.uniform(y_1, y_2); - pt[0][2].x = rng.uniform(x_1, x_2); - pt[0][2].y = rng.uniform(y_1, y_2); - pt[1][0].x = rng.uniform(x_1, x_2); - pt[1][0].y = rng.uniform(y_1, y_2); - pt[1][1].x = rng.uniform(x_1, x_2); - pt[1][1].y = rng.uniform(y_1, y_2); - pt[1][2].x = rng.uniform(x_1, x_2); - pt[1][2].y = rng.uniform(y_1, y_2); - - const Point* ppt[2] = {pt[0], pt[1]}; - int npt[] = {3, 3}; - - fillPoly( image, ppt, npt, 2, randomColor(rng), lineType ); - - imshow( window_name, image ); - if( waitKey(DELAY) >= 0 ) - { return -1; } - } - return 0; -} - -/** - * @function Drawing_Random_Circles - */ -int Drawing_Random_Circles( Mat image, char* window_name, RNG rng ) -{ - int lineType = 8; - - for (int i = 0; i < NUMBER; i++) - { - Point center; - center.x = rng.uniform(x_1, x_2); - center.y = rng.uniform(y_1, y_2); - - circle( image, center, rng.uniform(0, 300), randomColor(rng), - rng.uniform(-1, 9), lineType ); - - imshow( window_name, image ); - if( waitKey(DELAY) >= 0 ) - { return -1; } - } - - return 0; -} - -/** - * @function Displaying_Random_Text - */ -int Displaying_Random_Text( Mat image, char* window_name, RNG rng ) -{ - int lineType = 8; - - for ( int i = 1; i < NUMBER; i++ ) - { - Point org; - org.x = rng.uniform(x_1, x_2); - org.y = rng.uniform(y_1, y_2); - - putText( image, "Testing text rendering", org, rng.uniform(0,8), - rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType); - - imshow( window_name, image ); - if( waitKey(DELAY) >= 0 ) - { return -1; } - } - - return 0; -} - -/** - * @function Displaying_Big_End - */ -int Displaying_Big_End( Mat image, char* window_name, RNG rng ) -{ - Size textsize = getTextSize("OpenCV forever!", CV_FONT_HERSHEY_COMPLEX, 3, 5, 0); - Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2); - int lineType = 8; - - Mat image2; - - for( int i = 0; i < 255; i += 2 ) - { - image2 = image - Scalar::all(i); - putText( image2, "OpenCV forever!", org, CV_FONT_HERSHEY_COMPLEX, 3, - Scalar(i, i, 255), 5, lineType ); - - imshow( window_name, image2 ); - if( waitKey(DELAY) >= 0 ) - { return -1; } - } - - return 0; -} diff --git a/samples/cpp/tutorial_code/Basic/LoadSaveImage.cpp b/samples/cpp/tutorial_code/Basic/LoadSaveImage.cpp deleted file mode 100644 index 69db8e3e98..0000000000 --- a/samples/cpp/tutorial_code/Basic/LoadSaveImage.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file LoadSaveImage.cpp - * @brief Sample code that load an image, modify it and save the new image. - * @author OpenCV team - */ - -#include -#include - -using namespace cv; - -/** - * @function main - * @brief Self-explanatory - */ -int main( int argc, char** argv ) -{ - /// Get the name of the file to be loaded - char* imageName = argv[1]; - - /// Create a Mat object - Mat image; - - /// Load the image using imread - image = imread( imageName, 1 ); - - /// Verify that the image was loaded - if( argc != 2 || !image.data ) - { - printf( " No image data \n " ); - return -1; - } - - /// Change the image to Grayscale - Mat gray_image; - cvtColor( image, gray_image, CV_RGB2GRAY ); - - /// Save our gray image - imwrite( "../images/Gray_Image.png", gray_image ); - - /// Create a couple of windows and show our images - namedWindow( imageName, CV_WINDOW_AUTOSIZE ); - namedWindow( "Gray image", CV_WINDOW_AUTOSIZE ); - - imshow( imageName, image ); - imshow( "Gray image", gray_image ); - - /// Wait until user finish the application - waitKey(0); - - return 0; -} diff --git a/samples/cpp/tutorial_code/CxCore/Matrix/Drawing_1.cpp b/samples/cpp/tutorial_code/CxCore/Matrix/Drawing_1.cpp new file mode 100644 index 0000000000..ecd40dd689 --- /dev/null +++ b/samples/cpp/tutorial_code/CxCore/Matrix/Drawing_1.cpp @@ -0,0 +1,172 @@ +/** + * @file Drawing_1.cpp + * @brief Simple sample code + */ + +#include +#include + +#define w 400 + +using namespace cv; + +/// Function headers +void MyEllipse( Mat img, double angle ); +void MyFilledCircle( Mat img, Point center ); +void MyPolygon( Mat img ); +void MyLine( Mat img, Point start, Point end ); + +/** + * @function main + * @brief Main function + */ +int main( int argc, char **argv ){ + + /// Windows names + char atom_window[] = "Drawing 1: Atom"; + char rook_window[] = "Drawing 2: Rook"; + + /// Create black empty images + Mat atom_image = Mat::zeros( w, w, CV_8UC3 ); + Mat rook_image = Mat::zeros( w, w, CV_8UC3 ); + + /// 1. Draw a simple atom: + /// ----------------------- + + /// 1.a. Creating ellipses + MyEllipse( atom_image, 90 ); + MyEllipse( atom_image, 0 ); + MyEllipse( atom_image, 45 ); + MyEllipse( atom_image, -45 ); + + /// 1.b. Creating circles + MyFilledCircle( atom_image, Point( w/2.0, w/2.0) ); + + /// 2. Draw a rook + /// ------------------ + + /// 2.a. Create a convex polygon + MyPolygon( rook_image ); + + /// 2.b. Creating rectangles + rectangle( rook_image, + Point( 0, 7*w/8.0 ), + Point( w, w), + Scalar( 0, 255, 255 ), + -1, + 8 ); + + /// 2.c. Create a few lines + MyLine( rook_image, Point( 0, 15*w/16 ), Point( w, 15*w/16 ) ); + MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) ); + MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) ); + MyLine( rook_image, Point( 3*w/4, 7*w/8 ), Point( 3*w/4, w ) ); + + /// 3. Display your stuff! + imshow( atom_window, atom_image ); + cvMoveWindow( atom_window, 0, 200 ); + imshow( rook_window, rook_image ); + cvMoveWindow( rook_window, w, 200 ); + + waitKey( 0 ); + return(0); +} + +/// Function Declaration + +/** + * @function MyEllipse + * @brief Draw a fixed-size ellipse with different angles + */ +void MyEllipse( Mat img, double angle ) +{ + int thickness = 2; + int lineType = 8; + + ellipse( img, + Point( w/2.0, w/2.0 ), + Size( w/4.0, w/16.0 ), + angle, + 0, + 360, + Scalar( 255, 0, 0 ), + thickness, + lineType ); +} + +/** + * @function MyFilledCircle + * @brief Draw a fixed-size filled circle + */ +void MyFilledCircle( Mat img, Point center ) +{ + int thickness = -1; + int lineType = 8; + + circle( img, + center, + w/32.0, + Scalar( 0, 0, 255 ), + thickness, + lineType ); +} + +/** + * @function MyPolygon + * @function Draw a simple concave polygon (rook) + */ +void MyPolygon( Mat img ) +{ + int lineType = 8; + + /** Create some points */ + Point rook_points[1][20]; + rook_points[0][0] = Point( w/4.0, 7*w/8.0 ); + rook_points[0][1] = Point( 3*w/4.0, 7*w/8.0 ); + rook_points[0][2] = Point( 3*w/4.0, 13*w/16.0 ); + rook_points[0][3] = Point( 11*w/16.0, 13*w/16.0 ); + rook_points[0][4] = Point( 19*w/32.0, 3*w/8.0 ); + rook_points[0][5] = Point( 3*w/4.0, 3*w/8.0 ); + rook_points[0][6] = Point( 3*w/4.0, w/8.0 ); + rook_points[0][7] = Point( 26*w/40.0, w/8.0 ); + rook_points[0][8] = Point( 26*w/40.0, w/4.0 ); + rook_points[0][9] = Point( 22*w/40.0, w/4.0 ); + rook_points[0][10] = Point( 22*w/40.0, w/8.0 ); + rook_points[0][11] = Point( 18*w/40.0, w/8.0 ); + rook_points[0][12] = Point( 18*w/40.0, w/4.0 ); + rook_points[0][13] = Point( 14*w/40.0, w/4.0 ); + rook_points[0][14] = Point( 14*w/40.0, w/8.0 ); + rook_points[0][15] = Point( w/4.0, w/8.0 ); + rook_points[0][16] = Point( w/4.0, 3*w/8.0 ); + rook_points[0][17] = Point( 13*w/32.0, 3*w/8.0 ); + rook_points[0][18] = Point( 5*w/16.0, 13*w/16.0 ); + rook_points[0][19] = Point( w/4.0, 13*w/16.0) ; + + const Point* ppt[1] = { rook_points[0] }; + int npt[] = { 20 }; + + fillPoly( img, + ppt, + npt, + 1, + Scalar( 255, 255, 255 ), + lineType ); +} + +/** + * @function MyLine + * @brief Draw a simple line + */ +void MyLine( Mat img, Point start, Point end ) +{ + int thickness = 2; + int lineType = 8; + line( img, + start, + end, + Scalar( 0, 0, 0 ), + thickness, + lineType ); +} + + diff --git a/samples/cpp/tutorial_code/CxCore/Matrix/Drawing_2.cpp b/samples/cpp/tutorial_code/CxCore/Matrix/Drawing_2.cpp new file mode 100644 index 0000000000..f66f205e7a --- /dev/null +++ b/samples/cpp/tutorial_code/CxCore/Matrix/Drawing_2.cpp @@ -0,0 +1,326 @@ +/** + * @file Drawing_2.cpp + * @brief Simple sample code + */ + +#include +#include +#include +#include + +using namespace cv; + +/// Global Variables +const int NUMBER = 100; +const int DELAY = 5; + +const int window_width = 900; +const int window_height = 600; +int x_1 = -window_width/2; +int x_2 = window_width*3/2; +int y_1 = -window_width/2; +int y_2 = window_width*3/2; + +/// Function headers +static Scalar randomColor( RNG& rng ); +int Drawing_Random_Lines( Mat image, char* window_name, RNG rng ); +int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng ); +int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng ); +int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng ); +int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng ); +int Drawing_Random_Circles( Mat image, char* window_name, RNG rng ); +int Displaying_Random_Text( Mat image, char* window_name, RNG rng ); +int Displaying_Big_End( Mat image, char* window_name, RNG rng ); + + +/** + * @function main + */ +int main( int argc, char** argv ) +{ + int c; + + /// Start creating a window + char window_name[] = "Drawing_2 Tutorial"; + + /// Also create a random object (RNG) + RNG rng( 0xFFFFFFFF ); + + /// Initialize a matrix filled with zeros + Mat image = Mat::zeros( window_height, window_width, CV_8UC3 ); + /// Show it in a window during DELAY ms + imshow( window_name, image ); + waitKey( DELAY ); + + /// Now, let's draw some lines + c = Drawing_Random_Lines(image, window_name, rng); + if( c != 0 ) return 0; + + /// Go on drawing, this time nice rectangles + c = Drawing_Random_Rectangles(image, window_name, rng); + if( c != 0 ) return 0; + + /// Draw some ellipses + c = Drawing_Random_Ellipses( image, window_name, rng ); + if( c != 0 ) return 0; + + /// Now some polylines + c = Drawing_Random_Polylines( image, window_name, rng ); + if( c != 0 ) return 0; + + /// Draw filled polygons + c = Drawing_Random_Filled_Polygons( image, window_name, rng ); + if( c != 0 ) return 0; + + /// Draw circles + c = Drawing_Random_Circles( image, window_name, rng ); + if( c != 0 ) return 0; + + /// Display text in random positions + c = Displaying_Random_Text( image, window_name, rng ); + if( c != 0 ) return 0; + + /// Displaying the big end! + c = Displaying_Big_End( image, window_name, rng ); + if( c != 0 ) return 0; + + waitKey(0); + return 0; +} + +/// Function definitions + +/** + * @function randomColor + * @brief Produces a random color given a random object + */ +static Scalar randomColor( RNG& rng ) +{ + int icolor = (unsigned) rng; + return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 ); +} + + +/** + * @function Drawing_Random_Lines + */ +int Drawing_Random_Lines( Mat image, char* window_name, RNG rng ) +{ + int lineType = 8; + Point pt1, pt2; + + for( int i = 0; i < NUMBER; i++ ) + { + pt1.x = rng.uniform( x_1, x_2 ); + pt1.y = rng.uniform( y_1, y_2 ); + pt2.x = rng.uniform( x_1, x_2 ); + pt2.y = rng.uniform( y_1, y_2 ); + + line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 ); + imshow( window_name, image ); + if( waitKey( DELAY ) >= 0 ) + { return -1; } + } + + return 0; +} + +/** + * @function Drawing_Rectangles + */ +int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng ) +{ + Point pt1, pt2; + int lineType = 8; + int thickness = rng.uniform( -3, 10 ); + + for( int i = 0; i < NUMBER; i++ ) + { + pt1.x = rng.uniform( x_1, x_2 ); + pt1.y = rng.uniform( y_1, y_2 ); + pt2.x = rng.uniform( x_1, x_2 ); + pt2.y = rng.uniform( y_1, y_2 ); + + rectangle( image, pt1, pt2, randomColor(rng), MAX( thickness, -1 ), lineType ); + + imshow( window_name, image ); + if( waitKey( DELAY ) >= 0 ) + { return -1; } + } + + return 0; +} + +/** + * @function Drawing_Random_Ellipses + */ +int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng ) +{ + int lineType = 8; + + for ( int i = 0; i < NUMBER; i++ ) + { + Point center; + center.x = rng.uniform(x_1, x_2); + center.y = rng.uniform(y_1, y_2); + + Size axes; + axes.width = rng.uniform(0, 200); + axes.height = rng.uniform(0, 200); + + double angle = rng.uniform(0, 180); + + ellipse( image, center, axes, angle, angle - 100, angle + 200, + randomColor(rng), rng.uniform(-1,9), lineType ); + + imshow( window_name, image ); + + if( waitKey(DELAY) >= 0 ) + { return -1; } + } + + return 0; +} + +/** + * @function Drawing_Random_Polylines + */ +int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng ) +{ + int lineType = 8; + + for( int i = 0; i< NUMBER; i++ ) + { + Point pt[2][3]; + pt[0][0].x = rng.uniform(x_1, x_2); + pt[0][0].y = rng.uniform(y_1, y_2); + pt[0][1].x = rng.uniform(x_1, x_2); + pt[0][1].y = rng.uniform(y_1, y_2); + pt[0][2].x = rng.uniform(x_1, x_2); + pt[0][2].y = rng.uniform(y_1, y_2); + pt[1][0].x = rng.uniform(x_1, x_2); + pt[1][0].y = rng.uniform(y_1, y_2); + pt[1][1].x = rng.uniform(x_1, x_2); + pt[1][1].y = rng.uniform(y_1, y_2); + pt[1][2].x = rng.uniform(x_1, x_2); + pt[1][2].y = rng.uniform(y_1, y_2); + + const Point* ppt[2] = {pt[0], pt[1]}; + int npt[] = {3, 3}; + + polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1,10), lineType); + + imshow( window_name, image ); + if( waitKey(DELAY) >= 0 ) + { return -1; } + } + return 0; +} + +/** + * @function Drawing_Random_Filled_Polygons + */ +int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng ) +{ + int lineType = 8; + + for ( int i = 0; i < NUMBER; i++ ) + { + Point pt[2][3]; + pt[0][0].x = rng.uniform(x_1, x_2); + pt[0][0].y = rng.uniform(y_1, y_2); + pt[0][1].x = rng.uniform(x_1, x_2); + pt[0][1].y = rng.uniform(y_1, y_2); + pt[0][2].x = rng.uniform(x_1, x_2); + pt[0][2].y = rng.uniform(y_1, y_2); + pt[1][0].x = rng.uniform(x_1, x_2); + pt[1][0].y = rng.uniform(y_1, y_2); + pt[1][1].x = rng.uniform(x_1, x_2); + pt[1][1].y = rng.uniform(y_1, y_2); + pt[1][2].x = rng.uniform(x_1, x_2); + pt[1][2].y = rng.uniform(y_1, y_2); + + const Point* ppt[2] = {pt[0], pt[1]}; + int npt[] = {3, 3}; + + fillPoly( image, ppt, npt, 2, randomColor(rng), lineType ); + + imshow( window_name, image ); + if( waitKey(DELAY) >= 0 ) + { return -1; } + } + return 0; +} + +/** + * @function Drawing_Random_Circles + */ +int Drawing_Random_Circles( Mat image, char* window_name, RNG rng ) +{ + int lineType = 8; + + for (int i = 0; i < NUMBER; i++) + { + Point center; + center.x = rng.uniform(x_1, x_2); + center.y = rng.uniform(y_1, y_2); + + circle( image, center, rng.uniform(0, 300), randomColor(rng), + rng.uniform(-1, 9), lineType ); + + imshow( window_name, image ); + if( waitKey(DELAY) >= 0 ) + { return -1; } + } + + return 0; +} + +/** + * @function Displaying_Random_Text + */ +int Displaying_Random_Text( Mat image, char* window_name, RNG rng ) +{ + int lineType = 8; + + for ( int i = 1; i < NUMBER; i++ ) + { + Point org; + org.x = rng.uniform(x_1, x_2); + org.y = rng.uniform(y_1, y_2); + + putText( image, "Testing text rendering", org, rng.uniform(0,8), + rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType); + + imshow( window_name, image ); + if( waitKey(DELAY) >= 0 ) + { return -1; } + } + + return 0; +} + +/** + * @function Displaying_Big_End + */ +int Displaying_Big_End( Mat image, char* window_name, RNG rng ) +{ + Size textsize = getTextSize("OpenCV forever!", CV_FONT_HERSHEY_COMPLEX, 3, 5, 0); + Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2); + int lineType = 8; + + Mat image2; + + for( int i = 0; i < 255; i += 2 ) + { + image2 = image - Scalar::all(i); + putText( image2, "OpenCV forever!", org, CV_FONT_HERSHEY_COMPLEX, 3, + Scalar(i, i, 255), 5, lineType ); + + imshow( window_name, image2 ); + if( waitKey(DELAY) >= 0 ) + { return -1; } + } + + return 0; +} diff --git a/samples/cpp/tutorial_code/HighGUI/AddingImagesTrackbar.cpp b/samples/cpp/tutorial_code/HighGUI/AddingImagesTrackbar.cpp new file mode 100644 index 0000000000..047474ad01 --- /dev/null +++ b/samples/cpp/tutorial_code/HighGUI/AddingImagesTrackbar.cpp @@ -0,0 +1,69 @@ +/** + * @file LinearBlend.cpp + * @brief Simple linear blender ( dst = alpha*src1 + beta*src2 ) + * @author OpenCV team + */ + +#include +#include + +using namespace cv; + +/** Global Variables */ +const int alpha_slider_max = 100; +int alpha_slider; +double alpha; +double beta; + +/** Matrices to store images */ +Mat src1; +Mat src2; +Mat dst; + +/** + * @function on_trackbar + * @brief Callback for trackbar + */ +void on_trackbar( int, void* ) +{ + alpha = (double) alpha_slider/alpha_slider_max ; + + beta = ( 1.0 - alpha ); + + addWeighted( src1, alpha, src2, beta, 0.0, dst); + + imshow( "Linear Blend", dst ); +} + + +/** + * @function main + * @brief Main function + */ +int main( int argc, char** argv ) +{ + /// Read image ( same size, same type ) + src1 = imread("../images/LinuxLogo.jpg"); + src2 = imread("../images/WindowsLogo.jpg"); + + if( !src1.data ) { printf("Error loading src1 \n"); return -1; } + if( !src2.data ) { printf("Error loading src2 \n"); return -1; } + + /// Initialize values + alpha_slider = 0; + + /// Create Windows + namedWindow("Linear Blend", 1); + + /// Create Trackbars + char TrackbarName[50]; + sprintf( TrackbarName, "Alpha x %d", alpha_slider_max ); + createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar ); + + /// Show some stuff + on_trackbar( alpha_slider, 0 ); + + /// Wait until user press some key + waitKey(0); + return 0; +} diff --git a/samples/cpp/tutorial_code/HighGUI/BasicLinearTransformsTrackbar.cpp b/samples/cpp/tutorial_code/HighGUI/BasicLinearTransformsTrackbar.cpp new file mode 100644 index 0000000000..fef74558f0 --- /dev/null +++ b/samples/cpp/tutorial_code/HighGUI/BasicLinearTransformsTrackbar.cpp @@ -0,0 +1,71 @@ +/** + * @file LinearTransforms.cpp + * @brief Simple program to change contrast and brightness + * @date Mon, June 6, 2011 + * @author OpenCV team + */ + +#include +#include + +using namespace cv; + +/** Global Variables */ +const int alpha_max = 5; +const int beta_max = 125; +int alpha; /**< Simple contrast control */ +int beta; /**< Simple brightness control*/ + +/** Matrices to store images */ +Mat image; +Mat new_image; + +/** + * @function on_trackbar + * @brief Called whenever any of alpha or beta changes + */ +void on_trackbar( int, void* ) +{ + Mat new_image = Mat::zeros( image.size(), image.type() ); + + for( int y = 0; y < image.rows; y++ ) + { for( int x = 0; x < image.cols; x++ ) + { for( int c = 0; c < 3; c++ ) + { + new_image.at(y,x)[c] = saturate_cast( alpha*( image.at(y,x)[c] ) + beta ); + } + } + } + imshow("New Image", new_image); +} + + +/** + * @function main + * @brief Main function + */ +int main( int argc, char** argv ) +{ + /// Read image given by user + image = imread( argv[1] ); + + /// Initialize values + alpha = 1; + beta = 0; + + /// Create Windows + namedWindow("Original Image", 1); + namedWindow("New Image", 1); + + /// Create Trackbars + createTrackbar( "Contrast Trackbar", "New Image", &alpha, alpha_max, on_trackbar ); + createTrackbar( "Brightness Trackbar", "New Image", &beta, beta_max, on_trackbar ); + + /// Show some stuff + imshow("Original Image", image); + imshow("New Image", image); + + /// Wait until user press some key + waitKey(); + return 0; +} diff --git a/samples/cpp/tutorial_code/Image_Processing/Morphology_1.cpp b/samples/cpp/tutorial_code/Image_Processing/Morphology_1.cpp deleted file mode 100644 index 8b8cc8ee19..0000000000 --- a/samples/cpp/tutorial_code/Image_Processing/Morphology_1.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @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 -#include - -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 ); -} diff --git a/samples/cpp/tutorial_code/Image_Processing/Smoothing.cpp b/samples/cpp/tutorial_code/Image_Processing/Smoothing.cpp deleted file mode 100644 index 5d55fd46e5..0000000000 --- a/samples/cpp/tutorial_code/Image_Processing/Smoothing.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/** - * file Smoothing.cpp - * brief Sample code for simple filters - * author OpenCV team - */ -#include -#include - -#include "opencv2/imgproc/imgproc.hpp" -#include "opencv2/highgui/highgui.hpp" -#include "opencv2/features2d/features2d.hpp" - -using namespace std; -using namespace cv; - -/// Global Variables -int DELAY_CAPTION = 1500; -int DELAY_BLUR = 100; -int MAX_KERNEL_LENGTH = 31; - -Mat src; Mat dst; -char window_name[] = "Smoothing Demo"; - -/// Function headers -int display_caption( char* caption ); -int display_dst( int delay ); - - -/** - * function main - */ -int main( int argc, char** argv ) -{ - namedWindow( window_name, CV_WINDOW_AUTOSIZE ); - - /// Load the source image - src = imread( "../images/lena.png", 1 ); - - if( display_caption( "Original Image" ) != 0 ) { return 0; } - - dst = src.clone(); - if( display_dst( DELAY_CAPTION ) != 0 ) { return 0; } - - - /// Applying Homogeneous blur - if( display_caption( "Homogeneous Blur" ) != 0 ) { return 0; } - - for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) - { blur( src, dst, Size( i, i ), Point(-1,-1) ); - if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } - - - /// Applying Gaussian blur - if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; } - - for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) - { GaussianBlur( src, dst, Size( i, i ), 0, 0 ); - if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } - - - /// Applying Median blur - if( display_caption( "Median Blur" ) != 0 ) { return 0; } - - for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) - { medianBlur ( src, dst, i ); - if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } - - - /// Applying Bilateral Filter - if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; } - - for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) - { bilateralFilter ( src, dst, i, i*2, i/2 ); - if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } - - /// Wait until user press a key - display_caption( "End: Press a key!" ); - - waitKey(0); - - return 0; -} - -/** - * @function display_caption - */ -int display_caption( char* caption ) -{ - dst = Mat::zeros( src.size(), src.type() ); - putText( dst, caption, - Point( src.cols/4, src.rows/2), - CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) ); - - imshow( window_name, dst ); - int c = waitKey( DELAY_CAPTION ); - if( c >= 0 ) { return -1; } - return 0; -} - -/** - * @function display_dst - */ -int display_dst( int delay ) -{ - imshow( window_name, dst ); - int c = waitKey ( delay ); - if( c >= 0 ) { return -1; } - return 0; -} diff --git a/samples/cpp/tutorial_code/ImgProc/AddingImages.cpp b/samples/cpp/tutorial_code/ImgProc/AddingImages.cpp new file mode 100644 index 0000000000..af2edf0bc6 --- /dev/null +++ b/samples/cpp/tutorial_code/ImgProc/AddingImages.cpp @@ -0,0 +1,52 @@ +/** + * @file AddingImages.cpp + * @brief Simple linear blender ( dst = alpha*src1 + beta*src2 ) + * @author OpenCV team + */ + +#include +#include +#include + +using namespace cv; + +/** + * @function main + * @brief Main function + */ +int main( int argc, char** argv ) +{ + + double alpha = 0.5; double beta; double input; + + Mat src1, src2, dst; + + /// Ask the user enter alpha + std::cout<<" Simple Linear Blender "<>input; + + // We use the alpha provided by the user iff it is between 0 and 1 + if( alpha >= 0 && alpha <= 1 ) + { alpha = input; } + + /// Read image ( same size, same type ) + src1 = imread("../images/LinuxLogo.jpg"); + src2 = imread("../images/WindowsLogo.jpg"); + + if( !src1.data ) { printf("Error loading src1 \n"); return -1; } + if( !src2.data ) { printf("Error loading src2 \n"); return -1; } + + /// Create Windows + namedWindow("Linear Blend", 1); + + beta = ( 1.0 - alpha ); + addWeighted( src1, alpha, src2, beta, 0.0, dst); + + imshow( "Linear Blend", dst ); + + + waitKey(0); + return 0; +} diff --git a/samples/cpp/tutorial_code/ImgProc/BasicLinearTransforms.cpp b/samples/cpp/tutorial_code/ImgProc/BasicLinearTransforms.cpp new file mode 100644 index 0000000000..698cfa90ed --- /dev/null +++ b/samples/cpp/tutorial_code/ImgProc/BasicLinearTransforms.cpp @@ -0,0 +1,58 @@ +/** + * @file BasicLinearTransforms.cpp + * @brief Simple program to change contrast and brightness + * @author OpenCV team + */ + +#include +#include +#include + +using namespace cv; + +double alpha; /**< Simple contrast control */ +int beta; /**< Simple brightness control */ + +/** + * @function main + * @brief Main function + */ +int main( int argc, char** argv ) +{ + /// Read image given by user + Mat image = imread( argv[1] ); + Mat new_image = Mat::zeros( image.size(), image.type() ); + + /// Initialize values + std::cout<<" Basic Linear Transforms "<>alpha; + std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta; + + + /// Do the operation new_image(i,j) = alpha*image(i,j) + beta + /// Instead of these 'for' loops we could have used simply: + /// image.convertTo(new_image, -1, alpha, beta); + /// but we wanted to show you how to access the pixels :) + for( int y = 0; y < image.rows; y++ ) + { for( int x = 0; x < image.cols; x++ ) + { for( int c = 0; c < 3; c++ ) + { + new_image.at(y,x)[c] = saturate_cast( alpha*( image.at(y,x)[c] ) + beta ); + } + } + } + + /// Create Windows + namedWindow("Original Image", 1); + namedWindow("New Image", 1); + + /// Show stuff + imshow("Original Image", image); + imshow("New Image", new_image); + + + /// Wait until user press some key + waitKey(); + return 0; +} diff --git a/samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp b/samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp new file mode 100644 index 0000000000..8b8cc8ee19 --- /dev/null +++ b/samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp @@ -0,0 +1,105 @@ +/** + * @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 +#include + +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 ); +} diff --git a/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp b/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp new file mode 100644 index 0000000000..12388d0870 --- /dev/null +++ b/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp @@ -0,0 +1,80 @@ +/** + * @file Morphology_2.cpp + * @brief Advanced morphology Transformations sample code + * @author OpenCV team + */ + +#include "opencv2/imgproc/imgproc.hpp" +#include "opencv2/highgui/highgui.hpp" +#include +#include + +using namespace cv; + +/// Global variables +Mat src, dst; + +int morph_elem = 0; +int morph_size = 0; +int morph_operator = 0; +int const max_operator = 4; +int const max_elem = 2; +int const max_kernel_size = 21; + +char* window_name = "Morphology Transformations Demo"; + + +/** Function Headers */ +void Morphology_Operations( int, void* ); + +/** + * @function main + */ +int main( int argc, char** argv ) +{ + /// Load an image + src = imread( argv[1] ); + + if( !src.data ) + { return -1; } + + /// Create window + namedWindow( window_name, CV_WINDOW_AUTOSIZE ); + + /// Create Trackbar to select Morphology operation + createTrackbar("Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat", window_name, &morph_operator, max_operator, Morphology_Operations ); + + /// Create Trackbar to select kernel type + createTrackbar( "Element:\n 0: Rect - 1: Cross - 2: Ellipse", window_name, + &morph_elem, max_elem, + Morphology_Operations ); + + /// Create Trackbar to choose kernel size + createTrackbar( "Kernel size:\n 2n +1", window_name, + &morph_size, max_kernel_size, + Morphology_Operations ); + + /// Default start + Morphology_Operations( 0, 0 ); + + waitKey(0); + return 0; +} + +/** + * @function Morphology_Operations + */ +void Morphology_Operations( int, void* ) +{ + + // Since MORPH_X : 2,3,4,5 and 6 + int operation = morph_operator + 2; + + Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) ); + + /// Apply the specified morphology operation + morphologyEx( src, dst, operation, element ); + imshow( window_name, dst ); +} + + diff --git a/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp b/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp new file mode 100644 index 0000000000..5d55fd46e5 --- /dev/null +++ b/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp @@ -0,0 +1,109 @@ +/** + * file Smoothing.cpp + * brief Sample code for simple filters + * author OpenCV team + */ +#include +#include + +#include "opencv2/imgproc/imgproc.hpp" +#include "opencv2/highgui/highgui.hpp" +#include "opencv2/features2d/features2d.hpp" + +using namespace std; +using namespace cv; + +/// Global Variables +int DELAY_CAPTION = 1500; +int DELAY_BLUR = 100; +int MAX_KERNEL_LENGTH = 31; + +Mat src; Mat dst; +char window_name[] = "Smoothing Demo"; + +/// Function headers +int display_caption( char* caption ); +int display_dst( int delay ); + + +/** + * function main + */ +int main( int argc, char** argv ) +{ + namedWindow( window_name, CV_WINDOW_AUTOSIZE ); + + /// Load the source image + src = imread( "../images/lena.png", 1 ); + + if( display_caption( "Original Image" ) != 0 ) { return 0; } + + dst = src.clone(); + if( display_dst( DELAY_CAPTION ) != 0 ) { return 0; } + + + /// Applying Homogeneous blur + if( display_caption( "Homogeneous Blur" ) != 0 ) { return 0; } + + for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) + { blur( src, dst, Size( i, i ), Point(-1,-1) ); + if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } + + + /// Applying Gaussian blur + if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; } + + for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) + { GaussianBlur( src, dst, Size( i, i ), 0, 0 ); + if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } + + + /// Applying Median blur + if( display_caption( "Median Blur" ) != 0 ) { return 0; } + + for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) + { medianBlur ( src, dst, i ); + if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } + + + /// Applying Bilateral Filter + if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; } + + for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) + { bilateralFilter ( src, dst, i, i*2, i/2 ); + if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } + + /// Wait until user press a key + display_caption( "End: Press a key!" ); + + waitKey(0); + + return 0; +} + +/** + * @function display_caption + */ +int display_caption( char* caption ) +{ + dst = Mat::zeros( src.size(), src.type() ); + putText( dst, caption, + Point( src.cols/4, src.rows/2), + CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) ); + + imshow( window_name, dst ); + int c = waitKey( DELAY_CAPTION ); + if( c >= 0 ) { return -1; } + return 0; +} + +/** + * @function display_dst + */ +int display_dst( int delay ) +{ + imshow( window_name, dst ); + int c = waitKey ( delay ); + if( c >= 0 ) { return -1; } + return 0; +}