Merge pull request #186 from vpisarev:doc_fixes_master

This commit is contained in:
Andrey Kamaev 2012-11-26 22:34:42 +04:00 committed by OpenCV Buildbot
commit 61a40ddff8
3 changed files with 160 additions and 167 deletions

View File

@ -31,15 +31,15 @@ Point
.. code-block:: cpp .. code-block:: cpp
Point pt; Point pt;
pt.x = 10; pt.x = 10;
pt.y = 8; pt.y = 8;
or or
.. code-block:: cpp .. code-block:: cpp
Point pt = Point(10, 8); Point pt = Point(10, 8);
Scalar Scalar
------- -------
@ -49,7 +49,7 @@ Scalar
.. code-block:: cpp .. 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* We would be defining a RGB color such as: *Red = c*, *Green = b* and *Blue = a*
@ -65,51 +65,51 @@ Explanation
.. code-block:: cpp .. code-block:: cpp
/// Windows names /// Windows names
char atom_window[] = "Drawing 1: Atom"; char atom_window[] = "Drawing 1: Atom";
char rook_window[] = "Drawing 2: Rook"; char rook_window[] = "Drawing 2: Rook";
/// Create black empty images /// Create black empty images
Mat atom_image = Mat::zeros( w, w, CV_8UC3 ); Mat atom_image = Mat::zeros( w, w, CV_8UC3 );
Mat rook_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*: #. We created functions to draw different geometric shapes. For instance, to draw the atom we used *MyEllipse* and *MyFilledCircle*:
.. code-block:: cpp .. code-block:: cpp
/// 1. Draw a simple atom: /// 1. Draw a simple atom:
/// 1.a. Creating ellipses /// 1.a. Creating ellipses
MyEllipse( atom_image, 90 ); MyEllipse( atom_image, 90 );
MyEllipse( atom_image, 0 ); MyEllipse( atom_image, 0 );
MyEllipse( atom_image, 45 ); MyEllipse( atom_image, 45 );
MyEllipse( atom_image, -45 ); MyEllipse( atom_image, -45 );
/// 1.b. Creating circles /// 1.b. Creating circles
MyFilledCircle( atom_image, Point( w/2.0, w/2.0) ); MyFilledCircle( atom_image, Point( w/2.0, w/2.0) );
#. And to draw the rook we employed *MyLine*, *rectangle* and a *MyPolygon*: #. And to draw the rook we employed *MyLine*, *rectangle* and a *MyPolygon*:
.. code-block:: cpp .. code-block:: cpp
/// 2. Draw a rook /// 2. Draw a rook
/// 2.a. Create a convex polygon /// 2.a. Create a convex polygon
MyPolygon( rook_image ); MyPolygon( rook_image );
/// 2.b. Creating rectangles /// 2.b. Creating rectangles
rectangle( rook_image, rectangle( rook_image,
Point( 0, 7*w/8.0 ), Point( 0, 7*w/8.0 ),
Point( w, w), Point( w, w),
Scalar( 0, 255, 255 ), Scalar( 0, 255, 255 ),
-1, -1,
8 ); 8 );
/// 2.c. Create a few lines /// 2.c. Create a few lines
MyLine( rook_image, Point( 0, 15*w/16 ), Point( w, 15*w/16 ) ); 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/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( w/2, 7*w/8 ), Point( w/2, w ) );
MyLine( rook_image, Point( 3*w/4, 7*w/8 ), Point( 3*w/4, 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: #. Let's check what is inside each of these functions:
@ -117,17 +117,15 @@ Explanation
.. code-block:: cpp .. code-block:: cpp
void MyLine( Mat img, Point start, Point end ) void MyLine( Mat img, Point start, Point end )
{ {
int thickness = 2; int thickness = 2;
int lineType = 8; int lineType = 8;
line( img, line( img, start, end,
start, Scalar( 0, 0, 0 ),
end, thickness,
Scalar( 0, 0, 0 ), lineType );
thickness, }
lineType );
}
As we can see, *MyLine* just call the function :line:`line <>`, which does the following: As we can see, *MyLine* just call the function :line:`line <>`, which does the following:
@ -143,32 +141,32 @@ Explanation
.. code-block:: cpp .. code-block:: cpp
void MyEllipse( Mat img, double angle ) void MyEllipse( Mat img, double angle )
{ {
int thickness = 2; int thickness = 2;
int lineType = 8; int lineType = 8;
ellipse( img, ellipse( img,
Point( w/2.0, w/2.0 ), Point( w/2.0, w/2.0 ),
Size( w/4.0, w/16.0 ), Size( w/4.0, w/16.0 ),
angle, angle,
0, 0,
360, 360,
Scalar( 255, 0, 0 ), Scalar( 255, 0, 0 ),
thickness, thickness,
lineType ); lineType );
} }
From the code above, we can observe that the function :ellipse:`ellipse <>` draws an ellipse such that: From the code above, we can observe that the function :ellipse:`ellipse <>` draws an ellipse such that:
.. container:: enumeratevisibleitemswithsquare .. container:: enumeratevisibleitemswithsquare
* The ellipse is displayed in the image **img** * 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 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 is rotated **angle** degrees
* The ellipse extends an arc between **0** and **360** 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 color of the figure will be **Scalar( 255, 255, 0)** which means blue in RGB value.
* The ellipse's **thickness** is 2. * The ellipse's **thickness** is 2.
* *MyFilledCircle* * *MyFilledCircle*
@ -176,17 +174,17 @@ Explanation
.. code-block:: cpp .. code-block:: cpp
void MyFilledCircle( Mat img, Point center ) void MyFilledCircle( Mat img, Point center )
{ {
int thickness = -1; int thickness = -1;
int lineType = 8; int lineType = 8;
circle( img, circle( img,
center, center,
w/32.0, w/32.0,
Scalar( 0, 0, 255 ), Scalar( 0, 0, 255 ),
thickness, thickness,
lineType ); lineType );
} }
Similar to the ellipse function, we can observe that *circle* receives as arguments: Similar to the ellipse function, we can observe that *circle* receives as arguments:
@ -202,43 +200,43 @@ Explanation
.. code-block:: cpp .. code-block:: cpp
void MyPolygon( Mat img ) void MyPolygon( Mat img )
{ {
int lineType = 8; int lineType = 8;
/** Create some points */ /** Create some points */
Point rook_points[1][20]; Point rook_points[1][20];
rook_points[0][0] = Point( w/4.0, 7*w/8.0 ); 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][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][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][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][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][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][6] = Point( 3*w/4.0, w/8.0 );
rook_points[0][7] = Point( 26*w/40.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][8] = Point( 26*w/40.0, w/4.0 );
rook_points[0][9] = Point( 22*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][10] = Point( 22*w/40.0, w/8.0 );
rook_points[0][11] = Point( 18*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][12] = Point( 18*w/40.0, w/4.0 );
rook_points[0][13] = Point( 14*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][14] = Point( 14*w/40.0, w/8.0 );
rook_points[0][15] = Point( w/4.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][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][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][18] = Point( 5*w/16.0, 13*w/16.0 );
rook_points[0][19] = Point( w/4.0, 13*w/16.0) ; rook_points[0][19] = Point( w/4.0, 13*w/16.0) ;
const Point* ppt[1] = { rook_points[0] }; const Point* ppt[1] = { rook_points[0] };
int npt[] = { 20 }; int npt[] = { 20 };
fillPoly( img, fillPoly( img,
ppt, ppt,
npt, npt,
1, 1,
Scalar( 255, 255, 255 ), Scalar( 255, 255, 255 ),
lineType ); lineType );
} }
To draw a filled polygon we use the function :fill_poly:`fillPoly <>`. We note that: To draw a filled polygon we use the function :fill_poly:`fillPoly <>`. We note that:
@ -254,12 +252,11 @@ Explanation
.. code-block:: cpp .. code-block:: cpp
rectangle( rook_image, rectangle( rook_image,
Point( 0, 7*w/8.0 ), Point( 0, 7*w/8.0 ),
Point( w, w), Point( w, w),
Scalar( 0, 255, 255 ), Scalar( 0, 255, 255 ),
-1, -1, 8 );
8 );
Finally we have the :rectangle:`rectangle <>` function (we did not create a special function for this guy). We note that: Finally we have the :rectangle:`rectangle <>` function (we did not create a special function for this guy). We note that:

View File

@ -11,17 +11,15 @@ In this tutorial you will learn how to:
.. container:: enumeratevisibleitemswithsquare .. container:: enumeratevisibleitemswithsquare
+ Access pixel values + Access pixel values
+ Initialize a matrix with zeros + Initialize a matrix with zeros
+ Learn what :saturate_cast:`saturate_cast <>` does and why it is useful + Learn what :saturate_cast:`saturate_cast <>` does and why it is useful
+ Get some cool info about pixel transformations + Get some cool info about pixel transformations
Theory Theory
======= =======
.. note:: .. note::
The explanation below belongs to the book `Computer Vision: Algorithms and Applications <http://szeliski.org/Book/>`_ by Richard Szeliski The explanation below belongs to the book `Computer Vision: Algorithms and Applications <http://szeliski.org/Book/>`_ by Richard Szeliski
Image Processing Image Processing
@ -38,7 +36,7 @@ Image Processing
Pixel Transforms Pixel Transforms
^^^^^^^^^^^^^^^^^ -----------------
.. container:: enumeratevisibleitemswithsquare .. container:: enumeratevisibleitemswithsquare
@ -47,7 +45,7 @@ Pixel Transforms
* Examples of such operators include *brightness and contrast adjustments* as well as color correction and transformations. * Examples of such operators include *brightness and contrast adjustments* as well as color correction and transformations.
Brightness and contrast adjustments Brightness and contrast adjustments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ------------------------------------
.. container:: enumeratevisibleitemswithsquare .. container:: enumeratevisibleitemswithsquare
@ -70,9 +68,7 @@ Brightness and contrast adjustments
Code 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 .. code-block:: cpp
@ -87,38 +83,37 @@ Code
int main( int argc, char** argv ) int main( int argc, char** argv )
{ {
/// Read image given by user /// Read image given by user
Mat image = imread( argv[1] ); Mat image = imread( argv[1] );
Mat new_image = Mat::zeros( image.size(), image.type() ); Mat new_image = Mat::zeros( image.size(), image.type() );
/// Initialize values /// Initialize values
std::cout<<" Basic Linear Transforms "<<std::endl; std::cout<<" Basic Linear Transforms "<<std::endl;
std::cout<<"-------------------------"<<std::endl; std::cout<<"-------------------------"<<std::endl;
std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha; std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta; std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;
/// Do the operation new_image(i,j) = alpha*image(i,j) + beta /// Do the operation new_image(i,j) = alpha*image(i,j) + beta
for( int y = 0; y < image.rows; y++ ) for( int y = 0; y < image.rows; y++ ) {
{ for( int x = 0; x < image.cols; x++ ) for( int x = 0; x < image.cols; x++ ) {
{ for( int c = 0; c < 3; c++ ) for( int c = 0; c < 3; c++ ) {
{ new_image.at<Vec3b>(y,x)[c] =
new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta ); }
} }
}
} }
/// Create Windows /// Create Windows
namedWindow("Original Image", 1); namedWindow("Original Image", 1);
namedWindow("New Image", 1); namedWindow("New Image", 1);
/// Show stuff /// Show stuff
imshow("Original Image", image); imshow("Original Image", image);
imshow("New Image", new_image); imshow("New Image", new_image);
/// Wait until user press some key /// Wait until user press some key
waitKey(); waitKey();
return 0; return 0;
} }
Explanation Explanation
@ -155,13 +150,14 @@ Explanation
.. code-block:: cpp .. code-block:: cpp
for( int y = 0; y < image.rows; y++ ) for( int y = 0; y < image.rows; y++ ) {
{ for( int x = 0; x < image.cols; x++ ) for( int x = 0; x < image.cols; x++ ) {
{ for( int c = 0; c < 3; c++ ) for( int c = 0; c < 3; c++ ) {
{ new_image.at<Vec3b>(y,x)[c] = new_image.at<Vec3b>(y,x)[c] =
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta ); } saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
} }
} }
}
Notice the following: Notice the following:
@ -209,6 +205,6 @@ Result
* We get this: * We get this:
.. image:: images/Basic_Linear_Transform_Tutorial_Result_0.jpg .. image:: images/Basic_Linear_Transform_Tutorial_Result_0.jpg
:alt: Basic Linear Transform - Final Result :alt: Basic Linear Transform - Final Result
:align: center :align: center

View File

@ -39,7 +39,7 @@ Morphological Operations
:align: center :align: center
Dilation 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. * 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. The background (bright) dilates around the black regions of the letter.
Erosion Erosion
^^^^^^^^ ~~~~~~~
* This operation is the sister of dilation. What this does is to compute a local minimum over the area of the kernel. * 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 .. code-block:: cpp
Mat element = getStructuringElement( erosion_type, Mat element = getStructuringElement( erosion_type,
Size( 2*erosion_size + 1, 2*erosion_size+1 ), Size( 2*erosion_size + 1, 2*erosion_size+1 ),
Point( erosion_size, erosion_size ) ); Point( erosion_size, erosion_size ) );
We can choose any of three shapes for our kernel: We can choose any of three shapes for our kernel:
.. container:: enumeratevisibleitemswithsquare .. container:: enumeratevisibleitemswithsquare
+ Rectangular box: MORPH_RECT + Rectangular box: MORPH_RECT
+ Cross: MORPH_CROSS + Cross: MORPH_CROSS
+ Ellipse: MORPH_ELLIPSE + 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. 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.