Merge remote-tracking branch 'upstream/3.4' into merge-3.4
authorAlexander Alekhin <alexander.alekhin@intel.com>
Mon, 20 Aug 2018 16:29:39 +0000 (19:29 +0300)
committerAlexander Alekhin <alexander.alekhin@intel.com>
Mon, 20 Aug 2018 16:30:18 +0000 (19:30 +0300)
40 files changed:
1  2 
doc/tutorials/core/basic_linear_transform/basic_linear_transform.markdown
doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.markdown
doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown
doc/tutorials/core/how_to_scan_images/how_to_scan_images.markdown
doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown
doc/tutorials/core/how_to_use_ippa_conversion/how_to_use_ippa_conversion.markdown
doc/tutorials/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.markdown
doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.markdown
doc/tutorials/imgproc/basic_geometric_drawing/basic_geometric_drawing.markdown
doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.markdown
doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown
doc/tutorials/imgproc/histograms/back_projection/back_projection.markdown
doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.markdown
doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.markdown
doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.markdown
doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.markdown
doc/tutorials/imgproc/imgtrans/distance_transformation/distance_transform.markdown
doc/tutorials/imgproc/imgtrans/remap/remap.markdown
doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.markdown
doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.markdown
doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.markdown
doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.markdown
doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.markdown
doc/tutorials/imgproc/shapedescriptors/hull/hull.markdown
doc/tutorials/imgproc/shapedescriptors/moments/moments.markdown
doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.markdown
doc/tutorials/imgproc/threshold/threshold.markdown
doc/tutorials/imgproc/threshold_inRange/threshold_inRange.markdown
doc/tutorials/stitching/stitcher/stitcher.markdown
modules/calib3d/include/opencv2/calib3d.hpp
modules/core/include/opencv2/core.hpp
modules/core/include/opencv2/core/mat.hpp
modules/core/include/opencv2/core/persistence.hpp
modules/highgui/include/opencv2/highgui.hpp
modules/imgproc/include/opencv2/imgproc.hpp
modules/ml/include/opencv2/ml.hpp
modules/ml/src/data.cpp
modules/ml/test/test_mltests2.cpp
modules/objdetect/include/opencv2/objdetect.hpp
modules/photo/include/opencv2/photo.hpp

@@@ -82,20 -81,20 +81,20 @@@ Cod
  
  @add_toggle_cpp
  -   This code is in your OpenCV sample folder. Otherwise you can grab it from
-     [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp)
-     @include samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp
 -    [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp)
++    [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp)
+     @include samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp
  @end_toggle
  
  @add_toggle_java
  -   This code is in your OpenCV sample folder. Otherwise you can grab it from
-     [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java)
-     @include samples/java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java
 -    [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java)
++    [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java)
+     @include samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java
  @end_toggle
  
  @add_toggle_python
  -   This code is in your OpenCV sample folder. Otherwise you can grab it from
-     [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py)
-     @include samples/python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py
 -    [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py)
++    [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py)
+     @include samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py
  @end_toggle
  
  Explanation
Simple merge
@@@ -234,12 -234,23 +234,23 @@@ public
      CV_WRAP virtual void shuffleTrainTest() = 0;
  
      /** @brief Returns matrix of test samples */
 -    CV_WRAP Mat getTestSamples() const;
 +    CV_WRAP virtual Mat getTestSamples() const = 0;
  
      /** @brief Returns vector of symbolic names captured in loadFromCSV() */
 -    CV_WRAP void getNames(std::vector<String>& names) const;
 +    CV_WRAP virtual void getNames(std::vector<String>& names) const = 0;
  
-     CV_WRAP static Mat getSubVector(const Mat& vec, const Mat& idx);
+     /** @brief Extract from 1D vector elements specified by passed indexes.
+     @param vec input vector (supported types: CV_32S, CV_32F, CV_64F)
+     @param idx 1D index vector
+      */
+     static CV_WRAP Mat getSubVector(const Mat& vec, const Mat& idx);
+     /** @brief Extract from matrix rows/cols specified by passed indexes.
+     @param matrix input matrix (supported types: CV_32S, CV_32F, CV_64F)
+     @param idx 1D index vector
+     @param layout specifies to extract rows (cv::ml::ROW_SAMPLES) or to extract columns (cv::ml::COL_SAMPLES)
+      */
+     static CV_WRAP Mat getSubMatrix(const Mat& matrix, const Mat& idx, int layout);
  
      /** @brief Reads the dataset from a .csv file and returns the ready-to-use training data.
  
@@@ -50,69 -52,71 +52,65 @@@ static const int VAR_MISSED = VAR_ORDER
  
  TrainData::~TrainData() {}
  
 -Mat TrainData::getTestSamples() const
 -{
 -    Mat idx = getTestSampleIdx();
 -    Mat samples = getSamples();
 -    return idx.empty() ? Mat() : getSubMatrix(samples, idx, getLayout());
 -}
 -
  Mat TrainData::getSubVector(const Mat& vec, const Mat& idx)
  {
-     if( idx.empty() )
-         return vec;
-     int i, j, n = idx.checkVector(1, CV_32S);
-     int type = vec.type();
-     CV_Assert( type == CV_32S || type == CV_32F || type == CV_64F );
-     int dims = 1, m;
+     if (!(vec.cols == 1 || vec.rows == 1))
+         CV_LOG_WARNING(NULL, "'getSubVector(const Mat& vec, const Mat& idx)' call with non-1D input is deprecated. It is not designed to work with 2D matrixes (especially with 'cv::ml::COL_SAMPLE' layout).");
+     return getSubMatrix(vec, idx, vec.rows == 1 ? cv::ml::COL_SAMPLE : cv::ml::ROW_SAMPLE);
+ }
+ template<typename T>
+ Mat getSubMatrixImpl(const Mat& m, const Mat& idx, int layout)
+ {
+     int nidx = idx.checkVector(1, CV_32S);
+     int dims = m.cols, nsamples = m.rows;
  
-     if( vec.cols == 1 || vec.rows == 1 )
+     Mat subm;
+     if (layout == COL_SAMPLE)
      {
-         dims = 1;
-         m = vec.cols + vec.rows - 1;
+         std::swap(dims, nsamples);
+         subm.create(dims, nidx, m.type());
      }
      else
      {
-         dims = vec.cols;
-         m = vec.rows;
+         subm.create(nidx, dims, m.type());
      }
  
-     Mat subvec;
-     if( vec.cols == m )
-         subvec.create(dims, n, type);
-     else
-         subvec.create(n, dims, type);
-     if( type == CV_32S )
-         for( i = 0; i < n; i++ )
+     for (int i = 0; i < nidx; i++)
+     {
+         int k = idx.at<int>(i); CV_CheckGE(k, 0, "Bad idx"); CV_CheckLT(k, nsamples, "Bad idx or layout");
+         if (dims == 1)
          {
-             int k = idx.at<int>(i);
-             CV_Assert( 0 <= k && k < m );
-             if( dims == 1 )
-                 subvec.at<int>(i) = vec.at<int>(k);
-             else
-                 for( j = 0; j < dims; j++ )
-                     subvec.at<int>(i, j) = vec.at<int>(k, j);
+             subm.at<T>(i) = m.at<T>(k);  // at() has "transparent" access for 1D col-based / row-based vectors.
          }
-     else if( type == CV_32F )
-         for( i = 0; i < n; i++ )
+         else if (layout == COL_SAMPLE)
          {
-             int k = idx.at<int>(i);
-             CV_Assert( 0 <= k && k < m );
-             if( dims == 1 )
-                 subvec.at<float>(i) = vec.at<float>(k);
-             else
-                 for( j = 0; j < dims; j++ )
-                     subvec.at<float>(i, j) = vec.at<float>(k, j);
+             for (int j = 0; j < dims; j++)
+                 subm.at<T>(j, i) = m.at<T>(j, k);
          }
-     else
-         for( i = 0; i < n; i++ )
+         else
          {
-             int k = idx.at<int>(i);
-             CV_Assert( 0 <= k && k < m );
-             if( dims == 1 )
-                 subvec.at<double>(i) = vec.at<double>(k);
-             else
-                 for( j = 0; j < dims; j++ )
-                     subvec.at<double>(i, j) = vec.at<double>(k, j);
+             for (int j = 0; j < dims; j++)
+                 subm.at<T>(i, j) = m.at<T>(k, j);
          }
-     return subvec;
+     }
+     return subm;
+ }
+ Mat TrainData::getSubMatrix(const Mat& m, const Mat& idx, int layout)
+ {
+     if (idx.empty())
+         return m;
+     int type = m.type();
+     CV_CheckType(type, type == CV_32S || type == CV_32F || type == CV_64F, "");
+     if (type == CV_32S || type == CV_32F)  // 32-bit
+         return getSubMatrixImpl<int>(m, idx, layout);
+     if (type == CV_64F)  // 64-bit
+         return getSubMatrixImpl<double>(m, idx, layout);
+     CV_Error(Error::StsInternal, "");
  }
  
 +
  class TrainDataImpl CV_FINAL : public TrainData
  {
  public:
          return layout == ROW_SAMPLE ? samples.cols : samples.rows;
      }
  
-         return idx.empty() ? Mat() : getSubVector(samples, idx);
 +    Mat getTestSamples() const CV_OVERRIDE
 +    {
 +        Mat idx = getTestSampleIdx();
++        return idx.empty() ? Mat() : getSubMatrix(samples, idx, getLayout());
 +    }
 +
      Mat getSamples() const CV_OVERRIDE { return samples; }
      Mat getResponses() const CV_OVERRIDE { return responses; }
      Mat getMissing() const CV_OVERRIDE { return missing; }
Simple merge