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.