diff --git a/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.rst b/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.rst index be0016bd6c..361d1eee52 100644 --- a/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.rst +++ b/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.rst @@ -31,15 +31,15 @@ Point .. code-block:: cpp - Point pt; - pt.x = 10; - pt.y = 8; + Point pt; + pt.x = 10; + pt.y = 8; or .. code-block:: cpp - Point pt = Point(10, 8); + Point pt = Point(10, 8); Scalar ------- @@ -49,7 +49,7 @@ Scalar .. code-block:: cpp - Scalar( a, b, c ) + Scalar( a, b, c ) We would be defining a RGB color such as: *Red = c*, *Green = b* and *Blue = a* @@ -65,51 +65,51 @@ Explanation .. code-block:: cpp - /// Windows names - char atom_window[] = "Drawing 1: Atom"; - char rook_window[] = "Drawing 2: Rook"; + /// 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 ); + /// Create black empty images + Mat atom_image = Mat::zeros( w, w, CV_8UC3 ); + Mat rook_image = Mat::zeros( w, w, CV_8UC3 ); #. We created functions to draw different geometric shapes. For instance, to draw the atom we used *MyEllipse* and *MyFilledCircle*: .. code-block:: cpp - /// 1. Draw a simple atom: + /// 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.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) ); + /// 1.b. Creating circles + MyFilledCircle( atom_image, Point( w/2.0, w/2.0) ); #. And to draw the rook we employed *MyLine*, *rectangle* and a *MyPolygon*: .. code-block:: cpp - /// 2. Draw a rook + /// 2. Draw a rook - /// 2.a. Create a convex polygon - MyPolygon( rook_image ); + /// 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.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 ) ); + /// 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 ) ); #. Let's check what is inside each of these functions: @@ -117,17 +117,15 @@ Explanation .. code-block:: cpp - void MyLine( Mat img, Point start, Point end ) - { - int thickness = 2; - int lineType = 8; - line( img, - start, - end, - Scalar( 0, 0, 0 ), - thickness, - lineType ); - } + void MyLine( Mat img, Point start, Point end ) + { + int thickness = 2; + int lineType = 8; + line( img, start, end, + Scalar( 0, 0, 0 ), + thickness, + lineType ); + } As we can see, *MyLine* just call the function :line:`line <>`, which does the following: @@ -143,32 +141,32 @@ Explanation .. code-block:: cpp - void MyEllipse( Mat img, double angle ) - { - int thickness = 2; - int lineType = 8; + 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 ); - } + 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 ); + } From the code above, we can observe that the function :ellipse:`ellipse <>` draws an ellipse such that: .. container:: enumeratevisibleitemswithsquare - * The ellipse is displayed in the image **img** - * The ellipse center is located in the point **(w/2.0, w/2.0)** and is enclosed in a box of size **(w/4.0, w/16.0)** - * The ellipse is rotated **angle** degrees - * The ellipse extends an arc between **0** and **360** degrees - * The color of the figure will be **Scalar( 255, 255, 0)** which means blue in RGB value. - * The ellipse's **thickness** is 2. + * The ellipse is displayed in the image **img** + * The ellipse center is located in the point **(w/2.0, w/2.0)** and is enclosed in a box of size **(w/4.0, w/16.0)** + * The ellipse is rotated **angle** degrees + * The ellipse extends an arc between **0** and **360** degrees + * The color of the figure will be **Scalar( 255, 255, 0)** which means blue in RGB value. + * The ellipse's **thickness** is 2. * *MyFilledCircle* @@ -176,17 +174,17 @@ Explanation .. code-block:: cpp void MyFilledCircle( Mat img, Point center ) - { - int thickness = -1; - int lineType = 8; + { + int thickness = -1; + int lineType = 8; - circle( img, - center, - w/32.0, - Scalar( 0, 0, 255 ), - thickness, - lineType ); - } + circle( img, + center, + w/32.0, + Scalar( 0, 0, 255 ), + thickness, + lineType ); + } Similar to the ellipse function, we can observe that *circle* receives as arguments: @@ -202,43 +200,43 @@ Explanation .. code-block:: cpp - void MyPolygon( Mat img ) - { - int lineType = 8; + 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) ; + /** 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 }; + const Point* ppt[1] = { rook_points[0] }; + int npt[] = { 20 }; - fillPoly( img, - ppt, - npt, - 1, - Scalar( 255, 255, 255 ), - lineType ); - } + fillPoly( img, + ppt, + npt, + 1, + Scalar( 255, 255, 255 ), + lineType ); + } To draw a filled polygon we use the function :fill_poly:`fillPoly <>`. We note that: @@ -254,12 +252,11 @@ Explanation .. code-block:: cpp - rectangle( rook_image, - Point( 0, 7*w/8.0 ), - Point( w, w), - Scalar( 0, 255, 255 ), - -1, - 8 ); + rectangle( rook_image, + Point( 0, 7*w/8.0 ), + Point( w, w), + Scalar( 0, 255, 255 ), + -1, 8 ); Finally we have the :rectangle:`rectangle <>` function (we did not create a special function for this guy). We note that: diff --git a/doc/tutorials/core/basic_linear_transform/basic_linear_transform.rst b/doc/tutorials/core/basic_linear_transform/basic_linear_transform.rst index 613f4e1008..4c2fb70358 100644 --- a/doc/tutorials/core/basic_linear_transform/basic_linear_transform.rst +++ b/doc/tutorials/core/basic_linear_transform/basic_linear_transform.rst @@ -11,17 +11,15 @@ In this tutorial you will learn how to: .. container:: enumeratevisibleitemswithsquare + Access pixel values - + Initialize a matrix with zeros - + Learn what :saturate_cast:`saturate_cast <>` does and why it is useful - + Get some cool info about pixel transformations Theory ======= .. note:: + The explanation below belongs to the book `Computer Vision: Algorithms and Applications `_ by Richard Szeliski Image Processing @@ -38,7 +36,7 @@ Image Processing Pixel Transforms -^^^^^^^^^^^^^^^^^ +----------------- .. container:: enumeratevisibleitemswithsquare @@ -47,7 +45,7 @@ Pixel Transforms * Examples of such operators include *brightness and contrast adjustments* as well as color correction and transformations. Brightness and contrast adjustments -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------ .. container:: enumeratevisibleitemswithsquare @@ -70,9 +68,7 @@ Brightness and contrast adjustments Code ===== -.. container:: enumeratevisibleitemswithsquare - - * The following code performs the operation :math:`g(i,j) = \alpha \cdot f(i,j) + \beta` : +* The following code performs the operation :math:`g(i,j) = \alpha \cdot f(i,j) + \beta` : .. code-block:: cpp @@ -87,38 +83,37 @@ Code 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() ); + /// 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; + /// 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 - 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 ); - } - } + /// Do the operation new_image(i,j) = alpha*image(i,j) + beta + 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); + /// Create Windows + namedWindow("Original Image", 1); + namedWindow("New Image", 1); - /// Show stuff - imshow("Original Image", image); - imshow("New Image", new_image); + /// Show stuff + imshow("Original Image", image); + imshow("New Image", new_image); - /// Wait until user press some key - waitKey(); - return 0; + /// Wait until user press some key + waitKey(); + return 0; } Explanation @@ -155,13 +150,14 @@ Explanation .. code-block:: cpp - 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 ); } - } - } + 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 ); + } + } + } Notice the following: @@ -209,6 +205,6 @@ Result * We get this: -.. image:: images/Basic_Linear_Transform_Tutorial_Result_0.jpg - :alt: Basic Linear Transform - Final Result - :align: center + .. image:: images/Basic_Linear_Transform_Tutorial_Result_0.jpg + :alt: Basic Linear Transform - Final Result + :align: center diff --git a/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst b/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst index 77b44f1c8b..ff5a4d9d9d 100644 --- a/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst +++ b/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst @@ -39,7 +39,7 @@ Morphological Operations :align: center Dilation -^^^^^^^^^ +~~~~~~~~ * This operations consists of convoluting an image :math:`A` with some kernel (:math:`B`), which can have any shape or size, usually a square or circle. @@ -54,7 +54,7 @@ Dilation The background (bright) dilates around the black regions of the letter. Erosion -^^^^^^^^ +~~~~~~~ * This operation is the sister of dilation. What this does is to compute a local minimum over the area of the kernel. @@ -216,17 +216,17 @@ Explanation .. code-block:: cpp - Mat element = getStructuringElement( erosion_type, - Size( 2*erosion_size + 1, 2*erosion_size+1 ), - Point( erosion_size, erosion_size ) ); + Mat element = getStructuringElement( erosion_type, + Size( 2*erosion_size + 1, 2*erosion_size+1 ), + Point( erosion_size, erosion_size ) ); We can choose any of three shapes for our kernel: .. container:: enumeratevisibleitemswithsquare - + Rectangular box: MORPH_RECT - + Cross: MORPH_CROSS - + Ellipse: MORPH_ELLIPSE + + Rectangular box: MORPH_RECT + + Cross: MORPH_CROSS + + Ellipse: MORPH_ELLIPSE Then, we just have to specify the size of our kernel and the *anchor point*. If not specified, it is assumed to be in the center.