Added sample code for tutorial - cpp
authorAna Huaman <no@email>
Fri, 17 Jun 2011 15:57:00 +0000 (15:57 +0000)
committerAna Huaman <no@email>
Fri, 17 Jun 2011 15:57:00 +0000 (15:57 +0000)
samples/cpp/tutorial_code/Basic/AddingImages.cpp [new file with mode: 0644]
samples/cpp/tutorial_code/Basic/AddingImagesTrackbar.cpp [new file with mode: 0644]
samples/cpp/tutorial_code/Basic/BasicLinearTransforms.cpp [new file with mode: 0644]
samples/cpp/tutorial_code/Basic/BasicLinearTransformsTrackbar.cpp [new file with mode: 0644]
samples/cpp/tutorial_code/Basic/DisplayImage.cpp [new file with mode: 0644]
samples/cpp/tutorial_code/Basic/Drawing_1.cpp [new file with mode: 0644]
samples/cpp/tutorial_code/Basic/Drawing_2.cpp [new file with mode: 0644]
samples/cpp/tutorial_code/Basic/LoadSaveImage.cpp [new file with mode: 0644]

diff --git a/samples/cpp/tutorial_code/Basic/AddingImages.cpp b/samples/cpp/tutorial_code/Basic/AddingImages.cpp
new file mode 100644 (file)
index 0000000..a1cbc60
--- /dev/null
@@ -0,0 +1,52 @@
+/**
+ * @file AddingImages.cpp
+ * @brief Simple linear blender ( dst = alpha*src1 + beta*src2 )
+ * @author OpenCV team
+ */
+
+#include <cv.h>
+#include <highgui.h>
+#include <iostream>
+
+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 "<<std::endl;
+   std::cout<<"-----------------------"<<std::endl;
+   std::cout<<"* Enter alpha [0-1]: ";
+   std::cin>>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
new file mode 100644 (file)
index 0000000..191eb9b
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * @file LinearBlend.cpp
+ * @brief Simple linear blender ( dst = alpha*src1 + beta*src2 )
+ * @author OpenCV team
+ */
+
+#include <cv.h>
+#include <highgui.h>
+
+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
new file mode 100644 (file)
index 0000000..698cfa9
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * @file BasicLinearTransforms.cpp
+ * @brief Simple program to change contrast and brightness
+ * @author OpenCV team
+ */
+
+#include <cv.h>
+#include <highgui.h>
+#include <iostream>
+
+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 "<<std::endl;
+   std::cout<<"-------------------------"<<std::endl;
+   std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>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<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(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
new file mode 100644 (file)
index 0000000..fef7455
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ * @file LinearTransforms.cpp
+ * @brief Simple program to change contrast and brightness
+ * @date Mon, June 6, 2011
+ * @author OpenCV team
+ */
+
+#include <cv.h>
+#include <highgui.h>
+
+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<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(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
new file mode 100644 (file)
index 0000000..99ce674
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * @file DisplayImage.cpp
+ * @brief Sample code that show how to read and display an image in a OpenCV window
+ * @author OpenCV team
+ */
+#include <cv.h>
+#include <highgui.h>
+
+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
new file mode 100644 (file)
index 0000000..ecd40dd
--- /dev/null
@@ -0,0 +1,172 @@
+/**
+ * @file Drawing_1.cpp
+ * @brief Simple sample code
+ */
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+#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
new file mode 100644 (file)
index 0000000..f66f205
--- /dev/null
@@ -0,0 +1,326 @@
+/**
+ * @file Drawing_2.cpp
+ * @brief Simple sample code
+ */
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <iostream>
+#include <stdio.h>
+
+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
new file mode 100644 (file)
index 0000000..80b94c9
--- /dev/null
@@ -0,0 +1,52 @@
+/**
+ * @file LoadSaveImage.cpp
+ * @brief Sample code that load an image, modify it and save the new image.  
+ * @author OpenCV team
+ */
+
+#include <cv.h>
+#include <highgui.h>
+
+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;
+}