From bc18fb481f432c847765de939a977e63b90cc8b0 Mon Sep 17 00:00:00 2001 From: tribta Date: Sun, 20 Aug 2017 17:14:12 +0100 Subject: [PATCH 01/10] Tutorial Smoothing Images --- ...sian_median_blur_bilateral_filter.markdown | 113 +++++++++++++---- .../imgproc/table_of_content_imgproc.markdown | 2 + .../cpp/tutorial_code/ImgProc/Smoothing.cpp | 112 ----------------- .../ImgProc/Smoothing/Smoothing.cpp | 115 ++++++++++++++++++ .../ImgProc/Smoothing/Smoothing.java | 101 +++++++++++++++ .../imgProc/Smoothing/smoothing.py | 107 ++++++++++++++++ 6 files changed, 411 insertions(+), 139 deletions(-) delete mode 100644 samples/cpp/tutorial_code/ImgProc/Smoothing.cpp create mode 100644 samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp create mode 100644 samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java create mode 100644 samples/python/tutorial_code/imgProc/Smoothing/smoothing.py diff --git a/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown b/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown index 753b368c0d..e915d04b94 100644 --- a/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown +++ b/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown @@ -1,16 +1,18 @@ Smoothing Images {#tutorial_gausian_median_blur_bilateral_filter} ================ +@next_tutorial{tutorial_erosion_dilatation} + Goal ---- In this tutorial you will learn how to apply diverse linear filters to smooth images using OpenCV functions such as: -- @ref cv::blur -- @ref cv::GaussianBlur -- @ref cv::medianBlur -- @ref cv::bilateralFilter +- **blur()** +- **GaussianBlur()** +- **medianBlur()** +- **bilateralFilter()** Theory ------ @@ -92,38 +94,65 @@ Code - Loads an image - Applies 4 different kinds of filters (explained in Theory) and show the filtered images sequentially + +@add_toggle_cpp - **Downloadable code**: Click - [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp) + [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp) + - **Code at glance:** - @include samples/cpp/tutorial_code/ImgProc/Smoothing.cpp + @include samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp +@end_toggle + +@add_toggle_java +- **Downloadable code**: Click + [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java) + +- **Code at glance:** + @include samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java +@end_toggle + +@add_toggle_python +- **Downloadable code**: Click + [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/imgProc/Smoothing/smoothing.py) + +- **Code at glance:** + @include samples/python/tutorial_code/imgProc/Smoothing/smoothing.py +@end_toggle Explanation ----------- --# Let's check the OpenCV functions that involve only the smoothing procedure, since the rest is - already known by now. --# **Normalized Block Filter:** +Let's check the OpenCV functions that involve only the smoothing procedure, since the rest is +already known by now. - OpenCV offers the function @ref cv::blur to perform smoothing with this filter. - @snippet cpp/tutorial_code/ImgProc/Smoothing.cpp blur +#### Normalized Block Filter: +- OpenCV offers the function **blur()** to perform smoothing with this filter. We specify 4 arguments (more details, check the Reference): - - *src*: Source image - *dst*: Destination image - - *Size( w,h )*: Defines the size of the kernel to be used ( of width *w* pixels and height + - *Size( w, h )*: Defines the size of the kernel to be used ( of width *w* pixels and height *h* pixels) - *Point(-1, -1)*: Indicates where the anchor point (the pixel evaluated) is located with respect to the neighborhood. If there is a negative value, then the center of the kernel is considered the anchor point. --# **Gaussian Filter:** +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp blur +@end_toggle - It is performed by the function @ref cv::GaussianBlur : - @snippet cpp/tutorial_code/ImgProc/Smoothing.cpp gaussianblur +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java blur +@end_toggle +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/Smoothing/smoothing.py blur +@end_toggle + +#### Gaussian Filter: + +- It is performed by the function **GaussianBlur()** : Here we use 4 arguments (more details, check the OpenCV reference): - - *src*: Source image - *dst*: Destination image - *Size(w, h)*: The size of the kernel to be used (the neighbors to be considered). \f$w\f$ and @@ -134,35 +163,65 @@ Explanation - \f$\sigma_{y}\f$: The standard deviation in y. Writing \f$0\f$ implies that \f$\sigma_{y}\f$ is calculated using kernel size. --# **Median Filter:** +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp gaussianblur +@end_toggle - This filter is provided by the @ref cv::medianBlur function: - @snippet cpp/tutorial_code/ImgProc/Smoothing.cpp medianblur +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java gaussianblur +@end_toggle +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/Smoothing/smoothing.py gaussianblur +@end_toggle + +#### Median Filter: + +- This filter is provided by the **medianBlur()** function: We use three arguments: - - *src*: Source image - *dst*: Destination image, must be the same type as *src* - *i*: Size of the kernel (only one because we use a square window). Must be odd. --# **Bilateral Filter** +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp medianblur +@end_toggle - Provided by OpenCV function @ref cv::bilateralFilter - @snippet cpp/tutorial_code/ImgProc/Smoothing.cpp bilateralfilter +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java medianblur +@end_toggle +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/Smoothing/smoothing.py medianblur +@end_toggle + +#### Bilateral Filter + +- Provided by OpenCV function **bilateralFilter()** We use 5 arguments: - - *src*: Source image - *dst*: Destination image - *d*: The diameter of each pixel neighborhood. - \f$\sigma_{Color}\f$: Standard deviation in the color space. - \f$\sigma_{Space}\f$: Standard deviation in the coordinate space (in pixel terms) +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp bilateralfilter +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java bilateralfilter +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/Smoothing/smoothing.py bilateralfilter +@end_toggle + Results ------- -- The code opens an image (in this case *lena.jpg*) and display it under the effects of the 4 - filters explained. +- The code opens an image (in this case [lena.jpg](https://raw.githubusercontent.com/opencv/opencv/master/samples/data/lena.jpg)) + and display it under the effects of the 4 filters explained. - Here is a snapshot of the image smoothed using *medianBlur*: ![](images/Smoothing_Tutorial_Result_Median_Filter.jpg) diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index 42dd4ce3bf..335ba291bb 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -5,6 +5,8 @@ In this section you will learn about the image processing (manipulation) functio - @subpage tutorial_gausian_median_blur_bilateral_filter + *Languages:* C++, Java, Python + *Compatibility:* \> OpenCV 2.0 *Author:* Ana Huamán diff --git a/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp b/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp deleted file mode 100644 index 58aa474c38..0000000000 --- a/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/** - * file Smoothing.cpp - * brief Sample code for simple filters - * author OpenCV team - */ - -#include "opencv2/imgproc.hpp" -#include "opencv2/imgcodecs.hpp" -#include "opencv2/highgui.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( const char* caption ); -int display_dst( int delay ); - - -/** - * function main - */ -int main( void ) -{ - namedWindow( window_name, WINDOW_AUTOSIZE ); - - /// Load the source image - src = imread( "../data/lena.jpg", IMREAD_COLOR ); - - 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; } - - //![blur] - 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; } } - //![blur] - - /// Applying Gaussian blur - if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; } - - //![gaussianblur] - 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; } } - //![gaussianblur] - - /// Applying Median blur - if( display_caption( "Median Blur" ) != 0 ) { return 0; } - - //![medianblur] - for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) - { medianBlur ( src, dst, i ); - if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } - //![medianblur] - - /// Applying Bilateral Filter - if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; } - - //![bilateralfilter] - 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; } } - //![bilateralfilter] - - /// Wait until user press a key - display_caption( "End: Press a key!" ); - - waitKey(0); - - return 0; -} - -/** - * @function display_caption - */ -int display_caption( const char* caption ) -{ - dst = Mat::zeros( src.size(), src.type() ); - putText( dst, caption, - Point( src.cols/4, src.rows/2), - 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/Smoothing/Smoothing.cpp b/samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp new file mode 100644 index 0000000000..d96b52a0c1 --- /dev/null +++ b/samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp @@ -0,0 +1,115 @@ +/** + * file Smoothing.cpp + * brief Sample code for simple filters + * author OpenCV team + */ + +#include +#include "opencv2/imgproc.hpp" +#include "opencv2/imgcodecs.hpp" +#include "opencv2/highgui.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( const char* caption ); +int display_dst( int delay ); + + +/** + * function main + */ +int main( int argc, char ** argv ) +{ + namedWindow( window_name, WINDOW_AUTOSIZE ); + + /// Load the source image + const char* filename = argc >=2 ? argv[1] : "../data/lena.jpg"; + + src = imread( filename, IMREAD_COLOR ); + if(src.empty()){ + printf(" Error opening image\n"); + printf(" Usage: ./Smoothing [image_name -- default ../data/lena.jpg] \n"); + return -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; } + + //![blur] + 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; } } + //![blur] + + /// Applying Gaussian blur + if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; } + + //![gaussianblur] + 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; } } + //![gaussianblur] + + /// Applying Median blur + if( display_caption( "Median Blur" ) != 0 ) { return 0; } + + //![medianblur] + for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ) + { medianBlur ( src, dst, i ); + if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } + //![medianblur] + + /// Applying Bilateral Filter + if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; } + + //![bilateralfilter] + 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; } } + //![bilateralfilter] + + /// Done + display_caption( "Done!" ); + + return 0; +} + +/** + * @function display_caption + */ +int display_caption( const char* caption ) +{ + dst = Mat::zeros( src.size(), src.type() ); + putText( dst, caption, + Point( src.cols/4, src.rows/2), + FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) ); + + return display_dst(DELAY_CAPTION); +} + +/** + * @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/java/tutorial_code/ImgProc/Smoothing/Smoothing.java b/samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java new file mode 100644 index 0000000000..b4d96307c9 --- /dev/null +++ b/samples/java/tutorial_code/ImgProc/Smoothing/Smoothing.java @@ -0,0 +1,101 @@ +import org.opencv.core.*; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +class SmoothingRun { + + /// Global Variables + int DELAY_CAPTION = 1500; + int DELAY_BLUR = 100; + int MAX_KERNEL_LENGTH = 31; + + Mat src = new Mat(), dst = new Mat(); + String windowName = "Filter Demo 1"; + + public void run(String[] args) { + + String filename = ((args.length > 0) ? args[0] : "../data/lena.jpg"); + + src = Imgcodecs.imread(filename, Imgcodecs.IMREAD_COLOR); + if( src.empty() ) { + System.out.println("Error opening image"); + System.out.println("Usage: ./Smoothing [image_name -- default ../data/lena.jpg] \n"); + System.exit(-1); + } + + if( displayCaption( "Original Image" ) != 0 ) { System.exit(0); } + + dst = src.clone(); + if( displayDst( DELAY_CAPTION ) != 0 ) { System.exit(0); } + + /// Applying Homogeneous blur + if( displayCaption( "Homogeneous Blur" ) != 0 ) { System.exit(0); } + + //! [blur] + for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) { + Imgproc.blur(src, dst, new Size(i, i), new Point(-1, -1)); + displayDst(DELAY_BLUR); + } + //! [blur] + + /// Applying Gaussian blur + if( displayCaption( "Gaussian Blur" ) != 0 ) { System.exit(0); } + + //! [gaussianblur] + for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) { + Imgproc.GaussianBlur(src, dst, new Size(i, i), 0, 0); + displayDst(DELAY_BLUR); + } + //! [gaussianblur] + + /// Applying Median blur + if( displayCaption( "Median Blur" ) != 0 ) { System.exit(0); } + + //! [medianblur] + for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) { + Imgproc.medianBlur(src, dst, i); + displayDst(DELAY_BLUR); + } + //! [medianblur] + + /// Applying Bilateral Filter + if( displayCaption( "Bilateral Blur" ) != 0 ) { System.exit(0); } + + //![bilateralfilter] + for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) { + Imgproc.bilateralFilter(src, dst, i, i * 2, i / 2); + displayDst(DELAY_BLUR); + } + //![bilateralfilter] + + /// Done + displayCaption( "Done!" ); + + System.exit(0); + } + + int displayCaption(String caption) { + dst = Mat.zeros(src.size(), src.type()); + Imgproc.putText(dst, caption, + new Point(src.cols() / 4, src.rows() / 2), + Core.FONT_HERSHEY_COMPLEX, 1, new Scalar(255, 255, 255)); + + return displayDst(DELAY_CAPTION); + } + + int displayDst(int delay) { + HighGui.imshow( windowName, dst ); + int c = HighGui.waitKey( delay ); + if (c >= 0) { return -1; } + return 0; + } +} + +public class Smoothing { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new SmoothingRun().run(args); + } +} diff --git a/samples/python/tutorial_code/imgProc/Smoothing/smoothing.py b/samples/python/tutorial_code/imgProc/Smoothing/smoothing.py new file mode 100644 index 0000000000..c20ca8716d --- /dev/null +++ b/samples/python/tutorial_code/imgProc/Smoothing/smoothing.py @@ -0,0 +1,107 @@ +import sys +import cv2 +import numpy as np + +# Global Variables + +DELAY_CAPTION = 1500 +DELAY_BLUR = 100 +MAX_KERNEL_LENGTH = 31 + +src = None +dst = None +window_name = 'Smoothing Demo' + + +def main(argv): + cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE) + + # Load the source image + imageName = argv[0] if len(argv) > 0 else "../data/lena.jpg" + + global src + src = cv2.imread(imageName, 1) + if src is None: + print ('Error opening image') + print ('Usage: smoothing.py [image_name -- default ../data/lena.jpg] \n') + return -1 + + if display_caption('Original Image') != 0: + return 0 + + global dst + dst = np.copy(src) + if display_dst(DELAY_CAPTION) != 0: + return 0 + + # Applying Homogeneous blur + if display_caption('Homogeneous Blur') != 0: + return 0 + + ## [blur] + for i in range(1, MAX_KERNEL_LENGTH, 2): + dst = cv2.blur(src, (i, i)) + if display_dst(DELAY_BLUR) != 0: + return 0 + ## [blur] + + # Applying Gaussian blur + if display_caption('Gaussian Blur') != 0: + return 0 + + ## [gaussianblur] + for i in range(1, MAX_KERNEL_LENGTH, 2): + dst = cv2.GaussianBlur(src, (i, i), 0) + if display_dst(DELAY_BLUR) != 0: + return 0 + ## [gaussianblur] + + # Applying Median blur + if display_caption('Median Blur') != 0: + return 0 + + ## [medianblur] + for i in range(1, MAX_KERNEL_LENGTH, 2): + dst = cv2.medianBlur(src, i) + if display_dst(DELAY_BLUR) != 0: + return 0 + ## [medianblur] + + # Applying Bilateral Filter + if display_caption('Bilateral Blur') != 0: + return 0 + + ## [bilateralfilter] + # Remember, bilateral is a bit slow, so as value go higher, it takes long time + for i in range(1, MAX_KERNEL_LENGTH, 2): + dst = cv2.bilateralFilter(src, i, i * 2, i / 2) + if display_dst(DELAY_BLUR) != 0: + return 0 + ## [bilateralfilter] + + # Done + display_caption('Done!') + + return 0 + + +def display_caption(caption): + global dst + dst = np.zeros(src.shape, src.dtype) + rows, cols, ch = src.shape + cv2.putText(dst, caption, + (int(cols / 4), int(rows / 2)), + cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255)) + + return display_dst(DELAY_CAPTION) + + +def display_dst(delay): + cv2.imshow(window_name, dst) + c = cv2.waitKey(delay) + if c >= 0 : return -1 + return 0 + + +if __name__ == "__main__": + main(sys.argv[1:]) From 18bc4db75cc4d70363b8d8a5d837e3bd63f768c0 Mon Sep 17 00:00:00 2001 From: tribta Date: Sun, 20 Aug 2017 22:54:38 +0100 Subject: [PATCH 02/10] Tutorial Hit-or-Miss --- .../imgproc/hitOrMiss/hitOrMiss.markdown | 33 ++++++++--- .../imgproc/table_of_content_imgproc.markdown | 4 +- .../ImgProc/{ => HitMiss}/HitMiss.cpp | 9 ++- .../ImgProc/HitMiss/HitMiss.java | 58 +++++++++++++++++++ .../tutorial_code/imgProc/HitMiss/hit_miss.py | 38 ++++++++++++ 5 files changed, 132 insertions(+), 10 deletions(-) rename samples/cpp/tutorial_code/ImgProc/{ => HitMiss}/HitMiss.cpp (88%) create mode 100644 samples/java/tutorial_code/ImgProc/HitMiss/HitMiss.java create mode 100644 samples/python/tutorial_code/imgProc/HitMiss/hit_miss.py diff --git a/doc/tutorials/imgproc/hitOrMiss/hitOrMiss.markdown b/doc/tutorials/imgproc/hitOrMiss/hitOrMiss.markdown index 085e7c2e00..c55f09296f 100644 --- a/doc/tutorials/imgproc/hitOrMiss/hitOrMiss.markdown +++ b/doc/tutorials/imgproc/hitOrMiss/hitOrMiss.markdown @@ -1,22 +1,23 @@ Hit-or-Miss {#tutorial_hitOrMiss} ================================= +@prev_tutorial{tutorial_opening_closing_hats} +@next_tutorial{tutorial_morph_lines_detection} + Goal ---- In this tutorial you will learn how to find a given configuration or pattern in a binary image by using the Hit-or-Miss transform (also known as Hit-and-Miss transform). This transform is also the basis of more advanced morphological operations such as thinning or pruning. -We will use the OpenCV function @ref cv::morphologyEx. - - +We will use the OpenCV function **morphologyEx()** . Hit-or-Miss theory ------------------- Morphological operators process images based on their shape. These operators apply one or more *structuring elements* to an input image to obtain the output image. The two basic morphological operations are the *erosion* and the *dilation*. The combination of these two operations generate advanced morphological transformations such as *opening*, *closing*, or *top-hat* transform. -To know more about these and other basic morphological operations refer to previous tutorials @ref tutorial_erosion_dilatation "here" and @ref tutorial_opening_closing_hats "here". +To know more about these and other basic morphological operations refer to previous tutorials (@ref tutorial_erosion_dilatation "Eroding and Dilating") and (@ref tutorial_opening_closing_hats "More Morphology Transformations"). The Hit-or-Miss transformation is useful to find patterns in binary images. In particular, it finds those pixels whose neighbourhood matches the shape of a first structuring element \f$B_1\f$ while not matching the shape of a second structuring element \f$B_2\f$ at the same time. Mathematically, the operation applied to an image \f$A\f$ can be expressed as follows: @@ -43,11 +44,27 @@ You can see that the pattern is found in just one location within the image. Code ---- -The code corresponding to the previous example is shown below. You can also download it from -[here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgProc/HitMiss.cpp) -@include samples/cpp/tutorial_code/ImgProc/HitMiss.cpp +The code corresponding to the previous example is shown below. -As you can see, it is as simple as using the function @ref cv::morphologyEx with the operation type @ref cv::MORPH_HITMISS and the chosen kernel. +@add_toggle_cpp +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgProc/HitMiss/HitMiss.cpp) +@include samples/cpp/tutorial_code/ImgProc/HitMiss/HitMiss.cpp +@end_toggle + +@add_toggle_java +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgProc/HitMiss/HitMiss.java) +@include samples/java/tutorial_code/ImgProc/HitMiss/HitMiss.java +@end_toggle + +@add_toggle_python +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/imgProc/HitMiss/hit_miss.py) +@include samples/python/tutorial_code/imgProc/HitMiss/hit_miss.py +@end_toggle + +As you can see, it is as simple as using the function **morphologyEx()** with the operation type **MORPH_HITMISS** and the chosen kernel. Other examples -------------- diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index 335ba291bb..59f7725cb1 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -29,7 +29,9 @@ In this section you will learn about the image processing (manipulation) functio Here we investigate different morphology operators -- @subpage tutorial_hitOrMiss +- @subpage tutorial_hitOrMiss + + *Languages:* C++, Java, Python *Compatibility:* \> OpenCV 2.4 diff --git a/samples/cpp/tutorial_code/ImgProc/HitMiss.cpp b/samples/cpp/tutorial_code/ImgProc/HitMiss/HitMiss.cpp similarity index 88% rename from samples/cpp/tutorial_code/ImgProc/HitMiss.cpp rename to samples/cpp/tutorial_code/ImgProc/HitMiss/HitMiss.cpp index c2c3e1dd0a..0901191b6f 100644 --- a/samples/cpp/tutorial_code/ImgProc/HitMiss.cpp +++ b/samples/cpp/tutorial_code/ImgProc/HitMiss/HitMiss.cpp @@ -23,15 +23,22 @@ int main(){ Mat output_image; morphologyEx(input_image, output_image, MORPH_HITMISS, kernel); - const int rate = 10; + const int rate = 50; kernel = (kernel + 1) * 127; kernel.convertTo(kernel, CV_8U); + resize(kernel, kernel, Size(), rate, rate, INTER_NEAREST); imshow("kernel", kernel); + moveWindow("kernel", 0, 0); + resize(input_image, input_image, Size(), rate, rate, INTER_NEAREST); imshow("Original", input_image); + moveWindow("Original", 0, 200); + resize(output_image, output_image, Size(), rate, rate, INTER_NEAREST); imshow("Hit or Miss", output_image); + moveWindow("Hit or Miss", 500, 200); + waitKey(0); return 0; } diff --git a/samples/java/tutorial_code/ImgProc/HitMiss/HitMiss.java b/samples/java/tutorial_code/ImgProc/HitMiss/HitMiss.java new file mode 100644 index 0000000000..806537f8fe --- /dev/null +++ b/samples/java/tutorial_code/ImgProc/HitMiss/HitMiss.java @@ -0,0 +1,58 @@ +import org.opencv.core.*; +import org.opencv.highgui.HighGui; +import org.opencv.imgproc.Imgproc; + +class HitMissRun{ + + public void run() { + Mat input_image = new Mat( 8, 8, CvType.CV_8UC1 ); + int row = 0, col = 0; + input_image.put(row ,col, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 255, 255, 0, 0, 0, 255, + 0, 255, 255, 255, 0, 0, 0, 0, + 0, 255, 255, 255, 0, 255, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 255, 255, 0, + 0, 255, 0, 255, 0, 0, 255, 0, + 0, 255, 255, 255, 0, 0, 0, 0); + + Mat kernel = new Mat( 3, 3, CvType.CV_16S ); + kernel.put(row ,col, + 0, 1, 0, + 1, -1, 1, + 0, 1, 0 ); + + Mat output_image = new Mat(); + Imgproc.morphologyEx(input_image, output_image, Imgproc.MORPH_HITMISS, kernel); + + int rate = 50; + Core.add(kernel, new Scalar(1), kernel); + Core.multiply(kernel, new Scalar(127), kernel); + kernel.convertTo(kernel, CvType.CV_8U); + + Imgproc.resize(kernel, kernel, new Size(), rate, rate, Imgproc.INTER_NEAREST); + HighGui.imshow("kernel", kernel); + HighGui.moveWindow("kernel", 0, 0); + + Imgproc.resize(input_image, input_image, new Size(), rate, rate, Imgproc.INTER_NEAREST); + HighGui.imshow("Original", input_image); + HighGui.moveWindow("Original", 0, 200); + + Imgproc.resize(output_image, output_image, new Size(), rate, rate, Imgproc.INTER_NEAREST); + HighGui.imshow("Hit or Miss", output_image); + HighGui.moveWindow("Hit or Miss", 500, 200); + + HighGui.waitKey(0); + System.exit(0); + } +} + +public class HitMiss +{ + public static void main(String[] args) { + // load the native OpenCV library + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new HitMissRun().run(); + } +} diff --git a/samples/python/tutorial_code/imgProc/HitMiss/hit_miss.py b/samples/python/tutorial_code/imgProc/HitMiss/hit_miss.py new file mode 100644 index 0000000000..c25715c6d4 --- /dev/null +++ b/samples/python/tutorial_code/imgProc/HitMiss/hit_miss.py @@ -0,0 +1,38 @@ +import cv2 +import numpy as np + +input_image = np.array(( + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 255, 255, 255, 0, 0, 0, 255], + [0, 255, 255, 255, 0, 0, 0, 0], + [0, 255, 255, 255, 0, 255, 0, 0], + [0, 0, 255, 0, 0, 0, 0, 0], + [0, 0, 255, 0, 0, 255, 255, 0], + [0,255, 0, 255, 0, 0, 255, 0], + [0, 255, 255, 255, 0, 0, 0, 0]), dtype="uint8") + +kernel = np.array(( + [0, 1, 0], + [1, -1, 1], + [0, 1, 0]), dtype="int") + +output_image = cv2.morphologyEx(input_image, cv2.MORPH_HITMISS, kernel) + +rate = 50 +kernel = (kernel + 1) * 127 +kernel = np.uint8(kernel) + +kernel = cv2.resize(kernel, None, fx = rate, fy = rate, interpolation = cv2.INTER_NEAREST) +cv2.imshow("kernel", kernel) +cv2.moveWindow("kernel", 0, 0) + +input_image = cv2.resize(input_image, None, fx = rate, fy = rate, interpolation = cv2.INTER_NEAREST) +cv2.imshow("Original", input_image) +cv2.moveWindow("Original", 0, 200) + +output_image = cv2.resize(output_image, None , fx = rate, fy = rate, interpolation = cv2.INTER_NEAREST) +cv2.imshow("Hit or Miss", output_image) +cv2.moveWindow("Hit or Miss", 500, 200) + +cv2.waitKey(0) +cv2.destroyAllWindows() From d068e2742018342a2401a90bfd97b40ab8bce3cf Mon Sep 17 00:00:00 2001 From: tribta Date: Mon, 21 Aug 2017 18:51:50 +0100 Subject: [PATCH 03/10] Tutorial Morph Lines Detection --- .../moprh_lines_detection.md | 86 -------- .../morph_lines_detection.md | 194 ++++++++++++++++++ .../imgproc/table_of_content_imgproc.markdown | 4 +- .../Morphology_3.cpp | 74 ++++--- .../morph_lines_detection/Morphology_3.java | 152 ++++++++++++++ .../morph_lines_detection.py | 136 ++++++++++++ 6 files changed, 527 insertions(+), 119 deletions(-) delete mode 100644 doc/tutorials/imgproc/morph_lines_detection/moprh_lines_detection.md create mode 100644 doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md rename samples/cpp/tutorial_code/ImgProc/{ => morph_lines_detection}/Morphology_3.cpp (68%) create mode 100644 samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java create mode 100644 samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py diff --git a/doc/tutorials/imgproc/morph_lines_detection/moprh_lines_detection.md b/doc/tutorials/imgproc/morph_lines_detection/moprh_lines_detection.md deleted file mode 100644 index 23b748ddd1..0000000000 --- a/doc/tutorials/imgproc/morph_lines_detection/moprh_lines_detection.md +++ /dev/null @@ -1,86 +0,0 @@ -Extract horizontal and vertical lines by using morphological operations {#tutorial_moprh_lines_detection} -============= - -Goal ----- - -In this tutorial you will learn how to: - -- Apply two very common morphology operators (i.e. Dilation and Erosion), with the creation of custom kernels, in order to extract straight lines on the horizontal and vertical axes. For this purpose, you will use the following OpenCV functions: - - @ref cv::erode - - @ref cv::dilate - - @ref cv::getStructuringElement - - in an example where your goal will be to extract the music notes from a music sheet. - -Theory ------- - -### Morphology Operations -Morphology is a set of image processing operations that process images based on predefined *structuring elements* known also as kernels. The value of each pixel in the output image is based on a comparison of the corresponding pixel in the input image with its neighbors. By choosing the size and shape of the kernel, you can construct a morphological operation that is sensitive to specific shapes regarding the input image. - -Two of the most basic morphological operations are dilation and erosion. Dilation adds pixels to the boundaries of the object in an image, while erosion does exactly the opposite. The amount of pixels added or removed, respectively depends on the size and shape of the structuring element used to process the image. In general the rules followed from these two operations have as follows: - -- __Dilation__: The value of the output pixel is the maximum value of all the pixels that fall within the structuring element's size and shape. For example in a binary image, if any of the pixels of the input image falling within the range of the kernel is set to the value 1, the corresponding pixel of the output image will be set to 1 as well. The latter applies to any type of image (e.g. grayscale, bgr, etc). - - ![Dilation on a Binary Image](images/morph21.gif) - - ![Dilation on a Grayscale Image](images/morph6.gif) - -- __Erosion__: The vise versa applies for the erosion operation. The value of the output pixel is the minimum value of all the pixels that fall within the structuring element's size and shape. Look the at the example figures below: - - ![Erosion on a Binary Image](images/morph211.png) - - ![Erosion on a Grayscale Image](images/morph61.png) - -### Structuring Elements - -As it can be seen above and in general in any morphological operation the structuring element used to probe the input image, is the most important part. - -A structuring element is a matrix consisting of only 0's and 1's that can have any arbitrary shape and size. Typically are much smaller than the image being processed, while the pixels with values of 1 define the neighborhood. The center pixel of the structuring element, called the origin, identifies the pixel of interest -- the pixel being processed. - -For example, the following illustrates a diamond-shaped structuring element of 7x7 size. - -![A Diamond-Shaped Structuring Element and its Origin](images/morph12.gif) - -A structuring element can have many common shapes, such as lines, diamonds, disks, periodic lines, and circles and sizes. You typically choose a structuring element the same size and shape as the objects you want to process/extract in the input image. For example, to find lines in an image, create a linear structuring element as you will see later. - -Code ----- - -This tutorial code's is shown lines below. You can also download it from [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp). -@include samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp - -Explanation / Result --------------------- - --# Load the source image and check if it is loaded without any problem, then show it: - @snippet samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp load_image - ![](images/src.png) - --# Then transform image to grayscale if it not already: - @snippet samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp gray - ![](images/gray.png) - --# Afterwards transform grayscale image to binary. Notice the ~ symbol which indicates that we use the inverse (i.e. bitwise_not) version of it: - @snippet samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp bin - ![](images/binary.png) - --# Now we are ready to apply morphological operations in order to extract the horizontal and vertical lines and as a consequence to separate the the music notes from the music sheet, but first let's initialize the output images that we will use for that reason: - @snippet samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp init - --# As we specified in the theory in order to extract the object that we desire, we need to create the corresponding structure element. Since here we want to extract the horizontal lines, a corresponding structure element for that purpose will have the following shape: - ![](images/linear_horiz.png) - and in the source code this is represented by the following code snippet: - @snippet samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp horiz - ![](images/horiz.png) - --# The same applies for the vertical lines, with the corresponding structure element: - ![](images/linear_vert.png) - and again this is represented as follows: - @snippet samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp vert - ![](images/vert.png) - --# As you can see we are almost there. However, at that point you will notice that the edges of the notes are a bit rough. For that reason we need to refine the edges in order to obtain a smoother result: - @snippet samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp smooth - ![](images/smooth.png) diff --git a/doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md b/doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md new file mode 100644 index 0000000000..4b0d3fae60 --- /dev/null +++ b/doc/tutorials/imgproc/morph_lines_detection/morph_lines_detection.md @@ -0,0 +1,194 @@ +Extract horizontal and vertical lines by using morphological operations {#tutorial_morph_lines_detection} +============= + +@prev_tutorial{tutorial_hitOrMiss} +@next_tutorial{tutorial_pyramids} + +Goal +---- + +In this tutorial you will learn how to: + +- Apply two very common morphology operators (i.e. Dilation and Erosion), with the creation of custom kernels, in order to extract straight lines on the horizontal and vertical axes. For this purpose, you will use the following OpenCV functions: + - **erode()** + - **dilate()** + - **getStructuringElement()** + + in an example where your goal will be to extract the music notes from a music sheet. + +Theory +------ + +### Morphology Operations +Morphology is a set of image processing operations that process images based on predefined *structuring elements* known also as kernels. The value of each pixel in the output image is based on a comparison of the corresponding pixel in the input image with its neighbors. By choosing the size and shape of the kernel, you can construct a morphological operation that is sensitive to specific shapes regarding the input image. + +Two of the most basic morphological operations are dilation and erosion. Dilation adds pixels to the boundaries of the object in an image, while erosion does exactly the opposite. The amount of pixels added or removed, respectively depends on the size and shape of the structuring element used to process the image. In general the rules followed from these two operations have as follows: + +- __Dilation__: The value of the output pixel is the maximum value of all the pixels that fall within the structuring element's size and shape. For example in a binary image, if any of the pixels of the input image falling within the range of the kernel is set to the value 1, the corresponding pixel of the output image will be set to 1 as well. The latter applies to any type of image (e.g. grayscale, bgr, etc). + + ![Dilation on a Binary Image](images/morph21.gif) + + ![Dilation on a Grayscale Image](images/morph6.gif) + +- __Erosion__: The vise versa applies for the erosion operation. The value of the output pixel is the minimum value of all the pixels that fall within the structuring element's size and shape. Look the at the example figures below: + + ![Erosion on a Binary Image](images/morph211.png) + + ![Erosion on a Grayscale Image](images/morph61.png) + +### Structuring Elements + +As it can be seen above and in general in any morphological operation the structuring element used to probe the input image, is the most important part. + +A structuring element is a matrix consisting of only 0's and 1's that can have any arbitrary shape and size. Typically are much smaller than the image being processed, while the pixels with values of 1 define the neighborhood. The center pixel of the structuring element, called the origin, identifies the pixel of interest -- the pixel being processed. + +For example, the following illustrates a diamond-shaped structuring element of 7x7 size. + +![A Diamond-Shaped Structuring Element and its Origin](images/morph12.gif) + +A structuring element can have many common shapes, such as lines, diamonds, disks, periodic lines, and circles and sizes. You typically choose a structuring element the same size and shape as the objects you want to process/extract in the input image. For example, to find lines in an image, create a linear structuring element as you will see later. + +Code +---- + +This tutorial code's is shown lines below. + +@add_toggle_cpp +You can also download it from [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp). +@include samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp +@end_toggle + +@add_toggle_java +You can also download it from [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java). +@include samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java +@end_toggle + +@add_toggle_python +You can also download it from [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py). +@include samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py +@end_toggle + +Explanation / Result +-------------------- + +Get image from [here](https://raw.githubusercontent.com/opencv/opencv/master/doc/tutorials/imgproc/morph_lines_detection/images/src.png) . + +#### Load Image + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp load_image +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java load_image +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py load_image +@end_toggle + +![](images/src.png) + +#### Grayscale + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp gray +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java gray +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py gray +@end_toggle + +![](images/gray.png) + +#### Grayscale to Binary image + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp bin +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java bin +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py bin +@end_toggle + +![](images/binary.png) + +#### Output images + +Now we are ready to apply morphological operations in order to extract the horizontal and vertical lines and as a consequence to separate the the music notes from the music sheet, but first let's initialize the output images that we will use for that reason: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp init +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java init +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py init +@end_toggle + +#### Structure elements + +As we specified in the theory in order to extract the object that we desire, we need to create the corresponding structure element. Since we want to extract the horizontal lines, a corresponding structure element for that purpose will have the following shape: +![](images/linear_horiz.png) +and in the source code this is represented by the following code snippet: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp horiz +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java horiz +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py horiz +@end_toggle + +![](images/horiz.png) + +The same applies for the vertical lines, with the corresponding structure element: +![](images/linear_vert.png) +and again this is represented as follows: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp vert +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java vert +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py vert +@end_toggle + +![](images/vert.png) + +#### Refine edges / Result + +As you can see we are almost there. However, at that point you will notice that the edges of the notes are a bit rough. For that reason we need to refine the edges in order to obtain a smoother result: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp smooth +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java smooth +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py smooth +@end_toggle + +![](images/smooth.png) diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index 59f7725cb1..b83d0a63e3 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -39,7 +39,9 @@ In this section you will learn about the image processing (manipulation) functio Learn how to find patterns in binary images using the Hit-or-Miss operation -- @subpage tutorial_moprh_lines_detection +- @subpage tutorial_morph_lines_detection + + *Languages:* C++, Java, Python *Compatibility:* \> OpenCV 2.0 diff --git a/samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp b/samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp similarity index 68% rename from samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp rename to samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp index fa70e697fb..1b0b4b7beb 100644 --- a/samples/cpp/tutorial_code/ImgProc/Morphology_3.cpp +++ b/samples/cpp/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.cpp @@ -4,28 +4,32 @@ * @author OpenCV team */ -#include #include +void show_wait_destroy(const char* winname, cv::Mat img); + using namespace std; using namespace cv; int main(int, char** argv) { -//! [load_image] + //! [load_image] // Load the image Mat src = imread(argv[1]); // Check if image is loaded fine - if(!src.data) - cerr << "Problem loading image!!!" << endl; + if(src.empty()){ + printf(" Error opening image\n"); + printf(" Program Arguments: [image_path]\n"); + return -1; + } // Show source image imshow("src", src); -//! [load_image] + //! [load_image] -//! [gray] - // Transform source image to gray if it is not + //! [gray] + // Transform source image to gray if it is not already Mat gray; if (src.channels() == 3) @@ -38,58 +42,58 @@ int main(int, char** argv) } // Show gray image - imshow("gray", gray); -//! [gray] + show_wait_destroy("gray", gray); + //! [gray] -//! [bin] + //! [bin] // Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol Mat bw; adaptiveThreshold(~gray, bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); // Show binary image - imshow("binary", bw); -//! [bin] + show_wait_destroy("binary", bw); + //! [bin] -//! [init] + //! [init] // Create the images that will use to extract the horizontal and vertical lines Mat horizontal = bw.clone(); Mat vertical = bw.clone(); -//! [init] + //! [init] -//! [horiz] + //! [horiz] // Specify size on horizontal axis - int horizontalsize = horizontal.cols / 30; + int horizontal_size = horizontal.cols / 30; // Create structure element for extracting horizontal lines through morphology operations - Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontalsize,1)); + Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontal_size, 1)); // Apply morphology operations erode(horizontal, horizontal, horizontalStructure, Point(-1, -1)); dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1)); // Show extracted horizontal lines - imshow("horizontal", horizontal); -//! [horiz] + show_wait_destroy("horizontal", horizontal); + //! [horiz] -//! [vert] + //! [vert] // Specify size on vertical axis - int verticalsize = vertical.rows / 30; + int vertical_size = vertical.rows / 30; // Create structure element for extracting vertical lines through morphology operations - Mat verticalStructure = getStructuringElement(MORPH_RECT, Size( 1,verticalsize)); + Mat verticalStructure = getStructuringElement(MORPH_RECT, Size(1, vertical_size)); // Apply morphology operations erode(vertical, vertical, verticalStructure, Point(-1, -1)); dilate(vertical, vertical, verticalStructure, Point(-1, -1)); // Show extracted vertical lines - imshow("vertical", vertical); -//! [vert] + show_wait_destroy("vertical", vertical); + //! [vert] -//! [smooth] + //! [smooth] // Inverse vertical image bitwise_not(vertical, vertical); - imshow("vertical_bit", vertical); + show_wait_destroy("vertical_bit", vertical); // Extract edges and smooth image according to the logic // 1. extract edges @@ -101,12 +105,12 @@ int main(int, char** argv) // Step 1 Mat edges; adaptiveThreshold(vertical, edges, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2); - imshow("edges", edges); + show_wait_destroy("edges", edges); // Step 2 Mat kernel = Mat::ones(2, 2, CV_8UC1); dilate(edges, edges, kernel); - imshow("dilate", edges); + show_wait_destroy("dilate", edges); // Step 3 Mat smooth; @@ -119,9 +123,15 @@ int main(int, char** argv) smooth.copyTo(vertical, edges); // Show final result - imshow("smooth", vertical); -//! [smooth] + show_wait_destroy("smooth - final", vertical); + //! [smooth] - waitKey(0); return 0; -} \ No newline at end of file +} + +void show_wait_destroy(const char* winname, cv::Mat img) { + imshow(winname, img); + moveWindow(winname, 500, 0); + waitKey(0); + destroyWindow(winname); +} diff --git a/samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java b/samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java new file mode 100644 index 0000000000..23f7299677 --- /dev/null +++ b/samples/java/tutorial_code/ImgProc/morph_lines_detection/Morphology_3.java @@ -0,0 +1,152 @@ +/** + * @file Morphology_3.java + * @brief Use morphology transformations for extracting horizontal and vertical lines sample code + */ + +import org.opencv.core.*; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +class Morphology_3Run { + + public void run(String[] args) { + + //! [load_image] + // Check number of arguments + if (args.length == 0){ + System.out.println("Not enough parameters!"); + System.out.println("Program Arguments: [image_path]"); + System.exit(-1); + } + + // Load the image + Mat src = Imgcodecs.imread(args[0]); + + // Check if image is loaded fine + if( src.empty() ) { + System.out.println("Error opening image: " + args[0]); + System.exit(-1); + } + + // Show source image + HighGui.imshow("src", src); + //! [load_image] + + //! [gray] + // Transform source image to gray if it is not already + Mat gray = new Mat(); + + if (src.channels() == 3) + { + Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); + } + else + { + gray = src; + } + + // Show gray image + showWaitDestroy("gray" , gray); + //! [gray] + + //! [bin] + // Apply adaptiveThreshold at the bitwise_not of gray + Mat bw = new Mat(); + Core.bitwise_not(gray, gray); + Imgproc.adaptiveThreshold(gray, bw, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 15, -2); + + // Show binary image + showWaitDestroy("binary" , bw); + //! [bin] + + //! [init] + // Create the images that will use to extract the horizontal and vertical lines + Mat horizontal = bw.clone(); + Mat vertical = bw.clone(); + //! [init] + + //! [horiz] + // Specify size on horizontal axis + int horizontal_size = horizontal.cols() / 30; + + // Create structure element for extracting horizontal lines through morphology operations + Mat horizontalStructure = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(horizontal_size,1)); + + // Apply morphology operations + Imgproc.erode(horizontal, horizontal, horizontalStructure); + Imgproc.dilate(horizontal, horizontal, horizontalStructure); + + // Show extracted horizontal lines + showWaitDestroy("horizontal" , horizontal); + //! [horiz] + + //! [vert] + // Specify size on vertical axis + int vertical_size = vertical.rows() / 30; + + // Create structure element for extracting vertical lines through morphology operations + Mat verticalStructure = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size( 1,vertical_size)); + + // Apply morphology operations + Imgproc.erode(vertical, vertical, verticalStructure); + Imgproc.dilate(vertical, vertical, verticalStructure); + + // Show extracted vertical lines + showWaitDestroy("vertical", vertical); + //! [vert] + + //! [smooth] + // Inverse vertical image + Core.bitwise_not(vertical, vertical); + showWaitDestroy("vertical_bit" , vertical); + + // Extract edges and smooth image according to the logic + // 1. extract edges + // 2. dilate(edges) + // 3. src.copyTo(smooth) + // 4. blur smooth img + // 5. smooth.copyTo(src, edges) + + // Step 1 + Mat edges = new Mat(); + Imgproc.adaptiveThreshold(vertical, edges, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 3, -2); + showWaitDestroy("edges", edges); + + // Step 2 + Mat kernel = Mat.ones(2, 2, CvType.CV_8UC1); + Imgproc.dilate(edges, edges, kernel); + showWaitDestroy("dilate", edges); + + // Step 3 + Mat smooth = new Mat(); + vertical.copyTo(smooth); + + // Step 4 + Imgproc.blur(smooth, smooth, new Size(2, 2)); + + // Step 5 + smooth.copyTo(vertical, edges); + + // Show final result + showWaitDestroy("smooth - final", vertical); + //! [smooth] + + System.exit(0); + } + + private void showWaitDestroy(String winname, Mat img) { + HighGui.imshow(winname, img); + HighGui.moveWindow(winname, 500, 0); + HighGui.waitKey(0); + HighGui.destroyWindow(winname); + } +} + +public class Morphology_3 { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new Morphology_3Run().run(args); + } +} diff --git a/samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py b/samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py new file mode 100644 index 0000000000..24965e5cbb --- /dev/null +++ b/samples/python/tutorial_code/imgProc/morph_lines_detection/morph_lines_detection.py @@ -0,0 +1,136 @@ +""" +@file morph_lines_detection.py +@brief Use morphology transformations for extracting horizontal and vertical lines sample code +""" +import numpy as np +import sys +import cv2 + + +def show_wait_destroy(winname, img): + cv2.imshow(winname, img) + cv2.moveWindow(winname, 500, 0) + cv2.waitKey(0) + cv2.destroyWindow(winname) + + +def main(argv): + # [load_image] + # Check number of arguments + if len(argv) < 1: + print ('Not enough parameters') + print ('Usage:\nmorph_lines_detection.py < path_to_image >') + return -1 + + # Load the image + src = cv2.imread(argv[0], cv2.IMREAD_COLOR) + + # Check if image is loaded fine + if src is None: + print ('Error opening image: ' + argv[0]) + return -1 + + # Show source image + cv2.imshow("src", src) + # [load_image] + + # [gray] + # Transform source image to gray if it is not already + if len(src.shape) != 2: + gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) + else: + gray = src + + # Show gray image + show_wait_destroy("gray", gray) + # [gray] + + # [bin] + # Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol + gray = cv2.bitwise_not(gray) + bw = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, \ + cv2.THRESH_BINARY, 15, -2) + # Show binary image + show_wait_destroy("binary", bw) + # [bin] + + # [init] + # Create the images that will use to extract the horizontal and vertical lines + horizontal = np.copy(bw) + vertical = np.copy(bw) + # [init] + + # [horiz] + # Specify size on horizontal axis + cols = horizontal.shape[1] + horizontal_size = cols / 30 + + # Create structure element for extracting horizontal lines through morphology operations + horizontalStructure = cv2.getStructuringElement(cv2.MORPH_RECT, (horizontal_size, 1)) + + # Apply morphology operations + horizontal = cv2.erode(horizontal, horizontalStructure) + horizontal = cv2.dilate(horizontal, horizontalStructure) + + # Show extracted horizontal lines + show_wait_destroy("horizontal", horizontal) + # [horiz] + + # [vert] + # Specify size on vertical axis + rows = vertical.shape[0] + verticalsize = rows / 30 + + # Create structure element for extracting vertical lines through morphology operations + verticalStructure = cv2.getStructuringElement(cv2.MORPH_RECT, (1, verticalsize)) + + # Apply morphology operations + vertical = cv2.erode(vertical, verticalStructure) + vertical = cv2.dilate(vertical, verticalStructure) + + # Show extracted vertical lines + show_wait_destroy("vertical", vertical) + # [vert] + + # [smooth] + # Inverse vertical image + vertical = cv2.bitwise_not(vertical) + show_wait_destroy("vertical_bit", vertical) + + ''' + Extract edges and smooth image according to the logic + 1. extract edges + 2. dilate(edges) + 3. src.copyTo(smooth) + 4. blur smooth img + 5. smooth.copyTo(src, edges) + ''' + + # Step 1 + edges = cv2.adaptiveThreshold(vertical, 255, cv2.ADAPTIVE_THRESH_MEAN_C, \ + cv2.THRESH_BINARY, 3, -2) + show_wait_destroy("edges", edges) + + # Step 2 + kernel = np.ones((2, 2), np.uint8) + edges = cv2.dilate(edges, kernel) + show_wait_destroy("dilate", edges) + + # Step 3 + smooth = np.copy(vertical) + + # Step 4 + smooth = cv2.blur(smooth, (2, 2)) + + # Step 5 + (rows, cols) = np.where(edges != 0) + vertical[rows, cols] = smooth[rows, cols] + + # Show final result + show_wait_destroy("smooth - final", vertical) + # [smooth] + + return 0 + +if __name__ == "__main__": + main(sys.argv[1:]) From 3250f11f0cdafa282f3d9ee29cad329a2b21f6c5 Mon Sep 17 00:00:00 2001 From: tribta Date: Tue, 22 Aug 2017 00:17:09 +0100 Subject: [PATCH 04/10] Tutorial Laplace Operator --- .../laplace_operator.markdown | 135 +++++++++++++++--- .../imgproc/table_of_content_imgproc.markdown | 2 + .../tutorial_code/ImgTrans/Laplace_Demo.cpp | 79 +++++----- .../ImgTrans/LaPlace/LaplaceDemo.java | 73 ++++++++++ .../ImgTrans/LaPlace/laplace_demo.py | 59 ++++++++ 5 files changed, 292 insertions(+), 56 deletions(-) create mode 100644 samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java create mode 100644 samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py diff --git a/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.markdown b/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.markdown index f1781706cb..63aed356b2 100644 --- a/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.markdown +++ b/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.markdown @@ -1,12 +1,15 @@ Laplace Operator {#tutorial_laplace_operator} ================ +@prev_tutorial{tutorial_sobel_derivatives} +@next_tutorial{tutorial_canny_detector} + Goal ---- In this tutorial you will learn how to: -- Use the OpenCV function @ref cv::Laplacian to implement a discrete analog of the *Laplacian +- Use the OpenCV function **Laplacian()** to implement a discrete analog of the *Laplacian operator*. Theory @@ -37,7 +40,7 @@ Theory \f[Laplace(f) = \dfrac{\partial^{2} f}{\partial x^{2}} + \dfrac{\partial^{2} f}{\partial y^{2}}\f] --# The Laplacian operator is implemented in OpenCV by the function @ref cv::Laplacian . In fact, +-# The Laplacian operator is implemented in OpenCV by the function **Laplacian()** . In fact, since the Laplacian uses the gradient of images, it calls internally the *Sobel* operator to perform its computation. @@ -50,25 +53,98 @@ Code - Applies a Laplacian operator to the grayscale image and stores the output image - Display the result in a window +@add_toggle_cpp -# The tutorial code's is shown lines below. You can also download it from - [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp) + [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp) @include samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp +@end_toggle + +@add_toggle_java +-# The tutorial code's is shown lines below. You can also download it from + [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java) + @include samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java +@end_toggle + +@add_toggle_python +-# The tutorial code's is shown lines below. You can also download it from + [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py) + @include samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py +@end_toggle Explanation ----------- --# Create some needed variables: - @snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp variables --# Loads the source image: - @snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp load --# Apply a Gaussian blur to reduce noise: - @snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp reduce_noise --# Convert the image to grayscale using @ref cv::cvtColor - @snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp convert_to_gray --# Apply the Laplacian operator to the grayscale image: - @snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp laplacian - where the arguments are: +#### Declare variables +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp variables +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java variables +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py variables +@end_toggle + +#### Load source image + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp load +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java load +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py load +@end_toggle + +#### Reduce noise + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp reduce_noise +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java reduce_noise +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py reduce_noise +@end_toggle + +#### Grayscale + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp convert_to_gray +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java convert_to_gray +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py convert_to_gray +@end_toggle + +#### Laplacian operator + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp laplacian +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java laplacian +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py laplacian +@end_toggle + +- The arguments are: - *src_gray*: The input image. - *dst*: Destination (output) image - *ddepth*: Depth of the destination image. Since our input is *CV_8U* we define *ddepth* = @@ -77,10 +153,33 @@ Explanation this example. - *scale*, *delta* and *BORDER_DEFAULT*: We leave them as default values. --# Convert the output from the Laplacian operator to a *CV_8U* image: - @snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp convert --# Display the result in a window: - @snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp display +#### Convert output to a *CV_8U* image + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp convert +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java convert +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py convert +@end_toggle + +#### Display the result + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp display +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java display +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py display +@end_toggle Results ------- diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index b83d0a63e3..5ee75f3118 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -99,6 +99,8 @@ In this section you will learn about the image processing (manipulation) functio - @subpage tutorial_laplace_operator + *Languages:* C++, Java, Python + *Compatibility:* \> OpenCV 2.0 *Author:* Ana Huamán diff --git a/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp b/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp index 0f56c49df7..80b6e84344 100644 --- a/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp +++ b/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp @@ -15,50 +15,53 @@ using namespace cv; */ int main( int argc, char** argv ) { - //![variables] - Mat src, src_gray, dst; - int kernel_size = 3; - int scale = 1; - int delta = 0; - int ddepth = CV_16S; - const char* window_name = "Laplace Demo"; - //![variables] + //![variables] + // Declare the variables we are going to use + Mat src, src_gray, dst; + int kernel_size = 3; + int scale = 1; + int delta = 0; + int ddepth = CV_16S; + const char* window_name = "Laplace Demo"; + //![variables] - //![load] - String imageName("../data/lena.jpg"); // by default - if (argc > 1) - { - imageName = argv[1]; - } - src = imread( imageName, IMREAD_COLOR ); // Load an image + //![load] + const char* imageName = argc >=2 ? argv[1] : "../data/lena.jpg"; - if( src.empty() ) - { return -1; } - //![load] + src = imread( imageName, IMREAD_COLOR ); // Load an image - //![reduce_noise] - /// Reduce noise by blurring with a Gaussian filter - GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT ); - //![reduce_noise] + // Check if image is loaded fine + if(src.empty()){ + printf(" Error opening image\n"); + printf(" Program Arguments: [image_name -- default ../data/lena.jpg] \n"); + return -1; + } + //![load] - //![convert_to_gray] - cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to grayscale - //![convert_to_gray] + //![reduce_noise] + // Reduce noise by blurring with a Gaussian filter ( kernel size = 3 ) + GaussianBlur( src, src, Size(3, 3), 0, 0, BORDER_DEFAULT ); + //![reduce_noise] - /// Apply Laplace function - Mat abs_dst; - //![laplacian] - Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT ); - //![laplacian] + //![convert_to_gray] + cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to grayscale + //![convert_to_gray] - //![convert] - convertScaleAbs( dst, abs_dst ); - //![convert] + /// Apply Laplace function + Mat abs_dst; + //![laplacian] + Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT ); + //![laplacian] - //![display] - imshow( window_name, abs_dst ); - waitKey(0); - //![display] + //![convert] + // converting back to CV_8U + convertScaleAbs( dst, abs_dst ); + //![convert] - return 0; + //![display] + imshow( window_name, abs_dst ); + waitKey(0); + //![display] + + return 0; } diff --git a/samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java b/samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java new file mode 100644 index 0000000000..d9dba705fe --- /dev/null +++ b/samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java @@ -0,0 +1,73 @@ +/** + * @file LaplaceDemo.java + * @brief Sample code showing how to detect edges using the Laplace operator + */ + +import org.opencv.core.*; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +class LaplaceDemoRun { + + public void run(String[] args) { + //! [variables] + // Declare the variables we are going to use + Mat src, src_gray = new Mat(), dst = new Mat(); + int kernel_size = 3; + int scale = 1; + int delta = 0; + int ddepth = CvType.CV_16S; + String window_name = "Laplace Demo"; + //! [variables] + + //! [load] + String imageName = ((args.length > 0) ? args[0] : "../data/lena.jpg"); + + src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR); // Load an image + + // Check if image is loaded fine + if( src.empty() ) { + System.out.println("Error opening image"); + System.out.println("Program Arguments: [image_name -- default ../data/lena.jpg] \n"); + System.exit(-1); + } + //! [load] + + //! [reduce_noise] + // Reduce noise by blurring with a Gaussian filter ( kernel size = 3 ) + Imgproc.GaussianBlur( src, src, new Size(3, 3), 0, 0, Core.BORDER_DEFAULT ); + //! [reduce_noise] + + //! [convert_to_gray] + // Convert the image to grayscale + Imgproc.cvtColor( src, src_gray, Imgproc.COLOR_RGB2GRAY ); + //! [convert_to_gray] + + /// Apply Laplace function + Mat abs_dst = new Mat(); + //! [laplacian] + Imgproc.Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, Core.BORDER_DEFAULT ); + //! [laplacian] + + //! [convert] + // converting back to CV_8U + Core.convertScaleAbs( dst, abs_dst ); + //! [convert] + + //! [display] + HighGui.imshow( window_name, abs_dst ); + HighGui.waitKey(0); + //! [display] + + System.exit(0); + } +} + +public class LaplaceDemo { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new LaplaceDemoRun().run(args); + } +} diff --git a/samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py b/samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py new file mode 100644 index 0000000000..5776e445fc --- /dev/null +++ b/samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py @@ -0,0 +1,59 @@ +""" +@file laplace_demo.py +@brief Sample code showing how to detect edges using the Laplace operator +""" +import sys +import cv2 + +def main(argv): + # [variables] + # Declare the variables we are going to use + ddepth = cv2.CV_16S + kernel_size = 3 + window_name = "Laplace Demo" + # [variables] + + # [load] + imageName = argv[0] if len(argv) > 0 else "../data/lena.jpg" + + src = cv2.imread(imageName, cv2.IMREAD_COLOR) # Load an image + + # Check if image is loaded fine + if src is None: + print ('Error opening image') + print ('Program Arguments: [image_name -- default ../data/lena.jpg]') + return -1 + # [load] + + # [reduce_noise] + # Remove noise by blurring with a Gaussian filter + src = cv2.GaussianBlur(src, (3, 3), 0) + # [reduce_noise] + + # [convert_to_gray] + # Convert the image to grayscale + src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) + # [convert_to_gray] + + # Create Window + cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE) + + # [laplacian] + # Apply Laplace function + dst = cv2.Laplacian(src_gray, ddepth, kernel_size) + # [laplacian] + + # [convert] + # converting back to uint8 + abs_dst = cv2.convertScaleAbs(dst) + # [convert] + + # [display] + cv2.imshow(window_name, abs_dst) + cv2.waitKey(0) + # [display] + + return 0 + +if __name__ == "__main__": + main(sys.argv[1:]) From f7d85bfed86cdcbbb683dd66a885f9c2aadaccaf Mon Sep 17 00:00:00 2001 From: tribta Date: Tue, 22 Aug 2017 12:28:23 +0100 Subject: [PATCH 05/10] Tutorial Sobel Derivatives --- .../sobel_derivatives.markdown | 93 ++++++++++++------ .../imgproc/table_of_content_imgproc.markdown | 2 + .../cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp | 9 +- .../ImgTrans/SobelDemo/SobelDemo.java | 94 +++++++++++++++++++ .../ImgTrans/SobelDemo/sobel_demo.py | 74 +++++++++++++++ 5 files changed, 243 insertions(+), 29 deletions(-) create mode 100644 samples/java/tutorial_code/ImgTrans/SobelDemo/SobelDemo.java create mode 100644 samples/python/tutorial_code/ImgTrans/SobelDemo/sobel_demo.py diff --git a/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.markdown b/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.markdown index 3112b08cd0..f6010fc6e3 100644 --- a/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.markdown +++ b/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.markdown @@ -1,13 +1,16 @@ Sobel Derivatives {#tutorial_sobel_derivatives} ================= +@prev_tutorial{tutorial_copyMakeBorder} +@next_tutorial{tutorial_laplace_operator} + Goal ---- In this tutorial you will learn how to: -- Use the OpenCV function @ref cv::Sobel to calculate the derivatives from an image. -- Use the OpenCV function @ref cv::Scharr to calculate a more accurate derivative for a kernel of +- Use the OpenCV function **Sobel()** to calculate the derivatives from an image. +- Use the OpenCV function **Scharr()** to calculate a more accurate derivative for a kernel of size \f$3 \cdot 3\f$ Theory @@ -83,7 +86,7 @@ Assuming that the image to be operated is \f$I\f$: @note When the size of the kernel is `3`, the Sobel kernel shown above may produce noticeable inaccuracies (after all, Sobel is only an approximation of the derivative). OpenCV addresses - this inaccuracy for kernels of size 3 by using the @ref cv::Scharr function. This is as fast + this inaccuracy for kernels of size 3 by using the **Scharr()** function. This is as fast but more accurate than the standar Sobel function. It implements the following kernels: \f[G_{x} = \begin{bmatrix} -3 & 0 & +3 \\ @@ -95,9 +98,9 @@ Assuming that the image to be operated is \f$I\f$: +3 & +10 & +3 \end{bmatrix}\f] @note - You can check out more information of this function in the OpenCV reference (@ref cv::Scharr ). - Also, in the sample code below, you will notice that above the code for @ref cv::Sobel function - there is also code for the @ref cv::Scharr function commented. Uncommenting it (and obviously + You can check out more information of this function in the OpenCV reference - **Scharr()** . + Also, in the sample code below, you will notice that above the code for **Sobel()** function + there is also code for the **Scharr()** function commented. Uncommenting it (and obviously commenting the Sobel stuff) should give you an idea of how this function works. Code @@ -107,28 +110,55 @@ Code - Applies the *Sobel Operator* and generates as output an image with the detected *edges* bright on a darker background. --# The tutorial code's is shown lines below. You can also download it from - [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp) - @include samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp +-# The tutorial code's is shown lines below. + +@add_toggle_cpp +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp) +@include samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp +@end_toggle + +@add_toggle_java +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgTrans/SobelDemo/SobelDemo.java) +@include samples/java/tutorial_code/ImgTrans/SobelDemo/SobelDemo.java +@end_toggle + +@add_toggle_python +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/ImgTrans/SobelDemo/sobel_demo.py) +@include samples/python/tutorial_code/ImgTrans/SobelDemo/sobel_demo.py +@end_toggle Explanation ----------- --# First we declare the variables we are going to use: - @snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp variables --# As usual we load our source image *src*: - @snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp load --# First, we apply a @ref cv::GaussianBlur to our image to reduce the noise ( kernel size = 3 ) - @snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp reduce_noise --# Now we convert our filtered image to grayscale: - @snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp convert_to_gray --# Second, we calculate the "*derivatives*" in *x* and *y* directions. For this, we use the - function @ref cv::Sobel as shown below: - @snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp sobel +#### Declare variables + +@snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp variables + +#### Load source image + +@snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp load + +#### Reduce noise + +@snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp reduce_noise + +#### Grayscale + +@snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp convert_to_gray + +#### Sobel Operator + +@snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp sobel + +- We calculate the "derivatives" in *x* and *y* directions. For this, we use the + function **Sobel()** as shown below: The function takes the following arguments: - *src_gray*: In our example, the input image. Here it is *CV_8U* - - *grad_x*/*grad_y*: The output image. + - *grad_x* / *grad_y* : The output image. - *ddepth*: The depth of the output image. We set it to *CV_16S* to avoid overflow. - *x_order*: The order of the derivative in **x** direction. - *y_order*: The order of the derivative in **y** direction. @@ -137,13 +167,20 @@ Explanation Notice that to calculate the gradient in *x* direction we use: \f$x_{order}= 1\f$ and \f$y_{order} = 0\f$. We do analogously for the *y* direction. --# We convert our partial results back to *CV_8U*: - @snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp convert --# Finally, we try to approximate the *gradient* by adding both directional gradients (note that - this is not an exact calculation at all! but it is good for our purposes). - @snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp blend --# Finally, we show our result: - @snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp display +#### Convert output to a CV_8U image + +@snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp convert + +#### Gradient + +@snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp blend + +We try to approximate the *gradient* by adding both directional gradients (note that +this is not an exact calculation at all! but it is good for our purposes). + +#### Show results + +@snippet cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp display Results ------- diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index 5ee75f3118..f4c57cdd62 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -91,6 +91,8 @@ In this section you will learn about the image processing (manipulation) functio - @subpage tutorial_sobel_derivatives + *Languages:* C++, Java, Python + *Compatibility:* \> OpenCV 2.0 *Author:* Ana Huamán diff --git a/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp b/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp index 5209380414..16661d8d31 100644 --- a/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp +++ b/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp @@ -30,6 +30,7 @@ int main( int argc, char** argv ) cout << "\nPress 'ESC' to exit program.\nPress 'R' to reset values ( ksize will be -1 equal to Scharr function )"; //![variables] + // First we declare the variables we are going to use Mat image,src, src_gray; Mat grad; const String window_name = "Sobel Demo - Simple Edge Detector"; @@ -40,11 +41,14 @@ int main( int argc, char** argv ) //![variables] //![load] - String imageName = parser.get("@input"); // by default + String imageName = parser.get("@input"); + // As usual we load our source image (src) image = imread( imageName, IMREAD_COLOR ); // Load an image + // Check if image is loaded fine if( image.empty() ) { + printf("Error opening image: %s\n", imageName.c_str()); return 1; } //![load] @@ -52,10 +56,12 @@ int main( int argc, char** argv ) for (;;) { //![reduce_noise] + // Remove noise by blurring with a Gaussian filter ( kernel size = 3 ) GaussianBlur(image, src, Size(3, 3), 0, 0, BORDER_DEFAULT); //![reduce_noise] //![convert_to_gray] + // Convert the image to grayscale cvtColor(src, src_gray, COLOR_BGR2GRAY); //![convert_to_gray] @@ -72,6 +78,7 @@ int main( int argc, char** argv ) //![sobel] //![convert] + // converting back to CV_8U convertScaleAbs(grad_x, abs_grad_x); convertScaleAbs(grad_y, abs_grad_y); //![convert] diff --git a/samples/java/tutorial_code/ImgTrans/SobelDemo/SobelDemo.java b/samples/java/tutorial_code/ImgTrans/SobelDemo/SobelDemo.java new file mode 100644 index 0000000000..815c16bc3b --- /dev/null +++ b/samples/java/tutorial_code/ImgTrans/SobelDemo/SobelDemo.java @@ -0,0 +1,94 @@ +/** + * @file SobelDemo.java + * @brief Sample code using Sobel and/or Scharr OpenCV functions to make a simple Edge Detector + */ + +import org.opencv.core.*; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +class SobelDemoRun { + + public void run(String[] args) { + + //! [declare_variables] + // First we declare the variables we are going to use + Mat src, src_gray = new Mat(); + Mat grad = new Mat(); + String window_name = "Sobel Demo - Simple Edge Detector"; + int scale = 1; + int delta = 0; + int ddepth = CvType.CV_16S; + //! [declare_variables] + + //! [load] + // As usual we load our source image (src) + // Check number of arguments + if (args.length == 0){ + System.out.println("Not enough parameters!"); + System.out.println("Program Arguments: [image_path]"); + System.exit(-1); + } + + // Load the image + src = Imgcodecs.imread(args[0]); + + // Check if image is loaded fine + if( src.empty() ) { + System.out.println("Error opening image: " + args[0]); + System.exit(-1); + } + //! [load] + + //! [reduce_noise] + // Remove noise by blurring with a Gaussian filter ( kernel size = 3 ) + Imgproc.GaussianBlur( src, src, new Size(3, 3), 0, 0, Core.BORDER_DEFAULT ); + //! [reduce_noise] + + //! [convert_to_gray] + // Convert the image to grayscale + Imgproc.cvtColor( src, src_gray, Imgproc.COLOR_RGB2GRAY ); + //! [convert_to_gray] + + //! [sobel] + /// Generate grad_x and grad_y + Mat grad_x = new Mat(), grad_y = new Mat(); + Mat abs_grad_x = new Mat(), abs_grad_y = new Mat(); + + /// Gradient X + //Imgproc.Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, Core.BORDER_DEFAULT ); + Imgproc.Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, Core.BORDER_DEFAULT ); + + /// Gradient Y + //Imgproc.Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, Core.BORDER_DEFAULT ); + Imgproc.Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, Core.BORDER_DEFAULT ); + //! [sobel] + + //![convert] + // converting back to CV_8U + Core.convertScaleAbs( grad_x, abs_grad_x ); + Core.convertScaleAbs( grad_y, abs_grad_y ); + //![convert] + + //! [add_weighted] + /// Total Gradient (approximate) + Core.addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad ); + //! [add_weighted] + + //! [display] + HighGui.imshow( window_name, grad ); + HighGui.waitKey(0); + //! [display] + + System.exit(0); + } +} + +public class SobelDemo { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new SobelDemoRun().run(args); + } +} diff --git a/samples/python/tutorial_code/ImgTrans/SobelDemo/sobel_demo.py b/samples/python/tutorial_code/ImgTrans/SobelDemo/sobel_demo.py new file mode 100644 index 0000000000..4afe3afa06 --- /dev/null +++ b/samples/python/tutorial_code/ImgTrans/SobelDemo/sobel_demo.py @@ -0,0 +1,74 @@ +""" +@file sobel_demo.py +@brief Sample code using Sobel and/or Scharr OpenCV functions to make a simple Edge Detector +""" +import sys +import cv2 + + +def main(argv): + ## [variables] + # First we declare the variables we are going to use + window_name = ('Sobel Demo - Simple Edge Detector') + scale = 1 + delta = 0 + ddepth = cv2.CV_16S + ## [variables] + + ## [load] + # As usual we load our source image (src) + # Check number of arguments + if len(argv) < 1: + print ('Not enough parameters') + print ('Usage:\nmorph_lines_detection.py < path_to_image >') + return -1 + + # Load the image + src = cv2.imread(argv[0], cv2.IMREAD_COLOR) + + # Check if image is loaded fine + if src is None: + print ('Error opening image: ' + argv[0]) + return -1 + ## [load] + + ## [reduce_noise] + # Remove noise by blurring with a Gaussian filter ( kernel size = 3 ) + src = cv2.GaussianBlur(src, (3, 3), 0) + ## [reduce_noise] + + ## [convert_to_gray] + # Convert the image to grayscale + gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) + ## [convert_to_gray] + + ## [sobel] + # Gradient-X + # grad_x = cv2.Scharr(gray,ddepth,1,0) + grad_x = cv2.Sobel(gray, ddepth, 1, 0, ksize=3, scale=scale, delta=delta, borderType=cv2.BORDER_DEFAULT) + + # Gradient-Y + # grad_y = cv2.Scharr(gray,ddepth,0,1) + grad_y = cv2.Sobel(gray, ddepth, 0, 1, ksize=3, scale=scale, delta=delta, borderType=cv2.BORDER_DEFAULT) + ## [sobel] + + ## [convert] + # converting back to uint8 + abs_grad_x = cv2.convertScaleAbs(grad_x) + abs_grad_y = cv2.convertScaleAbs(grad_y) + ## [convert] + + ## [blend] + ## Total Gradient (approximate) + grad = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0) + ## [blend] + + ## [display] + cv2.imshow(window_name, grad) + cv2.waitKey(0) + ## [display] + + return 0 + +if __name__ == "__main__": + main(sys.argv[1:]) From 08515281b9d4a8d9a8471d6e03d595e740a0d362 Mon Sep 17 00:00:00 2001 From: tribta Date: Wed, 23 Aug 2017 15:37:11 +0100 Subject: [PATCH 06/10] Tutorial Image Pyramids --- .../imgproc/pyramids/pyramids.markdown | 155 ++++++++++++------ .../imgproc/table_of_content_imgproc.markdown | 2 + .../cpp/tutorial_code/ImgProc/Pyramids.cpp | 73 --------- .../ImgProc/Pyramids/Pyramids.cpp | 69 ++++++++ .../ImgProc/Pyramids/Pyramids.java | 67 ++++++++ .../imgProc/Pyramids/pyramids.py | 51 ++++++ 6 files changed, 297 insertions(+), 120 deletions(-) delete mode 100644 samples/cpp/tutorial_code/ImgProc/Pyramids.cpp create mode 100644 samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp create mode 100644 samples/java/tutorial_code/ImgProc/Pyramids/Pyramids.java create mode 100644 samples/python/tutorial_code/imgProc/Pyramids/pyramids.py diff --git a/doc/tutorials/imgproc/pyramids/pyramids.markdown b/doc/tutorials/imgproc/pyramids/pyramids.markdown index 5210ec007d..b832b22fb8 100644 --- a/doc/tutorials/imgproc/pyramids/pyramids.markdown +++ b/doc/tutorials/imgproc/pyramids/pyramids.markdown @@ -1,12 +1,15 @@ Image Pyramids {#tutorial_pyramids} ============== +@prev_tutorial{tutorial_morph_lines_detection} +@next_tutorial{tutorial_threshold} + Goal ---- In this tutorial you will learn how to: -- Use the OpenCV functions @ref cv::pyrUp and @ref cv::pyrDown to downsample or upsample a given +- Use the OpenCV functions **pyrUp()** and **pyrDown()** to downsample or upsample a given image. Theory @@ -19,7 +22,7 @@ Theory -# *Upsize* the image (zoom in) or -# *Downsize* it (zoom out). - Although there is a *geometric transformation* function in OpenCV that -literally- resize an - image (@ref cv::resize , which we will show in a future tutorial), in this section we analyze + image (**resize** , which we will show in a future tutorial), in this section we analyze first the use of **Image Pyramids**, which are widely applied in a huge range of vision applications. @@ -52,12 +55,12 @@ Theory predecessor. Iterating this process on the input image \f$G_{0}\f$ (original image) produces the entire pyramid. - The procedure above was useful to downsample an image. What if we want to make it bigger?: - columns filled with zeros (\f$0\f$) + columns filled with zeros (\f$0 \f$) - First, upsize the image to twice the original in each dimension, wit the new even rows and - Perform a convolution with the same kernel shown above (multiplied by 4) to approximate the values of the "missing pixels" - These two procedures (downsampling and upsampling as explained above) are implemented by the - OpenCV functions @ref cv::pyrUp and @ref cv::pyrDown , as we will see in an example with the + OpenCV functions **pyrUp()** and **pyrDown()** , as we will see in an example with the code below: @note When we reduce the size of an image, we are actually *losing* information of the image. @@ -65,76 +68,134 @@ Theory Code ---- -This tutorial code's is shown lines below. You can also download it from -[here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgProc/Pyramids.cpp) +This tutorial code's is shown lines below. -@include samples/cpp/tutorial_code/ImgProc/Pyramids.cpp +@add_toggle_cpp +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp) +@include samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp +@end_toggle + +@add_toggle_java +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgProc/Pyramids/Pyramids.java) +@include samples/java/tutorial_code/ImgProc/Pyramids/Pyramids.java +@end_toggle + +@add_toggle_python +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/imgProc/Pyramids/pyramids.py) +@include samples/python/tutorial_code/imgProc/Pyramids/pyramids.py +@end_toggle Explanation ----------- Let's check the general structure of the program: -- Load an image (in this case it is defined in the program, the user does not have to enter it - as an argument) - @snippet cpp/tutorial_code/ImgProc/Pyramids.cpp load +#### Load an image -- Create a Mat object to store the result of the operations (*dst*) and one to save temporal - results (*tmp*). - @code{.cpp} - Mat src, dst, tmp; - /* ... */ - tmp = src; - dst = tmp; - @endcode +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp load +@end_toggle -- Create a window to display the result - @snippet cpp/tutorial_code/ImgProc/Pyramids.cpp create_window +@add_toggle_java +@snippet java/tutorial_code/ImgProc/Pyramids/Pyramids.java load +@end_toggle -- Perform an infinite loop waiting for user input. - @snippet cpp/tutorial_code/ImgProc/Pyramids.cpp infinite_loop +@add_toggle_python +@snippet python/tutorial_code/imgProc/Pyramids/pyramids.py load +@end_toggle - Our program exits if the user presses *ESC*. Besides, it has two options: +#### Create window - - **Perform upsampling (after pressing 'u')** - @snippet cpp/tutorial_code/ImgProc/Pyramids.cpp pyrup - We use the function @ref cv::pyrUp with three arguments: +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp show_image +@end_toggle - - *tmp*: The current image, it is initialized with the *src* original image. - - *dst*: The destination image (to be shown on screen, supposedly the double of the +@add_toggle_java +@snippet java/tutorial_code/ImgProc/Pyramids/Pyramids.java show_image +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/imgProc/Pyramids/pyramids.py show_image +@end_toggle + +#### Loop + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp loop +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgProc/Pyramids/Pyramids.java loop +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/imgProc/Pyramids/pyramids.py loop +@end_toggle + +Perform an infinite loop waiting for user input. +Our program exits if the user presses **ESC**. Besides, it has two options: + +- **Perform upsampling - Zoom 'i'n (after pressing 'i')** + + We use the function **pyrUp()** with three arguments: + - *src*: The current and destination image (to be shown on screen, supposedly the double of the input image) - - *Size( tmp.cols*2, tmp.rows\*2 )\* : The destination size. Since we are upsampling, - @ref cv::pyrUp expects a size double than the input image (in this case *tmp*). - - **Perform downsampling (after pressing 'd')** - @snippet cpp/tutorial_code/ImgProc/Pyramids.cpp pyrdown - Similarly as with @ref cv::pyrUp , we use the function @ref cv::pyrDown with three arguments: + - *Size( tmp.cols*2, tmp.rows\*2 )* : The destination size. Since we are upsampling, + **pyrUp()** expects a size double than the input image (in this case *src*). - - *tmp*: The current image, it is initialized with the *src* original image. - - *dst*: The destination image (to be shown on screen, supposedly half the input - image) - - *Size( tmp.cols/2, tmp.rows/2 )* : The destination size. Since we are upsampling, - @ref cv::pyrDown expects half the size the input image (in this case *tmp*). - - Notice that it is important that the input image can be divided by a factor of two (in - both dimensions). Otherwise, an error will be shown. - - Finally, we update the input image **tmp** with the current image displayed, so the - subsequent operations are performed on it. - @snippet cpp/tutorial_code/ImgProc/Pyramids.cpp update_tmp +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp pyrup +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgProc/Pyramids/Pyramids.java pyrup +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/imgProc/Pyramids/pyramids.py pyrup +@end_toggle + +- **Perform downsampling - Zoom 'o'ut (after pressing 'o')** + + We use the function **pyrDown()** with three arguments (similarly to **pyrUp()**): + - *src*: The current and destination image (to be shown on screen, supposedly half the input + image) + - *Size( tmp.cols/2, tmp.rows/2 )* : The destination size. Since we are upsampling, + **pyrDown()** expects half the size the input image (in this case *src*). + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp pyrdown +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgProc/Pyramids/Pyramids.java pyrdown +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/imgProc/Pyramids/pyramids.py pyrdown +@end_toggle + +Notice that it is important that the input image can be divided by a factor of two (in both dimensions). +Otherwise, an error will be shown. Results ------- -- After compiling the code above we can test it. The program calls an image **chicky_512.jpg** - that comes in the *samples/data* folder. Notice that this image is \f$512 \times 512\f$, +- The program calls by default an image [chicky_512.png](https://raw.githubusercontent.com/opencv/opencv/master/samples/data/chicky_512.png) + that comes in the `samples/data` folder. Notice that this image is \f$512 \times 512\f$, hence a downsample won't generate any error (\f$512 = 2^{9}\f$). The original image is shown below: ![](images/Pyramids_Tutorial_Original_Image.jpg) -- First we apply two successive @ref cv::pyrDown operations by pressing 'd'. Our output is: +- First we apply two successive **pyrDown()** operations by pressing 'd'. Our output is: ![](images/Pyramids_Tutorial_PyrDown_Result.jpg) - Note that we should have lost some resolution due to the fact that we are diminishing the size - of the image. This is evident after we apply @ref cv::pyrUp twice (by pressing 'u'). Our output + of the image. This is evident after we apply **pyrUp()** twice (by pressing 'u'). Our output is now: ![](images/Pyramids_Tutorial_PyrUp_Result.jpg) diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index f4c57cdd62..d25502369a 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -51,6 +51,8 @@ In this section you will learn about the image processing (manipulation) functio - @subpage tutorial_pyramids + *Languages:* C++, Java, Python + *Compatibility:* \> OpenCV 2.0 *Author:* Ana Huamán diff --git a/samples/cpp/tutorial_code/ImgProc/Pyramids.cpp b/samples/cpp/tutorial_code/ImgProc/Pyramids.cpp deleted file mode 100644 index 62c2fe5c01..0000000000 --- a/samples/cpp/tutorial_code/ImgProc/Pyramids.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @file Pyramids.cpp - * @brief Sample code of image pyramids (pyrDown and pyrUp) - * @author OpenCV team - */ - -#include "opencv2/imgproc.hpp" -#include "opencv2/imgcodecs.hpp" -#include "opencv2/highgui.hpp" - -using namespace cv; - -/// Global variables -Mat src, dst, tmp; - -const char* window_name = "Pyramids Demo"; - - -/** - * @function main - */ -int main( void ) -{ - /// General instructions - printf( "\n Zoom In-Out demo \n " ); - printf( "------------------ \n" ); - printf( " * [u] -> Zoom in \n" ); - printf( " * [d] -> Zoom out \n" ); - printf( " * [ESC] -> Close program \n \n" ); - - //![load] - src = imread( "../data/chicky_512.png" ); // Loads the test image - if( src.empty() ) - { printf(" No data! -- Exiting the program \n"); - return -1; } - //![load] - - tmp = src; - dst = tmp; - - //![create_window] - imshow( window_name, dst ); - //![create_window] - - //![infinite_loop] - for(;;) - { - char c = (char)waitKey(0); - - if( c == 27 ) - { break; } - //![pyrup] - if( c == 'u' ) - { pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) ); - printf( "** Zoom In: Image x 2 \n" ); - } - //![pyrup] - //![pyrdown] - else if( c == 'd' ) - { pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) ); - printf( "** Zoom Out: Image / 2 \n" ); - } - //![pyrdown] - imshow( window_name, dst ); - - //![update_tmp] - tmp = dst; - //![update_tmp] - } - //![infinite_loop] - - return 0; -} diff --git a/samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp b/samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp new file mode 100644 index 0000000000..1cc7bf2edc --- /dev/null +++ b/samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp @@ -0,0 +1,69 @@ +/** + * @file Pyramids.cpp + * @brief Sample code of image pyramids (pyrDown and pyrUp) + * @author OpenCV team + */ + +#include "iostream" +#include "opencv2/imgproc.hpp" +#include "opencv2/imgcodecs.hpp" +#include "opencv2/highgui.hpp" + +using namespace std; +using namespace cv; + +const char* window_name = "Pyramids Demo"; + +/** + * @function main + */ +int main( int argc, char** argv ) +{ + /// General instructions + cout << "\n Zoom In-Out demo \n " + "------------------ \n" + " * [i] -> Zoom in \n" + " * [o] -> Zoom out \n" + " * [ESC] -> Close program \n" << endl; + + //![load] + const char* filename = argc >=2 ? argv[1] : "../data/chicky_512.png"; + + // Loads an image + Mat src = imread( filename ); + + // Check if image is loaded fine + if(src.empty()){ + printf(" Error opening image\n"); + printf(" Program Arguments: [image_name -- default ../data/chicky_512.png] \n"); + return -1; + } + //![load] + + //![loop] + for(;;) + { + //![show_image] + imshow( window_name, src ); + //![show_image] + char c = (char)waitKey(0); + + if( c == 27 ) + { break; } + //![pyrup] + else if( c == 'i' ) + { pyrUp( src, src, Size( src.cols*2, src.rows*2 ) ); + printf( "** Zoom In: Image x 2 \n" ); + } + //![pyrup] + //![pyrdown] + else if( c == 'o' ) + { pyrDown( src, src, Size( src.cols/2, src.rows/2 ) ); + printf( "** Zoom Out: Image / 2 \n" ); + } + //![pyrdown] + } + //![loop] + + return 0; +} diff --git a/samples/java/tutorial_code/ImgProc/Pyramids/Pyramids.java b/samples/java/tutorial_code/ImgProc/Pyramids/Pyramids.java new file mode 100644 index 0000000000..b4ada166b2 --- /dev/null +++ b/samples/java/tutorial_code/ImgProc/Pyramids/Pyramids.java @@ -0,0 +1,67 @@ +import org.opencv.core.*; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +class PyramidsRun { + + String window_name = "Pyramids Demo"; + + public void run(String[] args) { + /// General instructions + System.out.println("\n" + + " Zoom In-Out demo \n" + + "------------------ \n" + + " * [i] -> Zoom [i]n \n" + + " * [o] -> Zoom [o]ut \n" + + " * [ESC] -> Close program \n"); + + //! [load] + String filename = ((args.length > 0) ? args[0] : "../data/chicky_512.png"); + + // Load the image + Mat src = Imgcodecs.imread(filename); + + // Check if image is loaded fine + if( src.empty() ) { + System.out.println("Error opening image!"); + System.out.println("Program Arguments: [image_name -- default ../data/chicky_512.png] \n"); + System.exit(-1); + } + //! [load] + + //! [loop] + while (true){ + //! [show_image] + HighGui.imshow( window_name, src ); + //! [show_image] + char c = (char) HighGui.waitKey(0); + c = Character.toLowerCase(c); + + if( c == 27 ){ + break; + //![pyrup] + }else if( c == 'i'){ + Imgproc.pyrUp( src, src, new Size( src.cols()*2, src.rows()*2 ) ); + System.out.println( "** Zoom In: Image x 2" ); + //![pyrup] + //![pyrdown] + }else if( c == 'o'){ + Imgproc.pyrDown( src, src, new Size( src.cols()/2, src.rows()/2 ) ); + System.out.println( "** Zoom Out: Image / 2" ); + //![pyrdown] + } + } + //! [loop] + + System.exit(0); + } +} + +public class Pyramids { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new PyramidsRun().run(args); + } +} diff --git a/samples/python/tutorial_code/imgProc/Pyramids/pyramids.py b/samples/python/tutorial_code/imgProc/Pyramids/pyramids.py new file mode 100644 index 0000000000..127345a6e0 --- /dev/null +++ b/samples/python/tutorial_code/imgProc/Pyramids/pyramids.py @@ -0,0 +1,51 @@ +import sys +import cv2 + + +def main(argv): + print(""" + Zoom In-Out demo + ------------------ + * [i] -> Zoom [i]n + * [o] -> Zoom [o]ut + * [ESC] -> Close program + """) + ## [load] + filename = argv[0] if len(argv) > 0 else "../data/chicky_512.png" + + # Load the image + src = cv2.imread(filename) + + # Check if image is loaded fine + if src is None: + print ('Error opening image!') + print ('Usage: pyramids.py [image_name -- default ../data/chicky_512.png] \n') + return -1 + ## [load] + ## [loop] + while 1: + rows, cols, _channels = map(int, src.shape) + ## [show_image] + cv2.imshow('Pyramids Demo', src) + ## [show_image] + k = cv2.waitKey(0) + + if k == 27: + break + ## [pyrup] + elif chr(k) == 'i': + src = cv2.pyrUp(src, dstsize=(2 * cols, 2 * rows)) + print ('** Zoom In: Image x 2') + ## [pyrup] + ## [pyrdown] + elif chr(k) == 'o': + src = cv2.pyrDown(src, dstsize=(cols // 2, rows // 2)) + print ('** Zoom Out: Image / 2') + ## [pyrdown] + ## [loop] + + cv2.destroyAllWindows() + return 0 + +if __name__ == "__main__": + main(sys.argv[1:]) From a6f5e1f0caa486a84099a0ad121b1e602d0e54d9 Mon Sep 17 00:00:00 2001 From: tribta Date: Thu, 24 Aug 2017 16:22:27 +0100 Subject: [PATCH 07/10] Tutorial Filter2D --- .../imgtrans/filter_2d/filter_2d.markdown | 151 +++++++++++++----- .../imgproc/table_of_content_imgproc.markdown | 2 + .../tutorial_code/ImgTrans/filter2D_demo.cpp | 92 ++++++----- .../ImgTrans/Filter2D/Filter2D_Demo.java | 81 ++++++++++ .../ImgTrans/Filter2D/filter2D.py | 54 +++++++ 5 files changed, 295 insertions(+), 85 deletions(-) create mode 100644 samples/java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java create mode 100644 samples/python/tutorial_code/ImgTrans/Filter2D/filter2D.py diff --git a/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.markdown b/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.markdown index 5716410d39..454f745177 100644 --- a/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.markdown +++ b/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.markdown @@ -1,12 +1,15 @@ Making your own linear filters! {#tutorial_filter_2d} =============================== +@prev_tutorial{tutorial_threshold_inRange} +@next_tutorial{tutorial_copyMakeBorder} + Goal ---- In this tutorial you will learn how to: -- Use the OpenCV function @ref cv::filter2D to create your own linear filters. +- Use the OpenCV function **filter2D()** to create your own linear filters. Theory ------ @@ -40,61 +43,127 @@ Expressing the procedure above in the form of an equation we would have: \f[H(x,y) = \sum_{i=0}^{M_{i} - 1} \sum_{j=0}^{M_{j}-1} I(x+i - a_{i}, y + j - a_{j})K(i,j)\f] -Fortunately, OpenCV provides you with the function @ref cv::filter2D so you do not have to code all +Fortunately, OpenCV provides you with the function **filter2D()** so you do not have to code all these operations. +### What does this program do? +- Loads an image +- Performs a *normalized box filter*. For instance, for a kernel of size \f$size = 3\f$, the + kernel would be: + +\f[K = \dfrac{1}{3 \cdot 3} \begin{bmatrix} +1 & 1 & 1 \\ + 1 & 1 & 1 \\ + 1 & 1 & 1 +\end{bmatrix}\f] + +The program will perform the filter operation with kernels of sizes 3, 5, 7, 9 and 11. + +- The filter output (with each kernel) will be shown during 500 milliseconds + Code ---- --# **What does this program do?** - - Loads an image - - Performs a *normalized box filter*. For instance, for a kernel of size \f$size = 3\f$, the - kernel would be: +The tutorial code's is shown in the lines below. - \f[K = \dfrac{1}{3 \cdot 3} \begin{bmatrix} - 1 & 1 & 1 \\ - 1 & 1 & 1 \\ - 1 & 1 & 1 - \end{bmatrix}\f] +@add_toggle_cpp +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/filter2D_demo.cpp) +@include cpp/tutorial_code/ImgTrans/filter2D_demo.cpp +@end_toggle - The program will perform the filter operation with kernels of sizes 3, 5, 7, 9 and 11. +@add_toggle_java +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java) +@include java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java +@end_toggle - - The filter output (with each kernel) will be shown during 500 milliseconds - --# The tutorial code's is shown lines below. You can also download it from - [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/filter2D_demo.cpp) - @include cpp/tutorial_code/ImgTrans/filter2D_demo.cpp +@add_toggle_python +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/ImgTrans/Filter2D/filter2D.py) +@include python/tutorial_code/ImgTrans/Filter2D/filter2D.py +@end_toggle Explanation ----------- --# Load an image - @snippet cpp/tutorial_code/ImgTrans/filter2D_demo.cpp load --# Initialize the arguments for the linear filter - @snippet cpp/tutorial_code/ImgTrans/filter2D_demo.cpp init_arguments --# Perform an infinite loop updating the kernel size and applying our linear filter to the input - image. Let's analyze that more in detail: --# First we define the kernel our filter is going to use. Here it is: - @snippet cpp/tutorial_code/ImgTrans/filter2D_demo.cpp update_kernel - The first line is to update the *kernel_size* to odd values in the range: \f$[3,11]\f$. The second - line actually builds the kernel by setting its value to a matrix filled with \f$1's\f$ and - normalizing it by dividing it between the number of elements. +#### Load an image --# After setting the kernel, we can generate the filter by using the function @ref cv::filter2D : - @snippet cpp/tutorial_code/ImgTrans/filter2D_demo.cpp apply_filter - The arguments denote: +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/filter2D_demo.cpp load +@end_toggle - -# *src*: Source image - -# *dst*: Destination image - -# *ddepth*: The depth of *dst*. A negative value (such as \f$-1\f$) indicates that the depth is +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java load +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/Filter2D/filter2D.py load +@end_toggle + +#### Initialize the arguments + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/filter2D_demo.cpp init_arguments +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java init_arguments +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/Filter2D/filter2D.py init_arguments +@end_toggle + +##### Loop + +Perform an infinite loop updating the kernel size and applying our linear filter to the input +image. Let's analyze that more in detail: + +- First we define the kernel our filter is going to use. Here it is: + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/filter2D_demo.cpp update_kernel +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java update_kernel +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/Filter2D/filter2D.py update_kernel +@end_toggle + +The first line is to update the *kernel_size* to odd values in the range: \f$[3,11]\f$. +The second line actually builds the kernel by setting its value to a matrix filled with +\f$1's\f$ and normalizing it by dividing it between the number of elements. + +- After setting the kernel, we can generate the filter by using the function **filter2D()** : + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/filter2D_demo.cpp apply_filter +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java apply_filter +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/Filter2D/filter2D.py apply_filter +@end_toggle + +- The arguments denote: + - *src*: Source image + - *dst*: Destination image + - *ddepth*: The depth of *dst*. A negative value (such as \f$-1\f$) indicates that the depth is the same as the source. - -# *kernel*: The kernel to be scanned through the image - -# *anchor*: The position of the anchor relative to its kernel. The location *Point(-1, -1)* - indicates the center by default. - -# *delta*: A value to be added to each pixel during the correlation. By default it is \f$0\f$ - -# *BORDER_DEFAULT*: We let this value by default (more details in the following tutorial) + - *kernel*: The kernel to be scanned through the image + - *anchor*: The position of the anchor relative to its kernel. The location *Point(-1, -1)* + indicates the center by default. + - *delta*: A value to be added to each pixel during the correlation. By default it is \f$0\f$ + - *BORDER_DEFAULT*: We let this value by default (more details in the following tutorial) --# Our program will effectuate a *while* loop, each 500 ms the kernel size of our filter will be +- Our program will effectuate a *while* loop, each 500 ms the kernel size of our filter will be updated in the range indicated. Results @@ -104,4 +173,4 @@ Results result should be a window that shows an image blurred by a normalized filter. Each 0.5 seconds the kernel size should change, as can be seen in the series of snapshots below: - ![](images/filter_2d_tutorial_result.jpg) +![](images/filter_2d_tutorial_result.jpg) diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index d25502369a..5dd3d57c02 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -77,6 +77,8 @@ In this section you will learn about the image processing (manipulation) functio - @subpage tutorial_filter_2d + *Languages:* C++, Java, Python + *Compatibility:* \> OpenCV 2.0 *Author:* Ana Huamán diff --git a/samples/cpp/tutorial_code/ImgTrans/filter2D_demo.cpp b/samples/cpp/tutorial_code/ImgTrans/filter2D_demo.cpp index 24aef46b97..3b7f3a96b5 100644 --- a/samples/cpp/tutorial_code/ImgTrans/filter2D_demo.cpp +++ b/samples/cpp/tutorial_code/ImgTrans/filter2D_demo.cpp @@ -15,56 +15,60 @@ using namespace cv; */ int main ( int argc, char** argv ) { - /// Declare variables - Mat src, dst; + // Declare variables + Mat src, dst; - Mat kernel; - Point anchor; - double delta; - int ddepth; - int kernel_size; - const char* window_name = "filter2D Demo"; + Mat kernel; + Point anchor; + double delta; + int ddepth; + int kernel_size; + const char* window_name = "filter2D Demo"; - //![load] - String imageName("../data/lena.jpg"); // by default - if (argc > 1) - { - imageName = argv[1]; - } - src = imread( imageName, IMREAD_COLOR ); // Load an image + //![load] + const char* imageName = argc >=2 ? argv[1] : "../data/lena.jpg"; - if( src.empty() ) - { return -1; } - //![load] + // Loads an image + src = imread( imageName, IMREAD_COLOR ); // Load an image - //![init_arguments] - /// Initialize arguments for the filter - anchor = Point( -1, -1 ); - delta = 0; - ddepth = -1; - //![init_arguments] + if( src.empty() ) + { + printf(" Error opening image\n"); + printf(" Program Arguments: [image_name -- default ../data/lena.jpg] \n"); + return -1; + } + //![load] - /// Loop - Will filter the image with different kernel sizes each 0.5 seconds - int ind = 0; - for(;;) - { - char c = (char)waitKey(500); - /// Press 'ESC' to exit the program - if( c == 27 ) - { break; } + //![init_arguments] + // Initialize arguments for the filter + anchor = Point( -1, -1 ); + delta = 0; + ddepth = -1; + //![init_arguments] - //![update_kernel] - /// Update kernel size for a normalized box filter - kernel_size = 3 + 2*( ind%5 ); - kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size); - //![update_kernel] + // Loop - Will filter the image with different kernel sizes each 0.5 seconds + int ind = 0; + for(;;) + { + //![update_kernel] + // Update kernel size for a normalized box filter + kernel_size = 3 + 2*( ind%5 ); + kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size); + //![update_kernel] - //![apply_filter] - filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT ); - //![apply_filter] - imshow( window_name, dst ); - ind++; - } + //![apply_filter] + // Apply filter + filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT ); + //![apply_filter] + imshow( window_name, dst ); - return 0; + char c = (char)waitKey(500); + // Press 'ESC' to exit the program + if( c == 27 ) + { break; } + + ind++; + } + + return 0; } diff --git a/samples/java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java b/samples/java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java new file mode 100644 index 0000000000..aa685d9afe --- /dev/null +++ b/samples/java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java @@ -0,0 +1,81 @@ +/** + * @file Filter2D_demo.java + * @brief Sample code that shows how to implement your own linear filters by using filter2D function + */ + +import org.opencv.core.*; +import org.opencv.core.Point; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +class Filter2D_DemoRun { + + public void run(String[] args) { + // Declare variables + Mat src, dst = new Mat(); + + Mat kernel = new Mat(); + Point anchor; + double delta; + int ddepth; + int kernel_size; + String window_name = "filter2D Demo"; + + //! [load] + String imageName = ((args.length > 0) ? args[0] : "../data/lena.jpg"); + + // Load an image + src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR); + + // Check if image is loaded fine + if( src.empty() ) { + System.out.println("Error opening image!"); + System.out.println("Program Arguments: [image_name -- default ../data/lena.jpg] \n"); + System.exit(-1); + } + //! [load] + + //! [init_arguments] + // Initialize arguments for the filter + anchor = new Point( -1, -1); + delta = 0.0; + ddepth = -1; + //! [init_arguments] + + // Loop - Will filter the image with different kernel sizes each 0.5 seconds + int ind = 0; + while( true ) + { + //! [update_kernel] + // Update kernel size for a normalized box filter + kernel_size = 3 + 2*( ind%5 ); + Mat ones = Mat.ones( kernel_size, kernel_size, CvType.CV_32F ); + Core.multiply(ones, new Scalar(1/(double)(kernel_size*kernel_size)), kernel); + //! [update_kernel] + + //! [apply_filter] + // Apply filter + Imgproc.filter2D(src, dst, ddepth , kernel, anchor, delta, Core.BORDER_DEFAULT ); + //! [apply_filter] + HighGui.imshow( window_name, dst ); + + int c = HighGui.waitKey(500); + // Press 'ESC' to exit the program + if( c == 27 ) + { break; } + + ind++; + } + + System.exit(0); + } +} + +public class Filter2D_Demo { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new Filter2D_DemoRun().run(args); + } +} diff --git a/samples/python/tutorial_code/ImgTrans/Filter2D/filter2D.py b/samples/python/tutorial_code/ImgTrans/Filter2D/filter2D.py new file mode 100644 index 0000000000..e4d1afe590 --- /dev/null +++ b/samples/python/tutorial_code/ImgTrans/Filter2D/filter2D.py @@ -0,0 +1,54 @@ +""" +@file filter2D.py +@brief Sample code that shows how to implement your own linear filters by using filter2D function +""" +import sys +import cv2 +import numpy as np + + +def main(argv): + window_name = 'filter2D Demo' + + ## [load] + imageName = argv[0] if len(argv) > 0 else "../data/lena.jpg" + + # Loads an image + src = cv2.imread(imageName, cv2.IMREAD_COLOR) + + # Check if image is loaded fine + if src is None: + print ('Error opening image!') + print ('Usage: filter2D.py [image_name -- default ../data/lena.jpg] \n') + return -1 + ## [load] + ## [init_arguments] + # Initialize ddepth argument for the filter + ddepth = -1 + ## [init_arguments] + # Loop - Will filter the image with different kernel sizes each 0.5 seconds + ind = 0 + while True: + ## [update_kernel] + # Update kernel size for a normalized box filter + kernel_size = 3 + 2 * (ind % 5) + kernel = np.ones((kernel_size, kernel_size), dtype=np.float32) + kernel /= (kernel_size * kernel_size) + ## [update_kernel] + ## [apply_filter] + # Apply filter + dst = cv2.filter2D(src, ddepth, kernel) + ## [apply_filter] + cv2.imshow(window_name, dst) + + c = cv2.waitKey(500) + if c == 27: + break + + ind += 1 + + return 0 + + +if __name__ == "__main__": + main(sys.argv[1:]) From 9ff33dacfc71e28ef2799270fb840c9899a6c25a Mon Sep 17 00:00:00 2001 From: tribta Date: Fri, 25 Aug 2017 19:44:55 +0100 Subject: [PATCH 08/10] Tutorial Make Border --- .../copyMakeBorder/copyMakeBorder.markdown | 190 +++++++++++++++--- .../imgproc/table_of_content_imgproc.markdown | 2 + .../ImgTrans/copyMakeBorder_demo.cpp | 101 +++++----- .../ImgTrans/MakeBorder/CopyMakeBorder.java | 94 +++++++++ .../ImgTrans/MakeBorder/copy_make_border.py | 69 +++++++ 5 files changed, 373 insertions(+), 83 deletions(-) create mode 100644 samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java create mode 100644 samples/python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py diff --git a/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.markdown b/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.markdown index 6b6efdf125..8a4bbc0702 100644 --- a/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.markdown +++ b/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.markdown @@ -1,12 +1,15 @@ Adding borders to your images {#tutorial_copyMakeBorder} ============================= +@prev_tutorial{tutorial_filter_2d} +@next_tutorial{tutorial_sobel_derivatives} + Goal ---- In this tutorial you will learn how to: -- Use the OpenCV function @ref cv::copyMakeBorder to set the borders (extra padding to your +- Use the OpenCV function **copyMakeBorder()** to set the borders (extra padding to your image). Theory @@ -30,10 +33,7 @@ Theory This will be seen more clearly in the Code section. -Code ----- - --# **What does this program do?** +- **What does this program do?** - Load an image - Let the user choose what kind of padding use in the input image. There are two options: @@ -45,38 +45,153 @@ Code The user chooses either option by pressing 'c' (constant) or 'r' (replicate) - The program finishes when the user presses 'ESC' --# The tutorial code's is shown lines below. You can also download it from - [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp) - @include samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp +Code +---- + +The tutorial code's is shown lines below. + +@add_toggle_cpp +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp) +@include samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp +@end_toggle + +@add_toggle_java +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java) +@include samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java +@end_toggle + +@add_toggle_python +You can also download it from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py) +@include samples/python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py +@end_toggle Explanation ----------- --# First we declare the variables we are going to use: - @snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp variables +#### Declare the variables - Especial attention deserves the variable *rng* which is a random number generator. We use it to - generate the random border color, as we will see soon. +First we declare the variables we are going to use: --# As usual we load our source image *src*: - @snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp load +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp variables +@end_toggle --# After giving a short intro of how to use the program, we create a window: - @snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp create_window --# Now we initialize the argument that defines the size of the borders (*top*, *bottom*, *left* and - *right*). We give them a value of 5% the size of *src*. - @snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp init_arguments --# The program runs in a **for** loop. If the user presses 'c' or 'r', the *borderType* variable - takes the value of *BORDER_CONSTANT* or *BORDER_REPLICATE* respectively: - @snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp check_keypress --# In each iteration (after 0.5 seconds), the variable *value* is updated... - @snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp update_value - with a random value generated by the **RNG** variable *rng*. This value is a number picked - randomly in the range \f$[0,255]\f$ +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java variables +@end_toggle --# Finally, we call the function @ref cv::copyMakeBorder to apply the respective padding: - @snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp copymakeborder - The arguments are: +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py variables +@end_toggle + +Especial attention deserves the variable *rng* which is a random number generator. We use it to +generate the random border color, as we will see soon. + +#### Load an image + +As usual we load our source image *src*: + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp load +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java load +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py load +@end_toggle + +#### Create a window + +After giving a short intro of how to use the program, we create a window: + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp create_window +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java create_window +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py create_window +@end_toggle + +#### Initialize arguments + +Now we initialize the argument that defines the size of the borders (*top*, *bottom*, *left* and +*right*). We give them a value of 5% the size of *src*. + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp init_arguments +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java init_arguments +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py init_arguments +@end_toggle + +#### Loop + +The program runs in an infinite loop while the key **ESC** isn't pressed. +If the user presses '**c**' or '**r**', the *borderType* variable +takes the value of *BORDER_CONSTANT* or *BORDER_REPLICATE* respectively: + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp check_keypress +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java check_keypress +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py check_keypress +@end_toggle + +#### Random color + +In each iteration (after 0.5 seconds), the random border color (*value*) is updated... + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp update_value +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java update_value +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py update_value +@end_toggle + +This value is a set of three numbers picked randomly in the range \f$[0,255]\f$. + +#### Form a border around the image + +Finally, we call the function **copyMakeBorder()** to apply the respective padding: + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp copymakeborder +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java copymakeborder +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py copymakeborder +@end_toggle + +- The arguments are: -# *src*: Source image -# *dst*: Destination image @@ -87,8 +202,21 @@ Explanation -# *value*: If *borderType* is *BORDER_CONSTANT*, this is the value used to fill the border pixels. --# We display our output image in the image created previously - @snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp display +#### Display the results + +We display our output image in the image created previously + +@add_toggle_cpp +@snippet cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp display +@end_toggle + +@add_toggle_java +@snippet java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java display +@end_toggle + +@add_toggle_python +@snippet python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py display +@end_toggle Results ------- diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index 5dd3d57c02..d91ec4a953 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -87,6 +87,8 @@ In this section you will learn about the image processing (manipulation) functio - @subpage tutorial_copyMakeBorder + *Languages:* C++, Java, Python + *Compatibility:* \> OpenCV 2.0 *Author:* Ana Huamán diff --git a/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp b/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp index ca78078eea..52c7610389 100644 --- a/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp +++ b/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp @@ -11,9 +11,10 @@ using namespace cv; //![variables] +// Declare the variables Mat src, dst; int top, bottom, left, right; -int borderType; +int borderType = BORDER_CONSTANT; const char* window_name = "copyMakeBorder Demo"; RNG rng(12345); //![variables] @@ -23,65 +24,61 @@ RNG rng(12345); */ int main( int argc, char** argv ) { - //![load] - String imageName("../data/lena.jpg"); // by default - if (argc > 1) - { - imageName = argv[1]; - } - src = imread( imageName, IMREAD_COLOR ); // Load an image + //![load] + const char* imageName = argc >=2 ? argv[1] : "../data/lena.jpg"; - if( src.empty() ) - { - printf(" No data entered, please enter the path to an image file \n"); - return -1; + // Loads an image + src = imread( imageName, IMREAD_COLOR ); // Load an image + + // Check if image is loaded fine + if( src.empty()) { + printf(" Error opening image\n"); + printf(" Program Arguments: [image_name -- default ../data/lena.jpg] \n"); + return -1; } - //![load] + //![load] - /// Brief how-to for this program - printf( "\n \t copyMakeBorder Demo: \n" ); - printf( "\t -------------------- \n" ); - printf( " ** Press 'c' to set the border to a random constant value \n"); - printf( " ** Press 'r' to set the border to be replicated \n"); - printf( " ** Press 'ESC' to exit the program \n"); + // Brief how-to for this program + printf( "\n \t copyMakeBorder Demo: \n" ); + printf( "\t -------------------- \n" ); + printf( " ** Press 'c' to set the border to a random constant value \n"); + printf( " ** Press 'r' to set the border to be replicated \n"); + printf( " ** Press 'ESC' to exit the program \n"); - //![create_window] - namedWindow( window_name, WINDOW_AUTOSIZE ); - //![create_window] + //![create_window] + namedWindow( window_name, WINDOW_AUTOSIZE ); + //![create_window] - //![init_arguments] - /// Initialize arguments for the filter - top = (int) (0.05*src.rows); bottom = (int) (0.05*src.rows); - left = (int) (0.05*src.cols); right = (int) (0.05*src.cols); - //![init_arguments] + //![init_arguments] + // Initialize arguments for the filter + top = (int) (0.05*src.rows); bottom = top; + left = (int) (0.05*src.cols); right = left; + //![init_arguments] - dst = src; - imshow( window_name, dst ); + for(;;) + { + //![update_value] + Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) ); + //![update_value] - for(;;) - { - //![check_keypress] - char c = (char)waitKey(500); - if( c == 27 ) - { break; } - else if( c == 'c' ) - { borderType = BORDER_CONSTANT; } - else if( c == 'r' ) - { borderType = BORDER_REPLICATE; } - //![check_keypress] + //![copymakeborder] + copyMakeBorder( src, dst, top, bottom, left, right, borderType, value ); + //![copymakeborder] - //![update_value] - Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) ); - //![update_value] + //![display] + imshow( window_name, dst ); + //![display] - //![copymakeborder] - copyMakeBorder( src, dst, top, bottom, left, right, borderType, value ); - //![copymakeborder] + //![check_keypress] + char c = (char)waitKey(500); + if( c == 27 ) + { break; } + else if( c == 'c' ) + { borderType = BORDER_CONSTANT; } + else if( c == 'r' ) + { borderType = BORDER_REPLICATE; } + //![check_keypress] + } - //![display] - imshow( window_name, dst ); - //![display] - } - - return 0; + return 0; } diff --git a/samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java b/samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java new file mode 100644 index 0000000000..8fffced2a6 --- /dev/null +++ b/samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java @@ -0,0 +1,94 @@ +/** + * @file CopyMakeBorder.java + * @brief Sample code that shows the functionality of copyMakeBorder + */ + +import org.opencv.core.*; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; + +import java.util.Random; + +class CopyMakeBorderRun { + + public void run(String[] args) { + + //! [variables] + // Declare the variables + Mat src, dst = new Mat(); + int top, bottom, left, right; + int borderType = Core.BORDER_CONSTANT; + String window_name = "copyMakeBorder Demo"; + Random rng; + //! [variables] + + //! [load] + String imageName = ((args.length > 0) ? args[0] : "../data/lena.jpg"); + + // Load an image + src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR); + + // Check if image is loaded fine + if( src.empty() ) { + System.out.println("Error opening image!"); + System.out.println("Program Arguments: [image_name -- default ../data/lena.jpg] \n"); + System.exit(-1); + } + //! [load] + + // Brief how-to for this program + System.out.println("\n" + + "\t copyMakeBorder Demo: \n" + + "\t -------------------- \n" + + " ** Press 'c' to set the border to a random constant value \n" + + " ** Press 'r' to set the border to be replicated \n" + + " ** Press 'ESC' to exit the program \n"); + + //![create_window] + HighGui.namedWindow( window_name, HighGui.WINDOW_AUTOSIZE ); + //![create_window] + + //! [init_arguments] + // Initialize arguments for the filter + top = (int) (0.05*src.rows()); bottom = top; + left = (int) (0.05*src.cols()); right = left; + //! [init_arguments] + + while( true ) { + //! [update_value] + rng = new Random(); + Scalar value = new Scalar( rng.nextInt(256), + rng.nextInt(256), rng.nextInt(256) ); + //! [update_value] + + //! [copymakeborder] + Core.copyMakeBorder( src, dst, top, bottom, left, right, borderType, value); + //! [copymakeborder] + //! [display] + HighGui.imshow( window_name, dst ); + //! [display] + + //![check_keypress] + char c = (char) HighGui.waitKey(500); + c = Character.toLowerCase(c); + + if( c == 27 ) + { break; } + else if( c == 'c' ) + { borderType = Core.BORDER_CONSTANT;} + else if( c == 'r' ) + { borderType = Core.BORDER_REPLICATE;} + //![check_keypress] + } + + System.exit(0); + } +} + +public class CopyMakeBorder { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new CopyMakeBorderRun().run(args); + } +} diff --git a/samples/python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py b/samples/python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py new file mode 100644 index 0000000000..36b4e131a0 --- /dev/null +++ b/samples/python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py @@ -0,0 +1,69 @@ +""" +@file copy_make_border.py +@brief Sample code that shows the functionality of copyMakeBorder +""" +import sys +from random import randint +import cv2 + + +def main(argv): + ## [variables] + # First we declare the variables we are going to use + borderType = cv2.BORDER_CONSTANT + window_name = "copyMakeBorder Demo" + ## [variables] + ## [load] + imageName = argv[0] if len(argv) > 0 else "../data/lena.jpg" + + # Loads an image + src = cv2.imread(imageName, cv2.IMREAD_COLOR) + + # Check if image is loaded fine + if src is None: + print ('Error opening image!') + print ('Usage: copy_make_border.py [image_name -- default ../data/lena.jpg] \n') + return -1 + ## [load] + # Brief how-to for this program + print ('\n' + '\t copyMakeBorder Demo: \n' + ' -------------------- \n' + ' ** Press \'c\' to set the border to a random constant value \n' + ' ** Press \'r\' to set the border to be replicated \n' + ' ** Press \'ESC\' to exit the program ') + ## [create_window] + cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE) + ## [create_window] + ## [init_arguments] + # Initialize arguments for the filter + top = int(0.05 * src.shape[0]) # shape[0] = rows + bottom = top + left = int(0.05 * src.shape[1]) # shape[1] = cols + right = left + ## [init_arguments] + while 1: + ## [update_value] + value = [randint(0, 255), randint(0, 255), randint(0, 255)] + ## [update_value] + ## [copymakeborder] + dst = cv2.copyMakeBorder(src, top, bottom, left, right, borderType, None, value) + ## [copymakeborder] + ## [display] + cv2.imshow(window_name, dst) + ## [display] + ## [check_keypress] + c = cv2.waitKey(500) + + if c == 27: + break + elif c == 99: # 99 = ord('c') + borderType = cv2.BORDER_CONSTANT + elif c == 114: # 114 = ord('r') + borderType = cv2.BORDER_REPLICATE + ## [check_keypress] + return 0 + + +if __name__ == "__main__": + main(sys.argv[1:]) From d99ced6ec85194ce196fb671f084d3980bb7018e Mon Sep 17 00:00:00 2001 From: tribta Date: Sat, 26 Aug 2017 15:11:46 +0100 Subject: [PATCH 09/10] Tutorial Hough Circles --- .../hough_circle/hough_circle.markdown | 139 +++++++++++++++--- .../images/Hough_Circle_Tutorial_Result.png | Bin 0 -> 78617 bytes .../imgproc/table_of_content_imgproc.markdown | 2 + samples/cpp/houghcircles.cpp | 71 --------- .../tutorial_code/ImgTrans/houghcircles.cpp | 65 ++++++++ samples/data/smarties.png | Bin 0 -> 90815 bytes .../ImgTrans/HoughCircle/HoughCircles.java | 77 ++++++++++ .../ImgTrans/HoughCircle/hough_circle.py | 59 ++++++++ 8 files changed, 318 insertions(+), 95 deletions(-) create mode 100644 doc/tutorials/imgproc/imgtrans/hough_circle/images/Hough_Circle_Tutorial_Result.png delete mode 100644 samples/cpp/houghcircles.cpp create mode 100644 samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp create mode 100644 samples/data/smarties.png create mode 100644 samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java create mode 100644 samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py diff --git a/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.markdown b/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.markdown index 36c03cd143..fe2f88be15 100644 --- a/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.markdown +++ b/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.markdown @@ -1,12 +1,15 @@ Hough Circle Transform {#tutorial_hough_circle} ====================== +@prev_tutorial{tutorial_hough_lines} +@next_tutorial{tutorial_remap} + Goal ---- In this tutorial you will learn how to: -- Use the OpenCV function @ref cv::HoughCircles to detect circles in an image. +- Use the OpenCV function **HoughCircles()** to detect circles in an image. Theory ------ @@ -31,31 +34,96 @@ Theory the best radius for each candidate center. For more details, please check the book *Learning OpenCV* or your favorite Computer Vision bibliography +#### What does this program do? +- Loads an image and blur it to reduce the noise +- Applies the *Hough Circle Transform* to the blurred image . +- Display the detected circle in a window. + Code ---- --# **What does this program do?** - - Loads an image and blur it to reduce the noise - - Applies the *Hough Circle Transform* to the blurred image . - - Display the detected circle in a window. +@add_toggle_cpp +The sample code that we will explain can be downloaded from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp). +A slightly fancier version (which shows trackbars for changing the threshold values) can be found +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/HoughCircle_Demo.cpp). +@include samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp +@end_toggle --# The sample code that we will explain can be downloaded from [here](https://github.com/opencv/opencv/tree/master/samples/cpp/houghcircles.cpp). - A slightly fancier version (which shows trackbars for - changing the threshold values) can be found [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/HoughCircle_Demo.cpp). - @include samples/cpp/houghcircles.cpp +@add_toggle_java +The sample code that we will explain can be downloaded from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java). +@include samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java +@end_toggle + +@add_toggle_python +The sample code that we will explain can be downloaded from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py). +@include samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py +@end_toggle Explanation ----------- --# Load an image - @snippet samples/cpp/houghcircles.cpp load --# Convert it to grayscale: - @snippet samples/cpp/houghcircles.cpp convert_to_gray --# Apply a Median blur to reduce noise and avoid false circle detection: - @snippet samples/cpp/houghcircles.cpp reduce_noise --# Proceed to apply Hough Circle Transform: - @snippet samples/cpp/houghcircles.cpp houghcircles - with the arguments: +The image we used can be found [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/data/smarties.png) + +#### Load an image: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp load +@end_toggle + +@add_toggle_java +@snippet samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py load +@end_toggle + +@add_toggle_python +@snippet samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java load +@end_toggle + +#### Convert it to grayscale: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp convert_to_gray +@end_toggle + +@add_toggle_java +@snippet samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py convert_to_gray +@end_toggle + +@add_toggle_python +@snippet samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java convert_to_gray +@end_toggle + +#### Apply a Median blur to reduce noise and avoid false circle detection: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp reduce_noise +@end_toggle + +@add_toggle_java +@snippet samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py reduce_noise +@end_toggle + +@add_toggle_python +@snippet samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java reduce_noise +@end_toggle + +#### Proceed to apply Hough Circle Transform: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp houghcircles +@end_toggle + +@add_toggle_java +@snippet samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py houghcircles +@end_toggle + +@add_toggle_python +@snippet samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java houghcircles +@end_toggle + +- with the arguments: - *gray*: Input image (grayscale). - *circles*: A vector that stores sets of 3 values: \f$x_{c}, y_{c}, r\f$ for each detected @@ -69,16 +137,39 @@ Explanation - *min_radius = 0*: Minimum radius to be detected. If unknown, put zero as default. - *max_radius = 0*: Maximum radius to be detected. If unknown, put zero as default. --# Draw the detected circles: - @snippet samples/cpp/houghcircles.cpp draw - You can see that we will draw the circle(s) on red and the center(s) with a small green dot +#### Draw the detected circles: --# Display the detected circle(s) and wait for the user to exit the program: - @snippet samples/cpp/houghcircles.cpp display +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp draw +@end_toggle + +@add_toggle_java +@snippet samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py draw +@end_toggle + +@add_toggle_python +@snippet samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java draw +@end_toggle + +You can see that we will draw the circle(s) on red and the center(s) with a small green dot + +#### Display the detected circle(s) and wait for the user to exit the program: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp display +@end_toggle + +@add_toggle_java +@snippet samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py display +@end_toggle + +@add_toggle_python +@snippet samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java display +@end_toggle Result ------ The result of running the code above with a test image is shown below: -![](images/Hough_Circle_Tutorial_Result.jpg) +![](images/Hough_Circle_Tutorial_Result.png) diff --git a/doc/tutorials/imgproc/imgtrans/hough_circle/images/Hough_Circle_Tutorial_Result.png b/doc/tutorials/imgproc/imgtrans/hough_circle/images/Hough_Circle_Tutorial_Result.png new file mode 100644 index 0000000000000000000000000000000000000000..b19ee00ac3092f75e46177e325b54e5b098df5ea GIT binary patch literal 78617 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index d91ec4a953..4bfe9dc967 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -133,6 +133,8 @@ In this section you will learn about the image processing (manipulation) functio - @subpage tutorial_hough_circle + *Languages:* C++, Java, Python + *Compatibility:* \> OpenCV 2.0 *Author:* Ana Huamán diff --git a/samples/cpp/houghcircles.cpp b/samples/cpp/houghcircles.cpp deleted file mode 100644 index f749b0e247..0000000000 --- a/samples/cpp/houghcircles.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "opencv2/imgcodecs.hpp" -#include "opencv2/highgui.hpp" -#include "opencv2/imgproc.hpp" - -#include - -using namespace cv; -using namespace std; - -static void help() -{ - cout << "\nThis program demonstrates circle finding with the Hough transform.\n" - "Usage:\n" - "./houghcircles , Default is ../data/board.jpg\n" << endl; -} - -int main(int argc, char** argv) -{ - cv::CommandLineParser parser(argc, argv, - "{help h ||}{@image|../data/board.jpg|}" - ); - if (parser.has("help")) - { - help(); - return 0; - } - //![load] - string filename = parser.get("@image"); - Mat img = imread(filename, IMREAD_COLOR); - if(img.empty()) - { - help(); - cout << "can not open " << filename << endl; - return -1; - } - //![load] - - //![convert_to_gray] - Mat gray; - cvtColor(img, gray, COLOR_BGR2GRAY); - //![convert_to_gray] - - //![reduce_noise] - medianBlur(gray, gray, 5); - //![reduce_noise] - - //![houghcircles] - vector circles; - HoughCircles(gray, circles, HOUGH_GRADIENT, 1, - gray.rows/16, // change this value to detect circles with different distances to each other - 100, 30, 1, 30 // change the last two parameters - // (min_radius & max_radius) to detect larger circles - ); - //![houghcircles] - - //![draw] - for( size_t i = 0; i < circles.size(); i++ ) - { - Vec3i c = circles[i]; - circle( img, Point(c[0], c[1]), c[2], Scalar(0,0,255), 3, LINE_AA); - circle( img, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, LINE_AA); - } - //![draw] - - //![display] - imshow("detected circles", img); - waitKey(); - //![display] - - return 0; -} diff --git a/samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp b/samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp new file mode 100644 index 0000000000..bd0722017d --- /dev/null +++ b/samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp @@ -0,0 +1,65 @@ +/** + * @file houghcircles.cpp + * @brief This program demonstrates circle finding with the Hough transform + */ +#include "opencv2/imgcodecs.hpp" +#include "opencv2/highgui.hpp" +#include "opencv2/imgproc.hpp" + +using namespace cv; +using namespace std; + +int main(int argc, char** argv) +{ + //![load] + const char* filename = argc >=2 ? argv[1] : "../../../data/smarties.png"; + + // Loads an image + Mat src = imread( filename, IMREAD_COLOR ); + + // Check if image is loaded fine + if(src.empty()){ + printf(" Error opening image\n"); + printf(" Program Arguments: [image_name -- default %s] \n", filename); + return -1; + } + //![load] + + //![convert_to_gray] + Mat gray; + cvtColor(src, gray, COLOR_BGR2GRAY); + //![convert_to_gray] + + //![reduce_noise] + medianBlur(gray, gray, 5); + //![reduce_noise] + + //![houghcircles] + vector circles; + HoughCircles(gray, circles, HOUGH_GRADIENT, 1, + gray.rows/16, // change this value to detect circles with different distances to each other + 100, 30, 1, 30 // change the last two parameters + // (min_radius & max_radius) to detect larger circles + ); + //![houghcircles] + + //![draw] + for( size_t i = 0; i < circles.size(); i++ ) + { + Vec3i c = circles[i]; + Point center = Point(c[0], c[1]); + // circle center + circle( src, center, 1, Scalar(0,100,100), 3, LINE_AA); + // circle outline + int radius = c[2]; + circle( src, center, radius, Scalar(255,0,255), 3, LINE_AA); + } + //![draw] + + //![display] + imshow("detected circles", src); + waitKey(); + //![display] + + return 0; +} diff --git a/samples/data/smarties.png b/samples/data/smarties.png new file mode 100644 index 0000000000000000000000000000000000000000..90bf22dd3ba8ba18c9eddf3f5d82ca5229bc4120 GIT binary patch literal 90815 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

=2e^s2#i>2?1m}Urzcj!*)x}K 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 literal 0 HcmV?d00001 diff --git a/samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java b/samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java new file mode 100644 index 0000000000..40f97ff874 --- /dev/null +++ b/samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java @@ -0,0 +1,77 @@ +package sample; +/** + * @file HoughCircles.java + * @brief This program demonstrates circle finding with the Hough transform + */ + +import org.opencv.core.*; +import org.opencv.core.Point; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +class HoughCirclesRun { + + public void run(String[] args) { + + //! [load] + String default_file = "../../../../data/smarties.png"; + String filename = ((args.length > 0) ? args[0] : default_file); + + // Load an image + Mat src = Imgcodecs.imread(filename, Imgcodecs.IMREAD_COLOR); + + // Check if image is loaded fine + if( src.empty() ) { + System.out.println("Error opening image!"); + System.out.println("Program Arguments: [image_name -- default " + + default_file +"] \n"); + System.exit(-1); + } + //! [load] + + //! [convert_to_gray] + Mat gray = new Mat(); + Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); + //! [convert_to_gray] + + //![reduce_noise] + Imgproc.medianBlur(gray, gray, 5); + //![reduce_noise] + + //! [houghcircles] + Mat circles = new Mat(); + Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1.0, + (double)gray.rows()/16, // change this value to detect circles with different distances to each other + 100.0, 30.0, 1, 30); // change the last two parameters + // (min_radius & max_radius) to detect larger circles + //! [houghcircles] + + //! [draw] + for (int x = 0; x < circles.cols(); x++) { + double[] c = circles.get(0, x); + Point center = new Point(Math.round(c[0]), Math.round(c[1])); + // circle center + Imgproc.circle(src, center, 1, new Scalar(0,100,100), 3, 8, 0 ); + // circle outline + int radius = (int) Math.round(c[2]); + Imgproc.circle(src, center, radius, new Scalar(255,0,255), 3, 8, 0 ); + } + //! [draw] + + //! [display] + HighGui.imshow("detected circles", src); + HighGui.waitKey(); + //! [display] + + System.exit(0); + } +} + +public class HoughCircles { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new HoughCirclesRun().run(args); + } +} diff --git a/samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py b/samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py new file mode 100644 index 0000000000..c8c472f0f8 --- /dev/null +++ b/samples/python/tutorial_code/ImgTrans/HoughCircle/hough_circle.py @@ -0,0 +1,59 @@ +import sys +import cv2 +import numpy as np + + +def main(argv): + ## [load] + default_file = "../../../../data/smarties.png" + filename = argv[0] if len(argv) > 0 else default_file + + # Loads an image + src = cv2.imread(filename, cv2.IMREAD_COLOR) + + # Check if image is loaded fine + if src is None: + print ('Error opening image!') + print ('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n') + return -1 + ## [load] + + ## [convert_to_gray] + # Convert it to gray + gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) + ## [convert_to_gray] + + ## [reduce_noise] + # Reduce the noise to avoid false circle detection + gray = cv2.medianBlur(gray, 5) + ## [reduce_noise] + + ## [houghcircles] + rows = gray.shape[0] + circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, rows / 8, + param1=100, param2=30, + minRadius=1, maxRadius=30) + ## [houghcircles] + + ## [draw] + if circles is not None: + circles = np.uint16(np.around(circles)) + for i in circles[0, :]: + center = (i[0], i[1]) + # circle center + cv2.circle(src, center, 1, (0, 100, 100), 3) + # circle outline + radius = i[2] + cv2.circle(src, center, radius, (255, 0, 255), 3) + ## [draw] + + ## [display] + cv2.imshow("detected circles", src) + cv2.waitKey(0) + ## [display] + + return 0 + + +if __name__ == "__main__": + main(sys.argv[1:]) From 9a2317e063bcdaf46e0f8a68c7b972338b825ac8 Mon Sep 17 00:00:00 2001 From: tribta Date: Sun, 27 Aug 2017 00:02:29 +0100 Subject: [PATCH 10/10] Tutorial Hough Lines --- .../imgtrans/hough_lines/hough_lines.markdown | 231 ++++++++++++------ .../images/hough_lines_result1.png | Bin 0 -> 68137 bytes .../images/hough_lines_result2.png | Bin 0 -> 62434 bytes .../imgproc/table_of_content_imgproc.markdown | 2 + samples/cpp/houghlines.cpp | 77 ------ .../cpp/tutorial_code/ImgTrans/houghlines.cpp | 89 +++++++ .../ImgTrans/HoughLine/HoughLines.java | 96 ++++++++ .../ImgTrans/HoughLine/hough_lines.py | 79 ++++++ 8 files changed, 417 insertions(+), 157 deletions(-) create mode 100644 doc/tutorials/imgproc/imgtrans/hough_lines/images/hough_lines_result1.png create mode 100644 doc/tutorials/imgproc/imgtrans/hough_lines/images/hough_lines_result2.png delete mode 100644 samples/cpp/houghlines.cpp create mode 100644 samples/cpp/tutorial_code/ImgTrans/houghlines.cpp create mode 100644 samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java create mode 100644 samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py diff --git a/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.markdown b/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.markdown index 584c3f8b68..8b24d87a2d 100644 --- a/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.markdown +++ b/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.markdown @@ -1,12 +1,15 @@ Hough Line Transform {#tutorial_hough_lines} ==================== +@prev_tutorial{tutorial_canny_detector} +@next_tutorial{tutorial_hough_circle} + Goal ---- In this tutorial you will learn how to: -- Use the OpenCV functions @ref cv::HoughLines and @ref cv::HoughLinesP to detect lines in an +- Use the OpenCV functions **HoughLines()** and **HoughLinesP()** to detect lines in an image. Theory @@ -79,54 +82,93 @@ a. **The Standard Hough Transform** - It consists in pretty much what we just explained in the previous section. It gives you as result a vector of couples \f$(\theta, r_{\theta})\f$ -- In OpenCV it is implemented with the function @ref cv::HoughLines +- In OpenCV it is implemented with the function **HoughLines()** b. **The Probabilistic Hough Line Transform** - A more efficient implementation of the Hough Line Transform. It gives as output the extremes of the detected lines \f$(x_{0}, y_{0}, x_{1}, y_{1})\f$ -- In OpenCV it is implemented with the function @ref cv::HoughLinesP +- In OpenCV it is implemented with the function **HoughLinesP()** + +### What does this program do? + - Loads an image + - Applies a *Standard Hough Line Transform* and a *Probabilistic Line Transform*. + - Display the original image and the detected line in three windows. Code ---- --# **What does this program do?** - - Loads an image - - Applies either a *Standard Hough Line Transform* or a *Probabilistic Line Transform*. - - Display the original image and the detected line in two windows. +@add_toggle_cpp +The sample code that we will explain can be downloaded from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/houghlines.cpp). +A slightly fancier version (which shows both Hough standard and probabilistic +with trackbars for changing the threshold values) can be found +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/HoughLines_Demo.cpp). +@include samples/cpp/tutorial_code/ImgTrans/houghlines.cpp +@end_toggle --# The sample code that we will explain can be downloaded from [here](https://github.com/opencv/opencv/tree/master/samples/cpp/houghlines.cpp). A slightly fancier version - (which shows both Hough standard and probabilistic with trackbars for changing the threshold - values) can be found [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/HoughLines_Demo.cpp). - @include samples/cpp/houghlines.cpp +@add_toggle_java +The sample code that we will explain can be downloaded from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java). +@include samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java +@end_toggle + +@add_toggle_python +The sample code that we will explain can be downloaded from +[here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py). +@include samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py +@end_toggle Explanation ----------- --# Load an image - @code{.cpp} - Mat src = imread(filename, 0); - if(src.empty()) - { - help(); - cout << "can not open " << filename << endl; - return -1; - } - @endcode --# Detect the edges of the image by using a Canny detector - @code{.cpp} - Canny(src, dst, 50, 200, 3); - @endcode - Now we will apply the Hough Line Transform. We will explain how to use both OpenCV functions - available for this purpose: +#### Load an image: --# **Standard Hough Line Transform** - -# First, you apply the Transform: - @code{.cpp} - vector lines; - HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 ); - @endcode - with the following arguments: +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghlines.cpp load +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java load +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py load +@end_toggle + +#### Detect the edges of the image by using a Canny detector: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghlines.cpp edge_detection +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java edge_detection +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py edge_detection +@end_toggle + +Now we will apply the Hough Line Transform. We will explain how to use both OpenCV functions +available for this purpose. + +#### Standard Hough Line Transform: +First, you apply the Transform: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghlines.cpp hough_lines +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java hough_lines +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py hough_lines +@end_toggle + +- with the following arguments: - *dst*: Output of the edge detector. It should be a grayscale image (although in fact it is a binary one) @@ -137,28 +179,35 @@ Explanation - *threshold*: The minimum number of intersections to "*detect*" a line - *srn* and *stn*: Default parameters to zero. Check OpenCV reference for more info. - -# And then you display the result by drawing the lines. - @code{.cpp} - for( size_t i = 0; i < lines.size(); i++ ) - { - float rho = lines[i][0], theta = lines[i][1]; - Point pt1, pt2; - double a = cos(theta), b = sin(theta); - double x0 = a*rho, y0 = b*rho; - pt1.x = cvRound(x0 + 1000*(-b)); - pt1.y = cvRound(y0 + 1000*(a)); - pt2.x = cvRound(x0 - 1000*(-b)); - pt2.y = cvRound(y0 - 1000*(a)); - line( cdst, pt1, pt2, Scalar(0,0,255), 3, LINE_AA); - } - @endcode --# **Probabilistic Hough Line Transform** - -# First you apply the transform: - @code{.cpp} - vector lines; - HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 ); - @endcode - with the arguments: +And then you display the result by drawing the lines. +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghlines.cpp draw_lines +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java draw_lines +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py draw_lines +@end_toggle + +#### Probabilistic Hough Line Transform +First you apply the transform: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghlines.cpp hough_lines_p +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java hough_lines_p +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py hough_lines_p +@end_toggle + +- with the arguments: - *dst*: Output of the edge detector. It should be a grayscale image (although in fact it is a binary one) @@ -172,23 +221,47 @@ Explanation this number of points are disregarded. - *maxLineGap*: The maximum gap between two points to be considered in the same line. - -# And then you display the result by drawing the lines. - @code{.cpp} - for( size_t i = 0; i < lines.size(); i++ ) - { - Vec4i l = lines[i]; - line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, LINE_AA); - } - @endcode --# Display the original image and the detected lines: - @code{.cpp} - imshow("source", src); - imshow("detected lines", cdst); - @endcode --# Wait until the user exits the program - @code{.cpp} - waitKey(); - @endcode +And then you display the result by drawing the lines. + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghlines.cpp draw_lines_p +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java draw_lines_p +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py draw_lines_p +@end_toggle + +#### Display the original image and the detected lines: + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghlines.cpp imshow +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java imshow +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py imshow +@end_toggle + +#### Wait until the user exits the program + +@add_toggle_cpp +@snippet samples/cpp/tutorial_code/ImgTrans/houghlines.cpp exit +@end_toggle + +@add_toggle_java +@snippet samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java exit +@end_toggle + +@add_toggle_python +@snippet samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py exit +@end_toggle Result ------ @@ -198,13 +271,11 @@ Result section. It still implements the same stuff as above, only adding the Trackbar for the Threshold. -Using an input image such as: - -![](images/Hough_Lines_Tutorial_Original_Image.jpg) - -We get the following result by using the Probabilistic Hough Line Transform: - -![](images/Hough_Lines_Tutorial_Result.jpg) +Using an input image such as a [sudoku image](https://raw.githubusercontent.com/opencv/opencv/master/samples/data/sudoku.png). +We get the following result by using the Standard Hough Line Transform: +![](images/hough_lines_result1.png) +And by using the Probabilistic Hough Line Transform: +![](images/hough_lines_result2.png) You may observe that the number of lines detected vary while you change the *threshold*. The explanation is sort of evident: If you establish a higher threshold, fewer lines will be detected diff --git a/doc/tutorials/imgproc/imgtrans/hough_lines/images/hough_lines_result1.png b/doc/tutorials/imgproc/imgtrans/hough_lines/images/hough_lines_result1.png new file mode 100644 index 0000000000000000000000000000000000000000..012cee5f6d03e0042a7feeb3cd2c50c4497f574e GIT binary patch literal 68137 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

bi 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 D5# OpenCV 2.0 *Author:* Ana Huamán diff --git a/samples/cpp/houghlines.cpp b/samples/cpp/houghlines.cpp deleted file mode 100644 index 94eec86eeb..0000000000 --- a/samples/cpp/houghlines.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "opencv2/imgcodecs.hpp" -#include "opencv2/highgui.hpp" -#include "opencv2/imgproc.hpp" - -#include - -using namespace cv; -using namespace std; - -static void help() -{ - cout << "\nThis program demonstrates line finding with the Hough transform.\n" - "Usage:\n" - "./houghlines , Default is ../data/pic1.png\n" << endl; -} - -int main(int argc, char** argv) -{ - cv::CommandLineParser parser(argc, argv, - "{help h||}{@image|../data/pic1.png|}" - ); - if (parser.has("help")) - { - help(); - return 0; - } - string filename = parser.get("@image"); - if (filename.empty()) - { - help(); - cout << "no image_name provided" << endl; - return -1; - } - Mat src = imread(filename, 0); - if(src.empty()) - { - help(); - cout << "can not open " << filename << endl; - return -1; - } - - Mat dst, cdst; - Canny(src, dst, 50, 200, 3); - cvtColor(dst, cdst, COLOR_GRAY2BGR); - -#if 0 - vector lines; - HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 ); - - for( size_t i = 0; i < lines.size(); i++ ) - { - float rho = lines[i][0], theta = lines[i][1]; - Point pt1, pt2; - double a = cos(theta), b = sin(theta); - double x0 = a*rho, y0 = b*rho; - pt1.x = cvRound(x0 + 1000*(-b)); - pt1.y = cvRound(y0 + 1000*(a)); - pt2.x = cvRound(x0 - 1000*(-b)); - pt2.y = cvRound(y0 - 1000*(a)); - line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA); - } -#else - vector lines; - HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 ); - for( size_t i = 0; i < lines.size(); i++ ) - { - Vec4i l = lines[i]; - line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, LINE_AA); - } -#endif - imshow("source", src); - imshow("detected lines", cdst); - - waitKey(); - - return 0; -} diff --git a/samples/cpp/tutorial_code/ImgTrans/houghlines.cpp b/samples/cpp/tutorial_code/ImgTrans/houghlines.cpp new file mode 100644 index 0000000000..57f64c6b91 --- /dev/null +++ b/samples/cpp/tutorial_code/ImgTrans/houghlines.cpp @@ -0,0 +1,89 @@ +/** + * @file houghclines.cpp + * @brief This program demonstrates line finding with the Hough transform + */ + +#include "opencv2/imgcodecs.hpp" +#include "opencv2/highgui.hpp" +#include "opencv2/imgproc.hpp" + +using namespace cv; +using namespace std; + +int main(int argc, char** argv) +{ + // Declare the output variables + Mat dst, cdst, cdstP; + + //![load] + const char* default_file = "../../../data/sudoku.png"; + const char* filename = argc >=2 ? argv[1] : default_file; + + // Loads an image + Mat src = imread( filename, IMREAD_GRAYSCALE ); + + // Check if image is loaded fine + if(src.empty()){ + printf(" Error opening image\n"); + printf(" Program Arguments: [image_name -- default %s] \n", default_file); + return -1; + } + //![load] + + //![edge_detection] + // Edge detection + Canny(src, dst, 50, 200, 3); + //![edge_detection] + + // Copy edges to the images that will display the results in BGR + cvtColor(dst, cdst, COLOR_GRAY2BGR); + cdstP = cdst.clone(); + + //![hough_lines] + // Standard Hough Line Transform + vector lines; // will hold the results of the detection + HoughLines(dst, lines, 1, CV_PI/180, 150, 0, 0 ); // runs the actual detection + //![hough_lines] + //![draw_lines] + // Draw the lines + for( size_t i = 0; i < lines.size(); i++ ) + { + float rho = lines[i][0], theta = lines[i][1]; + Point pt1, pt2; + double a = cos(theta), b = sin(theta); + double x0 = a*rho, y0 = b*rho; + pt1.x = cvRound(x0 + 1000*(-b)); + pt1.y = cvRound(y0 + 1000*(a)); + pt2.x = cvRound(x0 - 1000*(-b)); + pt2.y = cvRound(y0 - 1000*(a)); + line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA); + } + //![draw_lines] + + //![hough_lines_p] + // Probabilistic Line Transform + vector linesP; // will hold the results of the detection + HoughLinesP(dst, linesP, 1, CV_PI/180, 50, 50, 10 ); // runs the actual detection + //![hough_lines_p] + //![draw_lines_p] + // Draw the lines + for( size_t i = 0; i < linesP.size(); i++ ) + { + Vec4i l = linesP[i]; + line( cdstP, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, LINE_AA); + } + //![draw_lines_p] + + //![imshow] + // Show results + imshow("Source", src); + imshow("Detected Lines (in red) - Standard Hough Line Transform", cdst); + imshow("Detected Lines (in red) - Probabilistic Line Transform", cdstP); + //![imshow] + + //![exit] + // Wait and Exit + waitKey(); + return 0; + //![exit] +} diff --git a/samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java b/samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java new file mode 100644 index 0000000000..c968d32178 --- /dev/null +++ b/samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java @@ -0,0 +1,96 @@ +/** + * @file HoughLines.java + * @brief This program demonstrates line finding with the Hough transform + */ + +import org.opencv.core.*; +import org.opencv.core.Point; +import org.opencv.highgui.HighGui; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +class HoughLinesRun { + + public void run(String[] args) { + // Declare the output variables + Mat dst = new Mat(), cdst = new Mat(), cdstP; + + //! [load] + String default_file = "../../../../data/sudoku.png"; + String filename = ((args.length > 0) ? args[0] : default_file); + + // Load an image + Mat src = Imgcodecs.imread(filename, Imgcodecs.IMREAD_GRAYSCALE); + + // Check if image is loaded fine + if( src.empty() ) { + System.out.println("Error opening image!"); + System.out.println("Program Arguments: [image_name -- default " + + default_file +"] \n"); + System.exit(-1); + } + //! [load] + + //! [edge_detection] + // Edge detection + Imgproc.Canny(src, dst, 50, 200, 3, false); + //! [edge_detection] + + // Copy edges to the images that will display the results in BGR + Imgproc.cvtColor(dst, cdst, Imgproc.COLOR_GRAY2BGR); + cdstP = cdst.clone(); + + //! [hough_lines] + // Standard Hough Line Transform + Mat lines = new Mat(); // will hold the results of the detection + Imgproc.HoughLines(dst, lines, 1, Math.PI/180, 150); // runs the actual detection + //! [hough_lines] + //! [draw_lines] + // Draw the lines + for (int x = 0; x < lines.rows(); x++) { + double rho = lines.get(x, 0)[0], + theta = lines.get(x, 0)[1]; + + double a = Math.cos(theta), b = Math.sin(theta); + double x0 = a*rho, y0 = b*rho; + Point pt1 = new Point(Math.round(x0 + 1000*(-b)), Math.round(y0 + 1000*(a))); + Point pt2 = new Point(Math.round(x0 - 1000*(-b)), Math.round(y0 - 1000*(a))); + Imgproc.line(cdst, pt1, pt2, new Scalar(0, 0, 255), 3, Imgproc.LINE_AA, 0); + } + //! [draw_lines] + + //! [hough_lines_p] + // Probabilistic Line Transform + Mat linesP = new Mat(); // will hold the results of the detection + Imgproc.HoughLinesP(dst, linesP, 1, Math.PI/180, 50, 50, 10); // runs the actual detection + //! [hough_lines_p] + //! [draw_lines_p] + // Draw the lines + for (int x = 0; x < linesP.rows(); x++) { + double[] l = linesP.get(x, 0); + Imgproc.line(cdstP, new Point(l[0], l[1]), new Point(l[2], l[3]), new Scalar(0, 0, 255), 3, Imgproc.LINE_AA, 0); + } + //! [draw_lines_p] + + //! [imshow] + // Show results + HighGui.imshow("Source", src); + HighGui.imshow("Detected Lines (in red) - Standard Hough Line Transform", cdst); + HighGui.imshow("Detected Lines (in red) - Probabilistic Line Transform", cdstP); + //! [imshow] + + //! [exit] + // Wait and Exit + HighGui.waitKey(); + System.exit(0); + //! [exit] + } +} + +public class HoughLines { + public static void main(String[] args) { + // Load the native library. + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + new HoughLinesRun().run(args); + } +} diff --git a/samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py b/samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py new file mode 100644 index 0000000000..2907996e67 --- /dev/null +++ b/samples/python/tutorial_code/ImgTrans/HoughLine/hough_lines.py @@ -0,0 +1,79 @@ +""" +@file hough_lines.py +@brief This program demonstrates line finding with the Hough transform +""" +import sys +import math +import cv2 +import numpy as np + + +def main(argv): + ## [load] + default_file = "../../../../data/sudoku.png" + filename = argv[0] if len(argv) > 0 else default_file + + # Loads an image + src = cv2.imread(filename, cv2.IMREAD_GRAYSCALE) + + # Check if image is loaded fine + if src is None: + print ('Error opening image!') + print ('Usage: hough_lines.py [image_name -- default ' + default_file + '] \n') + return -1 + ## [load] + + ## [edge_detection] + # Edge detection + dst = cv2.Canny(src, 50, 200, None, 3) + ## [edge_detection] + + # Copy edges to the images that will display the results in BGR + cdst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR) + cdstP = np.copy(cdst) + + ## [hough_lines] + # Standard Hough Line Transform + lines = cv2.HoughLines(dst, 1, np.pi / 180, 150, None, 0, 0) + ## [hough_lines] + ## [draw_lines] + # Draw the lines + if lines is not None: + for i in range(0, len(lines)): + rho = lines[i][0][0] + theta = lines[i][0][1] + a = math.cos(theta) + b = math.sin(theta) + x0 = a * rho + y0 = b * rho + pt1 = (int(x0 + 1000*(-b)), int(y0 + 1000*(a))) + pt2 = (int(x0 - 1000*(-b)), int(y0 - 1000*(a))) + + cv2.line(cdst, pt1, pt2, (0,0,255), 3, cv2.LINE_AA) + ## [draw_lines] + + ## [hough_lines_p] + # Probabilistic Line Transform + linesP = cv2.HoughLinesP(dst, 1, np.pi / 180, 50, None, 50, 10) + ## [hough_lines_p] + ## [draw_lines_p] + # Draw the lines + if linesP is not None: + for i in range(0, len(linesP)): + l = linesP[i][0] + cv2.line(cdstP, (l[0], l[1]), (l[2], l[3]), (0,0,255), 3, cv2.LINE_AA) + ## [draw_lines_p] + ## [imshow] + # Show results + cv2.imshow("Source", src) + cv2.imshow("Detected Lines (in red) - Standard Hough Line Transform", cdst) + cv2.imshow("Detected Lines (in red) - Probabilistic Line Transform", cdstP) + ## [imshow] + ## [exit] + # Wait and Exit + cv2.waitKey() + return 0 + ## [exit] + +if __name__ == "__main__": + main(sys.argv[1:])