From 4168b75edc294c6297f6afac666c62f6567ac0be Mon Sep 17 00:00:00 2001 From: Bernat Gabor Date: Fri, 8 Jul 2011 19:43:29 +0000 Subject: [PATCH] Some tutorial extending of the Windows install and usage. Display Image retouching. --- .../imgproc/imgtrans/hough_circle/hough_circle.rst | 7 +- .../introduction/display_image/display_image.rst | 139 ++++++++++++--------- .../windows_install/windows_install.rst | 78 ++++++------ .../images/VisualStudioCommandLineArguments.jpg | Bin 0 -> 27685 bytes .../windows_visual_studio_Opencv.rst | 21 +++- doc/tutorials/tutorials.rst | 4 +- .../opencv-logo.png | Bin .../introduction/display_image/display_image.cpp | 30 +++++ 8 files changed, 174 insertions(+), 105 deletions(-) create mode 100644 doc/tutorials/introduction/windows_visual_studio_Opencv/images/VisualStudioCommandLineArguments.jpg rename samples/cpp/tutorial_code/{introduction/windows_visual_studio_Opencv => images}/opencv-logo.png (100%) create mode 100644 samples/cpp/tutorial_code/introduction/display_image/display_image.cpp diff --git a/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.rst b/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.rst index 43f7cd0..2705e2f 100644 --- a/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.rst +++ b/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.rst @@ -40,7 +40,12 @@ Code * Applies the *Hough Circle Transform* to the blurred image . * Display the detected circle in a window. -#. The sample code that we will explain can be downloaded from `here `_. A slightly fancier version (which shows both Hough standard and probabilistic with trackbars for changing the threshold values) can be found `here `_ + .. |TutorialHoughCirclesSimpleDownload| replace:: here + .. _TutorialHoughCirclesSimpleDownload: https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/houghlines.cpp + .. |TutorialHoughCirclesFancyDownload| replace:: here + .. _TutorialHoughCirclesFancyDownload: https://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/HoughCircle_Demo.cpp + +#. The sample code that we will explain can be downloaded from |TutorialHoughCirclesSimpleDownload|_. A slightly fancier version (which shows both Hough standard and probabilistic with trackbars for changing the threshold values) can be found |TutorialHoughCirclesFancyDownload|_. .. code-block:: cpp diff --git a/doc/tutorials/introduction/display_image/display_image.rst b/doc/tutorials/introduction/display_image/display_image.rst index 72fe5c1..f0edeec 100644 --- a/doc/tutorials/introduction/display_image/display_image.rst +++ b/doc/tutorials/introduction/display_image/display_image.rst @@ -1,108 +1,117 @@ .. _Display_Image: -Display an Image -***************** +Load and Display an Image +************************* Goal ===== In this tutorial you will learn how to: -* Load an image using :imread:`imread <>` -* Create a named window (using :named_window:`namedWindow <>`) -* Display an image in an OpenCV window (using :imshow:`imshow <>`) +.. container:: enumeratevisibleitemswithsquare + + * Load an image (using :imread:`imread <>`) + * Create a named OpenCV window (using :named_window:`namedWindow <>`) + * Display an image in an OpenCV window (using :imshow:`imshow <>`) -Code -===== +Source Code +=========== -Here it is: +Download the :download:`source code from here <../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp>` or look it up in our library at :file:`samples/cpp/tutorial_code/introduction/display_image/display_image.cpp`. -.. code-block:: cpp +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp + :language: cpp + :tab-width: 4 + :linenos: - #include - #include +Explanation +============ - using namespace cv; +In OpenCV 2 we have multiple modules. Each one takes care of a different area or approach towards image processing. You could already observe this in the structure of the user guide of these tutorials itself. Before you use any of them you first need to include the header files where the content of each individual module is declared. - int main( int argc, char** argv ) - { - Mat image; - image = imread( argv[1], 1 ); +You'll almost always end up using the: - if( argc != 2 || !image.data ) - { - printf( "No image data \n" ); - return -1; - } +.. container:: enumeratevisibleitemswithsquare - namedWindow( "Display Image", CV_WINDOW_AUTOSIZE ); - imshow( "Display Image", image ); + + *core* section, as here are defined the basic building blocks of the library + + *highgui* module, as this contains the functions for input and output operations - waitKey(0); +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/windows_visual_studio_Opencv/Test.cpp + :language: cpp + :tab-width: 4 + :lines: 1-3 - return 0; - } +We also include the *iostream* to facilitate console line output and input. To avoid data structure and function name conflicts with other libraries, OpenCV has its own namespace: *cv*. To avoid the need appending prior each of these the *cv::* keyword you can import the namespace in the whole file by using the lines: +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp + :language: cpp + :tab-width: 4 + :lines: 5-6 -Explanation -============ +This is true for the STL library too (used for console I/O). Now, let's analyze the *main* function. We start up assuring that we acquire a valid image name argument from the command line. -#. .. code-block:: cpp +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp + :language: cpp + :tab-width: 4 + :lines: 10-14 - #include - #include - - using namespace cv; +Then create a *Mat* object that will store the data of the loaded image. - These are OpenCV headers: +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp + :language: cpp + :tab-width: 4 + :lines: 16 - * *cv.h* : Main OpenCV functions - * *highgui.h* : Graphical User Interface (GUI) functions +Now we call the :imread:`imread <>` function which loads the image name specified by the first argument (*argv[1]*). The second argument specifies the format in what we want the image. This may be: - Now, let's analyze the *main* function: +.. container:: enumeratevisibleitemswithsquare -#. .. code-block:: cpp + + CV_LOAD_IMAGE_UNCHANGED (<0) loads the image as is (including the alpha channel if present) + + CV_LOAD_IMAGE_GRAYSCALE ( 0) loads the image as an intensity one + + CV_LOAD_IMAGE_COLOR (>0) loads the image in the RGB format - Mat image; - - We create a Mat object to store the data of the image to load. - -#. .. code-block:: cpp - - image = imread( argv[1], 1 ); - - Here, we called the function :imread:`imread <>` which basically loads the image specified by the first argument (in this case *argv[1]*). The second argument is by default. +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp + :language: cpp + :tab-width: 4 + :lines: 17 -#. After checking that the image data was loaded correctly, we want to display our image, so we create a window: +.. note:: - .. code-block:: cpp + OpenCV offers support for the image formats Windows bitmap (bmp), portable image formats (pbm, pgm, ppm) and Sun raster (sr, ras). With help of plugins (you need to specify to use them if you build yourself the library, nevertheless in the packages we ship present by default) you may also load image formats like JPEG (jpeg, jpg, jpe), JPEG 2000 (jp2 - codenamed in the CMake as Jasper), TIFF files (tiff, tif) and portable network graphics (png). Furthermore, OpenEXR is also a possibility. - namedWindow( "Display Image", CV_WINDOW_AUTOSIZE ); +After checking that the image data was loaded correctly, we want to display our image, so we create an OpenCV window using the :named_window:`namedWindow <>` function. These are automatically managed by OpenCV once you create them. For this you need to specify its name and how it should handle the change of the image it contains from a size point of view. It may be: +.. container:: enumeratevisibleitemswithsquare - :named_window:`namedWindow <>` receives as arguments the window name ("Display Image") and an additional argument that defines windows properties. In this case **CV_WINDOW_AUTOSIZE** indicates that the window will adopt the size of the image to be displayed. + + *CV_WINDOW_AUTOSIZE* is the only supported one if you do not use the Qt backend. In this case the window size will take up the size of the image it shows. No resize permitted! + + *CV_WINDOW_NORMAL* on Qt you may use this to allow window resize. The image will resize itself according to the current window size. By using the | operator you also need to specify if you would like the image to keep its aspect ratio (*CV_WINDOW_KEEPRATIO*) or not (*CV_WINDOW_FREERATIO*). -#. Finally, it is time to show the image, for this we use :imshow:`imshow <>` +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp + :language: cpp + :lines: 25 + :tab-width: 4 - .. code-block:: cpp - - imshow( "Display Image", image ) +Finally, to update the content of the OpenCV window with a new image use the :imshow:`imshow <>` function. Specify the OpenCV window name to update and the image to use during this operation: -#. Finally, we want our window to be displayed until the user presses a key (otherwise the program would end far too quickly): +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp + :language: cpp + :lines: 26 + :tab-width: 4 - .. code-block:: cpp - - waitKey(0); +Because we want our window to be displayed until the user presses a key (otherwise the program would end far too quickly), we use the :wait_key:`waitKey <>` function whose only parameter is just how long should it wait for a user input (measured in milliseconds). Zero means to wait forever. - We use the :wait_key:`waitKey <>` function, which allow us to wait for a keystroke during a number of milliseconds (determined by the argument). If the argument is zero, then it will wait indefinitely. +.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp + :language: cpp + :lines: 28 + :tab-width: 4 Result ======= -* Compile your code and then run the executable giving a image path as argument: +* Compile your code and then run the executable giving an image path as argument. If you're on Windows the executable will of course contain an *exe* extension too. Of course assure the image file is near your program file. .. code-block:: bash - + ./DisplayImage HappyFish.jpg * You should get a nice window as the one shown below: @@ -110,3 +119,9 @@ Result .. image:: images/Display_Image_Tutorial_Result.png :alt: Display Image Tutorial - Final Result :align: center + +.. raw:: html + +
+ +
diff --git a/doc/tutorials/introduction/windows_install/windows_install.rst b/doc/tutorials/introduction/windows_install/windows_install.rst index 761a7dc..1d3182b 100644 --- a/doc/tutorials/introduction/windows_install/windows_install.rst +++ b/doc/tutorials/introduction/windows_install/windows_install.rst @@ -67,66 +67,67 @@ While the later one may contain a couple of new and experimental algorithms, per Building the OpenCV library from scratch requires a couple of tools installed beforehand: +.. |CMake| replace:: CMake +.. _CMake: http://www.cmake.org/cmake/resources/software.html +.. |TortoiseSVN| replace:: TortoiseSVN +.. _TortoiseSVN: http://tortoisesvn.net/downloads.html +.. |Python_Libraries| replace:: Python libraries +.. _Python_Libraries: http://www.python.org/getit/ +.. |Numpy| replace:: Numpy +.. _Numpy: http://numpy.scipy.org/ +.. |IntelTBB| replace:: Intel |copy| Threading Building Blocks (*TBB*) +.. _IntelTBB: http://threadingbuildingblocks.org/file.php?fid=77 +.. |IntelIIP| replace:: Intel |copy| Integrated Performance Primitives (*IPP*) +.. _IntelIIP: http://software.intel.com/en-us/articles/intel-ipp/ +.. |qtframework| replace:: Qt framework +.. _qtframework: http://qt.nokia.com/downloads +.. |Eigen| replace:: Eigen +.. _Eigen: http://eigen.tuxfamily.org/index.php?title=Main_Page#Download +.. |CUDA_Toolkit| replace:: CUDA Toolkit +.. _CUDA_Toolkit: http://developer.nvidia.com/cuda-downloads +.. |OpenEXR| replace:: OpenEXR +.. _OpenEXR: http://www.openexr.com/downloads.html +.. |OpenNI_Framework| replace:: OpenNI Framework +.. _OpenNI_Framework: http://www.openni.org/ +.. |Miktex| replace:: Miktex +.. _Miktex: http://miktex.org/2.9/setup +.. |Sphinx| replace:: Sphinx +.. _Sphinx: http://sphinx.pocoo.org/ + .. container:: enumeratevisibleitemswithsquare + An **I**\ ntegrated **D**\ eveloper **E**\ nviroment (*IDE*) preferably, or just a C\C++ compiler that will actually make the binary files. Here I will use the `Microsoft Visual Studio `_. Nevertheless, you can use any other *IDE* that has a valid C\\C++ compiler. + Then |CMake|_ is a neat tool that will make the project files (for your choosen *IDE*) from the OpenCV source files. It will also allow an easy configuration of the OpenCV build files, in order to make binary files that fits exactly to your needs. - .. |CMake| replace:: CMake - .. _CMake: http://www.cmake.org/cmake/resources/software.html + A **S**\ ubversion **C**\ ontrol **S**\ ystem (*SVN*) to acquire the OpenCV source files. A good tool for this is |TortoiseSVN|_. Alternatively, you can just download an archived version of the source files from the `Sourceforge OpenCV page `_. - .. |TortoiseSVN| replace:: TortoiseSVN - .. _TortoiseSVN: http://tortoisesvn.net/downloads.html OpenCV may come in multiple flavors. There is a "core" section that will work on its own. Nevertheless, they are a couple of tools, libraries made by other organizations (so called 3rd parties) that offer services of which the OpenCV may take advantage. These will improve in many ways its capabilities. In order to use any of them, you need to download and install them on your system. .. container:: enumeratevisibleitemswithsquare + The |Python_Libraries|_ are required to build the *Python interface* of OpenCV. For now use the version :file:`2.7.{x}`. This is also a must have if you want to build the *OpenCV documentation*. - .. |Python_Libraries| replace:: Python libraries - .. _Python_Libraries: http://www.python.org/getit/ - + + |Numpy|_ is a scientific computing package for Python. Required for the *Python interface*. - .. |Numpy| replace:: Numpy - .. _Numpy: http://numpy.scipy.org/ - + + |IntelTBB|_ is used inside OpenCV for parallel code snippets. Using this will make sure that the OpenCV library will take advantage of all the cores you have in your systems CPU. - .. |IntelTBB| replace:: Intel |copy| Threading Building Blocks (*TBB*) - .. _IntelTBB: http://threadingbuildingblocks.org/file.php?fid=77 - + + |IntelIIP|_ may be used to improve the performance of color conversion, Haar training and DFT functions of the OpenCV library. Watch out as this isn't a *free* service. - .. |IntelIIP| replace:: Intel |copy| Integrated Performance Primitives (*IPP*) - .. _IntelIIP: http://software.intel.com/en-us/articles/intel-ipp/ - + + OpenCV offers a somewhat fancier and more useful graphical user interface, than the default one by using the |qtframework|_. For a quick overview of what this has to offer look into the documentations *highgui* module, under the *Qt New Functions* section. Version 4.6 or later of the framework is required. - .. |qtframework| replace:: Qt framework - .. _qtframework: http://qt.nokia.com/downloads - + + |Eigen|_ is a C++ template library for linear algebra. - .. |Eigen| replace:: Eigen - .. _Eigen: http://eigen.tuxfamily.org/index.php?title=Main_Page#Download - + + The latest |CUDA_Toolkit|_ will allow you to use the power lying inside your GPU. This will drastically improve performance for some of the algorithms, like the HOG descriptor. Getting to work more and more of our algorithms on the GPUs is a constant effort of the OpenCV team. - .. |CUDA_Toolkit| replace:: CUDA Toolkit - .. _CUDA_Toolkit: http://developer.nvidia.com/cuda-downloads - + + |OpenEXR|_ source files are required for the library to work with this high dynamic range (HDR) image file format. - .. |OpenEXR| replace:: OpenEXR - .. _OpenEXR: http://www.openexr.com/downloads.html - + + The |OpenNI_Framework|_ contains a set of open source APIs that provide support for natural interaction with devices via methods such as voice command recognition, hand gestures and body motion tracking. - .. |OpenNI_Framework| replace:: OpenNI Framework - .. _OpenNI_Framework: http://www.openni.org/ - + + |Miktex|_ is the best `TEX `_ implementation on the Windows OS. It is required to build the *OpenCV documentation*. - .. |Miktex| replace:: Miktex - .. _Miktex: http://miktex.org/2.9/setup - + + |Sphinx|_ is a python documentation generator and is the tool that will actually create the *OpenCV documentation*. This on its own requires a couple of tools installed, I will cover this in depth at the :ref:`How to Install Sphinx ` section. - .. |Sphinx| replace:: Sphinx - .. _Sphinx: http://sphinx.pocoo.org/ - + Now I will describe the steps to follow for a full build (using all the above frameworks, tools and libraries). If you do not need the support for some of these you can just freely skip those parts. .. _WindowsBuildLibrary: @@ -221,7 +222,8 @@ Building the library .. code-block:: bash - configure.exe -release -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools -no-qt3support -no-multimedia -no-ltcg + configure.exe -release -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools + -no-qt3support -no-multimedia -no-ltcg Completing this will take around 10-20 minutes. Then enter the next command that will take a lot longer (can easily take even more than a full hour): diff --git a/doc/tutorials/introduction/windows_visual_studio_Opencv/images/VisualStudioCommandLineArguments.jpg b/doc/tutorials/introduction/windows_visual_studio_Opencv/images/VisualStudioCommandLineArguments.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14a70aeb256b317cd3f563d4675fe34b6b630f53 GIT binary patch literal 27685 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 Kzkc{@>Hh$f4e1~N literal 0 HcmV?d00001 diff --git a/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.rst b/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.rst index 2fc7f5a..67b781c 100644 --- a/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.rst +++ b/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.rst @@ -142,7 +142,6 @@ The process is the same as described in case of the local approach. Just add the Test it! ======== - Now to try this out download our little test :download:`source code <../../../../samples/cpp/tutorial_code/introduction/windows_visual_studio_Opencv/Test.cpp>` or get it from the sample code folder of the OpenCV sources. Add this to your project and build it. Here's its content: .. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/windows_visual_studio_Opencv/Test.cpp @@ -154,10 +153,28 @@ You can start a Visual Studio build from two places. Either inside from the *IDE .. |voila| unicode:: voil U+00E1 -This is important to remember when you code inside the code open and save commands. You're resources will be saved ( and queried for at opening!!!) relatively to your working directory. This is unless you give a full, explicit path as parameter for the I/O functions. In the code above we open :download:`this OpenCV logo<../../../../samples/cpp/tutorial_code/introduction/windows_visual_studio_Opencv/opencv-logo.png>`. Before starting up the application make sure you place the image file in your current working directory. Modify the image file name inside the code to try it out on other images too. Run it and |voila|: +This is important to remember when you code inside the code open and save commands. You're resources will be saved ( and queried for at opening!!!) relatively to your working directory. This is unless you give a full, explicit path as parameter for the I/O functions. In the code above we open :download:`this OpenCV logo<../../../../samples/cpp/tutorial_code/images/opencv-logo.png>`. Before starting up the application make sure you place the image file in your current working directory. Modify the image file name inside the code to try it out on other images too. Run it and |voila|: .. image:: images/SuccessVisualStudioWindows.jpg :alt: You should have this. :align: center +Command line arguments with Visual Studio +========================================= + +Throughout some of our future tutorials you'll see that the programs main input method will be by giving a runtime argument. To do this you can just start up a commmand windows (:kbd:`cmd + Enter` in the start menu), navigate to your executable file and start it with an argument. So for example in case of my upper project this would look like: + +.. code-block:: bash + :linenos: + + D: + CD OpenCV\MySolutionName\Release + MySolutionName.exe exampleImage.jpg + +Here I first changed my drive (if your project isn't on the OS local drive), navigated to my project and start it with an example image argument. While under Linux system it is common to fiddle around with the console window on the Microsoft Windows many people come to use it almost never. Besides, adding the same argument again and again while you are testing your application is, somewhat, a cumbersome task. Luckily, in the Visual Studio there is a menu to automate all this: + +.. image:: images/VisualStudioCommandLineArguments.jpg + :alt: Visual Studio Command Line Arguments + :align: center +Specify here the name of the inputs and while you start your application from the Visual Studio enviroment you have automatic argument passing. In the next introductionary tutorial you'll see an in-depth explanation of the upper source code: :ref:`Display_Image`. \ No newline at end of file diff --git a/doc/tutorials/tutorials.rst b/doc/tutorials/tutorials.rst index 394aa90..1f98d51 100644 --- a/doc/tutorials/tutorials.rst +++ b/doc/tutorials/tutorials.rst @@ -1,6 +1,6 @@ -############### +################ OpenCV Tutorials -############### +################ The following links describe a set of basic OpenCV tutorials. All the source code mentioned here is provide as part of the OpenCV regular releases, so check before you start copy & pasting the code. The list of tutorials below is automatically generated from reST files located in our SVN repository. diff --git a/samples/cpp/tutorial_code/introduction/windows_visual_studio_Opencv/opencv-logo.png b/samples/cpp/tutorial_code/images/opencv-logo.png similarity index 100% rename from samples/cpp/tutorial_code/introduction/windows_visual_studio_Opencv/opencv-logo.png rename to samples/cpp/tutorial_code/images/opencv-logo.png diff --git a/samples/cpp/tutorial_code/introduction/display_image/display_image.cpp b/samples/cpp/tutorial_code/introduction/display_image/display_image.cpp new file mode 100644 index 0000000..7cfb109 --- /dev/null +++ b/samples/cpp/tutorial_code/introduction/display_image/display_image.cpp @@ -0,0 +1,30 @@ +#include +#include +#include + +using namespace cv; +using namespace std; + +int main( int argc, char** argv ) +{ + if( argc != 2) + { + cout <<" Usage: display_image ImageToLoadAndDisplay" << endl; + return -1; + } + + Mat image; + image = imread(argv[1], CV_LOAD_IMAGE_COLOR); // Read the file + + if(! image.data ) // Check for invalid input + { + cout << "Could not open or find the image" << std::endl ; + return -1; + } + + namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display. + imshow( "Display window", image ); // Show our image inside it. + + waitKey(0); // Wait for a keystroke in the window + return 0; +} \ No newline at end of file -- 2.7.4