From 329a1fb781e67092b67cf772fd170b33eeeb4160 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 22 Oct 2018 17:22:11 +0000 Subject: [PATCH] drop C-API sample code --- .../file_input_output_with_xml_yml.markdown | 2 +- .../how_to_use_OpenCV_parallel_for_.markdown | 2 +- .../images/outputInteropOpenCV1.jpg | Bin 25948 -> 0 bytes .../interoperability_with_OpenCV_1.markdown | 143 ----------------- doc/tutorials/core/mat_operations.markdown | 17 +- .../core/table_of_content_core.markdown | 11 -- .../transition_guide.markdown | 2 - modules/core/include/opencv2/core/mat.hpp | 22 +-- samples/cpp/image.cpp | 135 ---------------- .../interoperability_with_OpenCV_1.cpp | 149 ------------------ .../core/mat_operations/mat_operations.cpp | 10 -- 11 files changed, 13 insertions(+), 480 deletions(-) delete mode 100644 doc/tutorials/core/interoperability_with_OpenCV_1/images/outputInteropOpenCV1.jpg delete mode 100644 doc/tutorials/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.markdown delete mode 100644 samples/cpp/image.cpp delete mode 100644 samples/cpp/tutorial_code/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.cpp diff --git a/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown b/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown index 97cdc3c35f..e74f770123 100644 --- a/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown +++ b/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown @@ -2,7 +2,7 @@ File Input and Output using XML and YAML files {#tutorial_file_input_output_with ============================================== @prev_tutorial{tutorial_discrete_fourier_transform} -@next_tutorial{tutorial_interoperability_with_OpenCV_1} +@next_tutorial{tutorial_how_to_use_OpenCV_parallel_for_} Goal ---- diff --git a/doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown b/doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown index 835409ce4b..8e863ec79e 100644 --- a/doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown +++ b/doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown @@ -1,7 +1,7 @@ How to use the OpenCV parallel_for_ to parallelize your code {#tutorial_how_to_use_OpenCV_parallel_for_} ================================================================== -@prev_tutorial{tutorial_interoperability_with_OpenCV_1} +@prev_tutorial{tutorial_file_input_output_with_xml_yml} Goal ---- diff --git a/doc/tutorials/core/interoperability_with_OpenCV_1/images/outputInteropOpenCV1.jpg b/doc/tutorials/core/interoperability_with_OpenCV_1/images/outputInteropOpenCV1.jpg deleted file mode 100644 index b94b0ec92791223e2a5226d7e13931fce1b9332d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25948 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 -#include -#include -@endcode -All the OpenCV related stuff is put into the *cv* namespace to avoid name conflicts with other -libraries data structures and functions. Therefore, either you need to prepend the *cv::* keyword -before everything that comes from OpenCV or after the includes, you just add a directive to use -this: -@code{.cpp} -using namespace cv; // The new C++ interface API is inside this namespace. Import it. -@endcode -Because the functions are already in a namespace there is no need for them to contain the *cv* -prefix in their name. As such all the new C++ compatible functions don't have this and they follow -the camel case naming rule. This means the first letter is small (unless it's a name, like Canny) -and the subsequent words start with a capital letter (like *copyMakeBorder*). - -Now, remember that you need to link to your application all the modules you use, and in case you are -on Windows using the *DLL* system you will need to add, again, to the path all the binaries. For -more in-depth information if you're on Windows read @ref tutorial_windows_visual_studio_opencv and for -Linux an example usage is explained in @ref tutorial_linux_eclipse. - -Now for converting the *Mat* object you can use either the *IplImage* or the *CvMat* operators. -While in the C interface you used to work with pointers here it's no longer the case. In the C++ -interface we have mostly *Mat* objects. These objects may be freely converted to both *IplImage* and -*CvMat* with simple assignment. For example: -@code{.cpp} -Mat I; -IplImage pI = I; -CvMat mI = I; -@endcode -Now if you want pointers the conversion gets just a little more complicated. The compilers can no -longer automatically determinate what you want and as you need to explicitly specify your goal. This -is to call the *IplImage* and *CvMat* operators and then get their pointers. For getting the pointer -we use the & sign: -@code{.cpp} -Mat I; -IplImage* pI = &I.operator IplImage(); -CvMat* mI = &I.operator CvMat(); -@endcode -One of the biggest complaints of the C interface is that it leaves all the memory management to you. -You need to figure out when it is safe to release your unused objects and make sure you do so before -the program finishes or you could have troublesome memory leaks. To work around this issue in OpenCV -there is introduced a sort of smart pointer. This will automatically release the object when it's no -longer in use. To use this declare the pointers as a specialization of the *Ptr* : -@code{.cpp} -Ptr piI = &I.operator IplImage(); -@endcode -Converting from the C data structures to the *Mat* is done by passing these inside its constructor. -For example: -@code{.cpp} -Mat K(piL), L; -L = Mat(pI); -@endcode - -A case study ------------- - -Now that you have the basics done [here's](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.cpp) -an example that mixes the usage of the C interface with the C++ one. You will also find it in the -sample directory of the OpenCV source code library at the -`samples/cpp/tutorial_code/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.cpp` . -To further help on seeing the difference the programs supports two modes: one mixed C and C++ and -one pure C++. If you define the *DEMO_MIXED_API_USE* you'll end up using the first. The program -separates the color planes, does some modifications on them and in the end merge them back together. - -@snippet interoperability_with_OpenCV_1.cpp head -@snippet interoperability_with_OpenCV_1.cpp start - -Here you can observe that with the new structure we have no pointer problems, although it is -possible to use the old functions and in the end just transform the result to a *Mat* object. - -@snippet interoperability_with_OpenCV_1.cpp new - -Because, we want to mess around with the images luma component we first convert from the default BGR -to the YUV color space and then split the result up into separate planes. Here the program splits: -in the first example it processes each plane using one of the three major image scanning algorithms -in OpenCV (C [] operator, iterator, individual element access). In a second variant we add to the -image some Gaussian noise and then mix together the channels according to some formula. - -The scanning version looks like: - -@snippet interoperability_with_OpenCV_1.cpp scanning - -Here you can observe that we may go through all the pixels of an image in three fashions: an -iterator, a C pointer and an individual element access style. You can read a more in-depth -description of these in the @ref tutorial_how_to_scan_images tutorial. Converting from the old function -names is easy. Just remove the cv prefix and use the new *Mat* data structure. Here's an example of -this by using the weighted addition function: - -@snippet interoperability_with_OpenCV_1.cpp noisy - -As you may observe the *planes* variable is of type *Mat*. However, converting from *Mat* to -*IplImage* is easy and made automatically with a simple assignment operator. - -@snippet interoperability_with_OpenCV_1.cpp end - -The new *imshow* highgui function accepts both the *Mat* and *IplImage* data structures. Compile and -run the program and if the first image below is your input you may get either the first or second as -output: - -![](images/outputInteropOpenCV1.jpg) - -You may observe a runtime instance of this on the [YouTube -here](https://www.youtube.com/watch?v=qckm-zvo31w) and you can [download the source code from here -](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.cpp) -or find it in the -`samples/cpp/tutorial_code/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.cpp` -of the OpenCV source code library. - -@youtube{qckm-zvo31w} diff --git a/doc/tutorials/core/mat_operations.markdown b/doc/tutorials/core/mat_operations.markdown index 02c3ad44c5..991d01367b 100644 --- a/doc/tutorials/core/mat_operations.markdown +++ b/doc/tutorials/core/mat_operations.markdown @@ -150,11 +150,12 @@ If we need to copy the data, this is done using, for example, cv::Mat::copyTo or @snippet samples/python/tutorial_code/core/mat_operations/mat_operations.py Reference counting 2 @end_toggle -To the contrary with C API where an output image had to be created by the developer, an empty output Mat -can be supplied to each function. Each implementation calls Mat::create for a destination matrix. -This method allocates data for a matrix if it is empty. If it is not empty and has the correct size -and type, the method does nothing. If however, size or type are different from the input arguments, the -data is deallocated (and lost) and a new data is allocated. For example: +An empty output Mat can be supplied to each function. +Each implementation calls Mat::create for a destination matrix. +This method allocates data for a matrix if it is empty. +If it is not empty and has the correct size and type, the method does nothing. +If however, size or type are different from the input arguments, the data is deallocated (and lost) and a new data is allocated. +For example: @add_toggle_cpp @snippet samples/cpp/tutorial_code/core/mat_operations/mat_operations.cpp Reference counting 3 @@ -199,12 +200,6 @@ Selecting a region of interest: @snippet samples/python/tutorial_code/core/mat_operations/mat_operations.py Select ROI @end_toggle -A conversion from Mat to C API data structures (**C++ only**): - -@snippet samples/cpp/tutorial_code/core/mat_operations/mat_operations.cpp C-API conversion - -Note that there is no data copying here. - Conversion from color to greyscale: @add_toggle_cpp diff --git a/doc/tutorials/core/table_of_content_core.markdown b/doc/tutorials/core/table_of_content_core.markdown index d775d8f0ee..b2b04a0d66 100644 --- a/doc/tutorials/core/table_of_content_core.markdown +++ b/doc/tutorials/core/table_of_content_core.markdown @@ -82,17 +82,6 @@ understanding how to manipulate the images on a pixel level. You will see how to use the @ref cv::FileStorage data structure of OpenCV to write and read data to XML or YAML file format. -- @subpage tutorial_interoperability_with_OpenCV_1 - - *Compatibility:* \> OpenCV 2.0 - - *Author:* Bernát Gábor - - Did you used OpenCV before its 2.0 version? Do you wanna know what happened with your library - with 2.0? Don't you know how to convert your old OpenCV programs to the new C++ interface? - Look here to shed light on all this questions. - - - @subpage tutorial_how_to_use_OpenCV_parallel_for_ *Compatibility:* \>= OpenCV 2.4.3 diff --git a/doc/tutorials/introduction/transition_guide/transition_guide.markdown b/doc/tutorials/introduction/transition_guide/transition_guide.markdown index c0f063b2c5..67d0f6f12a 100644 --- a/doc/tutorials/introduction/transition_guide/transition_guide.markdown +++ b/doc/tutorials/introduction/transition_guide/transition_guide.markdown @@ -62,8 +62,6 @@ Changes intended to ease the migration have been made in OpenCV 3.0, thus the fo #include "opencv2/.hpp" @endcode -2. If your code is using C API (`cv*` functions, `Cv*` structures or `CV_*` enumerations), include corresponding `*_c.h` headers. Although it is recommended to use C++ API, most of C-functions are still accessible in separate header files (opencv2/core/core_c.h, opencv2/core/types_c.h, opencv2/imgproc/imgproc_c.h, etc.). - Modern way to use algorithm {#tutorial_transition_algorithm} --------------------------- 1. Algorithm instances must be created with cv::makePtr function or corresponding static factory method if available: diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index 178ecd4938..ef0fa72cd0 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -614,12 +614,11 @@ Note that `M.step[i] >= M.step[i+1]` (in fact, `M.step[i] >= M.step[i+1]*M.size[ that 2-dimensional matrices are stored row-by-row, 3-dimensional matrices are stored plane-by-plane, and so on. M.step[M.dims-1] is minimal and always equal to the element size M.elemSize() . -So, the data layout in Mat is fully compatible with CvMat, IplImage, and CvMatND types from OpenCV -1.x. It is also compatible with the majority of dense array types from the standard toolkits and -SDKs, such as Numpy (ndarray), Win32 (independent device bitmaps), and others, that is, with any -array that uses *steps* (or *strides*) to compute the position of a pixel. Due to this -compatibility, it is possible to make a Mat header for user-allocated data and process it in-place -using OpenCV functions. +So, the data layout in Mat is compatible with the majority of dense array types from the standard +toolkits and SDKs, such as Numpy (ndarray), Win32 (independent device bitmaps), and others, +that is, with any array that uses *steps* (or *strides*) to compute the position of a pixel. +Due to this compatibility, it is possible to make a Mat header for user-allocated data and process +it in-place using OpenCV functions. There are many different ways to create a Mat object. The most popular options are listed below: @@ -704,10 +703,6 @@ sub-matrices. Mat M = Mat(3, 3, CV_64F, m).inv(); @endcode . - Partial yet very common cases of this *user-allocated data* case are conversions from CvMat and - IplImage to Mat. For this purpose, there is function cv::cvarrToMat taking pointers to CvMat or - IplImage and the optional flag indicating whether to copy the data or not. - @snippet samples/cpp/image.cpp iplimage - Use MATLAB-style array initializers, zeros(), ones(), eye(), for example: @code @@ -1641,13 +1636,6 @@ public: */ Mat operator()(const std::vector& ranges) const; - // //! converts header to CvMat; no data is copied - // operator CvMat() const; - // //! converts header to CvMatND; no data is copied - // operator CvMatND() const; - // //! converts header to IplImage; no data is copied - // operator IplImage() const; - template operator std::vector<_Tp>() const; template operator Vec<_Tp, n>() const; template operator Matx<_Tp, m, n>() const; diff --git a/samples/cpp/image.cpp b/samples/cpp/image.cpp deleted file mode 100644 index fc57738a77..0000000000 --- a/samples/cpp/image.cpp +++ /dev/null @@ -1,135 +0,0 @@ -#include -#include -#include -#include -#include - -using namespace cv; // all the new API is put into "cv" namespace. Export its content -using namespace std; - -static void help() -{ - cout << - "\nThis program shows how to use cv::Mat and IplImages converting back and forth.\n" - "It shows reading of images, converting to planes and merging back, color conversion\n" - "and also iterating through pixels.\n" - "Call:\n" - "./image [image-name Default: ../data/lena.jpg]\n" << endl; -} - -// enable/disable use of mixed API in the code below. -#define DEMO_MIXED_API_USE 1 - -#ifdef DEMO_MIXED_API_USE -# include -# include -#endif - -int main( int argc, char** argv ) -{ - cv::CommandLineParser parser(argc, argv, "{help h | |}{@image|../data/lena.jpg|}"); - if (parser.has("help")) - { - help(); - return 0; - } - string imagename = parser.get("@image"); -#if DEMO_MIXED_API_USE - //! [iplimage] - Ptr iplimg(cvLoadImage(imagename.c_str())); // Ptr is safe ref-counting pointer class - if(!iplimg) - { - fprintf(stderr, "Can not load image %s\n", imagename.c_str()); - return -1; - } - Mat img = cv::cvarrToMat(iplimg); // cv::Mat replaces the CvMat and IplImage, but it's easy to convert - // between the old and the new data structures (by default, only the header - // is converted, while the data is shared) - //! [iplimage] -#else - Mat img = imread(imagename); // the newer cvLoadImage alternative, MATLAB-style function - if(img.empty()) - { - fprintf(stderr, "Can not load image %s\n", imagename.c_str()); - return -1; - } -#endif - - if( img.empty() ) // check if the image has been loaded properly - return -1; - - Mat img_yuv; - cvtColor(img, img_yuv, COLOR_BGR2YCrCb); // convert image to YUV color space. The output image will be created automatically - - vector planes; // Vector is template vector class, similar to STL's vector. It can store matrices too. - split(img_yuv, planes); // split the image into separate color planes - -#if 1 - // method 1. process Y plane using an iterator - MatIterator_ it = planes[0].begin(), it_end = planes[0].end(); - for(; it != it_end; ++it) - { - double v = *it*1.7 + rand()%21-10; - *it = saturate_cast(v*v/255.); - } - - // method 2. process the first chroma plane using pre-stored row pointer. - // method 3. process the second chroma plane using individual element access - for( int y = 0; y < img_yuv.rows; y++ ) - { - uchar* Uptr = planes[1].ptr(y); - for( int x = 0; x < img_yuv.cols; x++ ) - { - Uptr[x] = saturate_cast((Uptr[x]-128)/2 + 128); - uchar& Vxy = planes[2].at(y, x); - Vxy = saturate_cast((Vxy-128)/2 + 128); - } - } - -#else - Mat noise(img.size(), CV_8U); // another Mat constructor; allocates a matrix of the specified size and type - randn(noise, Scalar::all(128), Scalar::all(20)); // fills the matrix with normally distributed random values; - // there is also randu() for uniformly distributed random number generation - GaussianBlur(noise, noise, Size(3, 3), 0.5, 0.5); // blur the noise a bit, kernel size is 3x3 and both sigma's are set to 0.5 - - const double brightness_gain = 0; - const double contrast_gain = 1.7; -#if DEMO_MIXED_API_USE - // it's easy to pass the new matrices to the functions that only work with IplImage or CvMat: - // step 1) - convert the headers, data will not be copied - IplImage cv_planes_0 = planes[0], cv_noise = noise; - // step 2) call the function; do not forget unary "&" to form pointers - cvAddWeighted(&cv_planes_0, contrast_gain, &cv_noise, 1, -128 + brightness_gain, &cv_planes_0); -#else - addWeighted(planes[0], contrast_gain, noise, 1, -128 + brightness_gain, planes[0]); -#endif - const double color_scale = 0.5; - // Mat::convertTo() replaces cvConvertScale. One must explicitly specify the output matrix type (we keep it intact - planes[1].type()) - planes[1].convertTo(planes[1], planes[1].type(), color_scale, 128*(1-color_scale)); - // alternative form of cv::convertScale if we know the datatype at compile time ("uchar" here). - // This expression will not create any temporary arrays and should be almost as fast as the above variant - planes[2] = Mat_(planes[2]*color_scale + 128*(1-color_scale)); - - // Mat::mul replaces cvMul(). Again, no temporary arrays are created in case of simple expressions. - planes[0] = planes[0].mul(planes[0], 1./255); -#endif - - // now merge the results back - merge(planes, img_yuv); - // and produce the output RGB image - cvtColor(img_yuv, img, COLOR_YCrCb2BGR); - - // this is counterpart for cvNamedWindow - namedWindow("image with grain", WINDOW_AUTOSIZE); -#if DEMO_MIXED_API_USE - // this is to demonstrate that img and iplimg really share the data - the result of the above - // processing is stored in img and thus in iplimg too. - cvShowImage("image with grain", iplimg); -#else - imshow("image with grain", img); -#endif - waitKey(); - - return 0; - // all the memory will automatically be released by Vector<>, Mat and Ptr<> destructors. -} diff --git a/samples/cpp/tutorial_code/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.cpp b/samples/cpp/tutorial_code/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.cpp deleted file mode 100644 index 4a65456a89..0000000000 --- a/samples/cpp/tutorial_code/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.cpp +++ /dev/null @@ -1,149 +0,0 @@ -//! [head] -#include - -#include -#include "opencv2/imgcodecs.hpp" -#include - -using namespace cv; // The new C++ interface API is inside this namespace. Import it. -using namespace std; -//! [head] - -static void help( char* progName) -{ - cout << endl << progName - << " shows how to use cv::Mat and IplImages together (converting back and forth)." << endl - << "Also contains example for image read, splitting the planes, merging back and " << endl - << " color conversion, plus iterating through pixels. " << endl - << "Usage:" << endl - << progName << " [image-name Default: ../data/lena.jpg]" << endl << endl; -} - -//! [start] -// comment out the define to use only the latest C++ API -#define DEMO_MIXED_API_USE - -#ifdef DEMO_MIXED_API_USE -# include -# include -#endif - -int main( int argc, char** argv ) -{ - help(argv[0]); - const char* imagename = argc > 1 ? argv[1] : "../data/lena.jpg"; - -#ifdef DEMO_MIXED_API_USE - Ptr IplI(cvLoadImage(imagename)); // Ptr is a safe ref-counting pointer class - if(!IplI) - { - cerr << "Can not load image " << imagename << endl; - return -1; - } - Mat I = cv::cvarrToMat(IplI); // Convert to the new style container. Only header created. Image not copied. -#else - Mat I = imread(imagename); // the newer cvLoadImage alternative, MATLAB-style function - if( I.empty() ) // same as if( !I.data ) - { - cerr << "Can not load image " << imagename << endl; - return -1; - } -#endif -//! [start] - - //! [new] - // convert image to YUV color space. The output image will be created automatically. - Mat I_YUV; - cvtColor(I, I_YUV, COLOR_BGR2YCrCb); - - vector planes; // Use the STL's vector structure to store multiple Mat objects - split(I_YUV, planes); // split the image into separate color planes (Y U V) - //! [new] - -#if 1 // change it to 0 if you want to see a blurred and noisy version of this processing - //! [scanning] - // Mat scanning - // Method 1. process Y plane using an iterator - MatIterator_ it = planes[0].begin(), it_end = planes[0].end(); - for(; it != it_end; ++it) - { - double v = *it * 1.7 + rand()%21 - 10; - *it = saturate_cast(v*v/255); - } - - for( int y = 0; y < I_YUV.rows; y++ ) - { - // Method 2. process the first chroma plane using pre-stored row pointer. - uchar* Uptr = planes[1].ptr(y); - for( int x = 0; x < I_YUV.cols; x++ ) - { - Uptr[x] = saturate_cast((Uptr[x]-128)/2 + 128); - - // Method 3. process the second chroma plane using individual element access - uchar& Vxy = planes[2].at(y, x); - Vxy = saturate_cast((Vxy-128)/2 + 128); - } - } - //! [scanning] - -#else - - //! [noisy] - Mat noisyI(I.size(), CV_8U); // Create a matrix of the specified size and type - - // Fills the matrix with normally distributed random values (around number with deviation off). - // There is also randu() for uniformly distributed random number generation - randn(noisyI, Scalar::all(128), Scalar::all(20)); - - // blur the noisyI a bit, kernel size is 3x3 and both sigma's are set to 0.5 - GaussianBlur(noisyI, noisyI, Size(3, 3), 0.5, 0.5); - - const double brightness_gain = 0; - const double contrast_gain = 1.7; - -#ifdef DEMO_MIXED_API_USE - // To pass the new matrices to the functions that only work with IplImage or CvMat do: - // step 1) Convert the headers (tip: data will not be copied). - // step 2) call the function (tip: to pass a pointer do not forget unary "&" to form pointers) - - IplImage cv_planes_0 = planes[0], cv_noise = noisyI; - cvAddWeighted(&cv_planes_0, contrast_gain, &cv_noise, 1, -128 + brightness_gain, &cv_planes_0); -#else - addWeighted(planes[0], contrast_gain, noisyI, 1, -128 + brightness_gain, planes[0]); -#endif - - const double color_scale = 0.5; - // Mat::convertTo() replaces cvConvertScale. - // One must explicitly specify the output matrix type (we keep it intact - planes[1].type()) - planes[1].convertTo(planes[1], planes[1].type(), color_scale, 128*(1-color_scale)); - - // alternative form of cv::convertScale if we know the datatype at compile time ("uchar" here). - // This expression will not create any temporary arrays ( so should be almost as fast as above) - planes[2] = Mat_(planes[2]*color_scale + 128*(1-color_scale)); - - // Mat::mul replaces cvMul(). Again, no temporary arrays are created in case of simple expressions. - planes[0] = planes[0].mul(planes[0], 1./255); - //! [noisy] -#endif - - - //! [end] - merge(planes, I_YUV); // now merge the results back - cvtColor(I_YUV, I, COLOR_YCrCb2BGR); // and produce the output RGB image - - namedWindow("image with grain", WINDOW_AUTOSIZE); // use this to create images - -#ifdef DEMO_MIXED_API_USE - // this is to demonstrate that I and IplI really share the data - the result of the above - // processing is stored in I and thus in IplI too. - cvShowImage("image with grain", IplI); -#else - imshow("image with grain", I); // the new MATLAB style function show -#endif - //! [end] - waitKey(); - - // Tip: No memory freeing is required! - // All the memory will be automatically released by the Vector<>, Mat and Ptr<> destructor. - return 0; -} diff --git a/samples/cpp/tutorial_code/core/mat_operations/mat_operations.cpp b/samples/cpp/tutorial_code/core/mat_operations/mat_operations.cpp index f40c804cf4..a4efe30be6 100644 --- a/samples/cpp/tutorial_code/core/mat_operations/mat_operations.cpp +++ b/samples/cpp/tutorial_code/core/mat_operations/mat_operations.cpp @@ -1,7 +1,6 @@ /* Snippet code for Operations with images tutorial (not intended to be run but should built successfully) */ #include "opencv2/core.hpp" -#include "opencv2/core/core_c.h" #include "opencv2/imgcodecs.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" @@ -128,15 +127,6 @@ int main(int,char**) CV_UNUSED(smallImg); } } - { - //! [C-API conversion] - Mat img = imread("image.jpg"); - IplImage img1 = img; - CvMat m = img; - //! [C-API conversion] - CV_UNUSED(img1); - CV_UNUSED(m); - } { //! [BGR to Gray] Mat img = imread("image.jpg"); // loading a 8UC3 image