Merge remote-tracking branch 'upstream/3.4' into merge-3.4
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>
Sat, 17 Nov 2018 13:50:04 +0000 (13:50 +0000)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Sat, 17 Nov 2018 14:17:35 +0000 (14:17 +0000)
59 files changed:
1  2 
CMakeLists.txt
cmake/OpenCVGenSetupVars.cmake
cmake/OpenCVUtils.cmake
doc/Doxyfile.in
doc/tutorials/introduction/cross_referencing/tutorial_cross_referencing.markdown
doc/tutorials/videoio/intelperc.markdown
doc/tutorials/videoio/kinect_openni.markdown
modules/core/CMakeLists.txt
modules/core/include/opencv2/core.hpp
modules/core/include/opencv2/core/cvdef.h
modules/core/include/opencv2/core/private.hpp
modules/core/include/opencv2/core/utility.hpp
modules/core/src/utils/filesystem.cpp
modules/dnn/include/opencv2/dnn/all_layers.hpp
modules/dnn/include/opencv2/dnn/dict.hpp
modules/dnn/include/opencv2/dnn/dnn.hpp
modules/dnn/src/dnn.cpp
modules/dnn/src/layers/concat_layer.cpp
modules/dnn/src/layers/convolution_layer.cpp
modules/dnn/src/layers/detection_output_layer.cpp
modules/dnn/src/layers/eltwise_layer.cpp
modules/dnn/src/layers/lrn_layer.cpp
modules/dnn/src/layers/permute_layer.cpp
modules/dnn/src/layers/pooling_layer.cpp
modules/dnn/src/layers/prior_box_layer.cpp
modules/dnn/src/layers/recurrent_layers.cpp
modules/dnn/src/layers/softmax_layer.cpp
modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp
modules/dnn/src/onnx/onnx_importer.cpp
modules/dnn/src/op_inf_engine.cpp
modules/dnn/src/op_inf_engine.hpp
modules/dnn/src/tensorflow/tf_importer.cpp
modules/dnn/test/test_backends.cpp
modules/dnn/test/test_common.hpp
modules/dnn/test/test_misc.cpp
modules/features2d/test/test_matchers_algorithmic.cpp
modules/imgproc/src/smooth.cpp
modules/python/bindings/CMakeLists.txt
modules/python/package/setup.py
modules/python/src2/hdr_parser.py
platforms/maven/opencv-it/pom.xml
platforms/maven/opencv/pom.xml
platforms/maven/pom.xml
samples/_winpack_run_python_sample.cmd
samples/cpp/calibration.cpp
samples/cpp/detect_blob.cpp
samples/cpp/detect_mser.cpp
samples/cpp/facial_features.cpp
samples/cpp/mask_tmpl.cpp
samples/cpp/stitching.cpp
samples/cpp/stitching_detailed.cpp
samples/python/tutorial_code/ImgTrans/distance_transformation/imageSegmentation.py
samples/python/tutorial_code/ShapeDescriptors/bounding_rects_circles/generalContours_demo1.py
samples/python/tutorial_code/ShapeDescriptors/bounding_rotated_ellipses/generalContours_demo2.py
samples/python/tutorial_code/ShapeDescriptors/find_contours/findContours_demo.py
samples/python/tutorial_code/ShapeDescriptors/hull/hull_demo.py
samples/python/tutorial_code/ShapeDescriptors/moments/moments_demo.py
samples/python/tutorial_code/ml/introduction_to_pca/introduction_to_pca.py
samples/tapi/hog.cpp

diff --cc CMakeLists.txt
@@@ -445,22 -452,25 +445,23 @@@ else(
      ocv_update(OPENCV_JAR_INSTALL_PATH java)
      ocv_update(OPENCV_OTHER_INSTALL_PATH   etc)
      ocv_update(OPENCV_CONFIG_INSTALL_PATH  ".")
 +    ocv_update(OPENCV_INCLUDE_INSTALL_PATH "include")
 +    ocv_update(OPENCV_LICENSES_INSTALL_PATH "${OPENCV_OTHER_INSTALL_PATH}/licenses")
    else()
 +    # Note: layout differs from OpenCV 3.4
      include(GNUInstallDirs)
 -    ocv_update(OPENCV_LIB_INSTALL_PATH     ${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX})
 -    ocv_update(OPENCV_3P_LIB_INSTALL_PATH  share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH})
 -    ocv_update(OPENCV_SAMPLES_SRC_INSTALL_PATH    share/OpenCV/samples)
 -    ocv_update(OPENCV_JAR_INSTALL_PATH share/OpenCV/java)
 -    ocv_update(OPENCV_OTHER_INSTALL_PATH   share/OpenCV)
 -
 -    if(NOT DEFINED OPENCV_CONFIG_INSTALL_PATH)
 -      math(EXPR SIZEOF_VOID_P_BITS "8 * ${CMAKE_SIZEOF_VOID_P}")
 -      if(LIB_SUFFIX AND NOT SIZEOF_VOID_P_BITS EQUAL LIB_SUFFIX)
 -        ocv_update(OPENCV_CONFIG_INSTALL_PATH ${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX}/cmake/opencv)
 -      else()
 -        ocv_update(OPENCV_CONFIG_INSTALL_PATH share/OpenCV)
 -      endif()
 -    endif()
 +    ocv_update(OPENCV_INCLUDE_INSTALL_PATH       "${CMAKE_INSTALL_INCLUDEDIR}/opencv4")
 +    ocv_update(OPENCV_LIB_INSTALL_PATH           "${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX}")
 +    ocv_update(OPENCV_CONFIG_INSTALL_PATH        "${OPENCV_LIB_INSTALL_PATH}/cmake/opencv4")
 +    ocv_update(OPENCV_3P_LIB_INSTALL_PATH        "${OPENCV_LIB_INSTALL_PATH}/opencv4/3rdparty")
 +    ocv_update(OPENCV_SAMPLES_SRC_INSTALL_PATH   "${CMAKE_INSTALL_DATAROOTDIR}/opencv4/samples")
 +    ocv_update(OPENCV_DOC_INSTALL_PATH           "${CMAKE_INSTALL_DATAROOTDIR}/doc/opencv4")
 +    ocv_update(OPENCV_JAR_INSTALL_PATH           "${CMAKE_INSTALL_DATAROOTDIR}/java/opencv4")
 +    ocv_update(OPENCV_TEST_DATA_INSTALL_PATH     "${CMAKE_INSTALL_DATAROOTDIR}/opencv4/testdata")
 +    ocv_update(OPENCV_OTHER_INSTALL_PATH         "${CMAKE_INSTALL_DATAROOTDIR}/opencv4")
 +    ocv_update(OPENCV_LICENSES_INSTALL_PATH      "${CMAKE_INSTALL_DATAROOTDIR}/licenses/opencv4")
    endif()
 -  ocv_update(OPENCV_INCLUDE_INSTALL_PATH "include")
+   ocv_update(OPENCV_PYTHON_INSTALL_PATH  "python")
  endif()
  
  ocv_update(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH}")
Simple merge
Simple merge
diff --cc doc/Doxyfile.in
Simple merge
@@@ -36,14 -36,14 +36,14 @@@ Open your Doxyfile using your favorite 
  `TAGFILES`. Change it as follows:
  
  @code
- TAGFILES = ./docs/doxygen-tags/opencv.tag=http://docs.opencv.org/3.4.3
 -TAGFILES = ./docs/doxygen-tags/opencv.tag=http://docs.opencv.org/3.4.4
++TAGFILES = ./docs/doxygen-tags/opencv.tag=http://docs.opencv.org/4.0.0
  @endcode
  
  If you had other definitions already, you can append the line using a `\`:
  
  @code
  TAGFILES = ./docs/doxygen-tags/libstdc++.tag=https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen \
-            ./docs/doxygen-tags/opencv.tag=http://docs.opencv.org/3.4.3
 -           ./docs/doxygen-tags/opencv.tag=http://docs.opencv.org/3.4.4
++           ./docs/doxygen-tags/opencv.tag=http://docs.opencv.org/4.0.0
  @endcode
  
  Doxygen can now use the information from the tag file to link to the OpenCV
@@@ -78,5 -78,5 +78,5 @@@ there are two flags that should be use
      flag value is assumed by default if neither of the two possible values of the property is set.
  
  For more information please refer to the example of usage
- [intelperc_capture.cpp](https://github.com/opencv/opencv/tree/master/samples/cpp/intelperc_capture.cpp)
 -[videocapture_intelperc.cpp](https://github.com/opencv/opencv/tree/3.4/samples/cpp/videocapture_intelperc.cpp)
++[videocapture_intelperc.cpp](https://github.com/opencv/opencv/tree/master/samples/cpp/videocapture_intelperc.cpp)
  in opencv/samples/cpp folder.
@@@ -134,5 -134,5 +134,5 @@@ property. The following properties of c
      -   CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_REGISTRATION
  
  For more information please refer to the example of usage
- [openni_capture.cpp](https://github.com/opencv/opencv/tree/master/samples/cpp/openni_capture.cpp) in
 -[videocapture_openni.cpp](https://github.com/opencv/opencv/tree/3.4/samples/cpp/videocapture_openni.cpp) in
++[videocapture_openni.cpp](https://github.com/opencv/opencv/tree/master/samples/cpp/videocapture_openni.cpp) in
  opencv/samples/cpp folder.
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -105,9 -104,8 +105,9 @@@ public
      virtual bool supportBackend(int backendId) CV_OVERRIDE
      {
          return backendId == DNN_BACKEND_OPENCV ||
-                backendId == DNN_BACKEND_HALIDE && haveHalide() && axis == 1 && !padding ||  // By channels
-                backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() && !padding ||
-                backendId == DNN_BACKEND_VKCOM && haveVulkan() && !padding;
+                (backendId == DNN_BACKEND_HALIDE && haveHalide() && axis == 1 && !padding) ||  // By channels
 -               (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() && !padding);
++               (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() && !padding) ||
++               (backendId == DNN_BACKEND_VKCOM && haveVulkan() && !padding);
      }
  
      class ChannelConcatInvoker : public ParallelLoopBody
@@@ -223,9 -222,7 +223,9 @@@ public
          if (backendId == DNN_BACKEND_INFERENCE_ENGINE)
              return preferableTarget != DNN_TARGET_MYRIAD || dilation.width == dilation.height;
          else
 -            return backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_HALIDE;
 +            return backendId == DNN_BACKEND_OPENCV ||
 +                   backendId == DNN_BACKEND_HALIDE ||
-                    backendId == DNN_BACKEND_VKCOM && haveVulkan();
++                   (backendId == DNN_BACKEND_VKCOM && haveVulkan());
      }
  
      bool getMemoryShapes(const std::vector<MatShape> &inputs,
@@@ -93,8 -92,7 +93,8 @@@ public
      {
          return backendId == DNN_BACKEND_OPENCV ||
                 backendId == DNN_BACKEND_HALIDE ||
-                backendId == DNN_BACKEND_INFERENCE_ENGINE && (preferableTarget != DNN_TARGET_MYRIAD || type == CHANNEL_NRM) ||
-                backendId == DNN_BACKEND_VKCOM && haveVulkan() && (size % 2 == 1) && (type == CHANNEL_NRM);
 -               (backendId == DNN_BACKEND_INFERENCE_ENGINE && (preferableTarget != DNN_TARGET_MYRIAD || type == CHANNEL_NRM));
++               (backendId == DNN_BACKEND_INFERENCE_ENGINE && (preferableTarget != DNN_TARGET_MYRIAD || type == CHANNEL_NRM)) ||
++               (backendId == DNN_BACKEND_VKCOM && haveVulkan() && (size % 2 == 1) && (type == CHANNEL_NRM));
      }
  
  #ifdef HAVE_OPENCL
@@@ -106,8 -105,7 +106,8 @@@ public
      virtual bool supportBackend(int backendId) CV_OVERRIDE
      {
          return backendId == DNN_BACKEND_OPENCV ||
-                backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() ||
-                backendId == DNN_BACKEND_VKCOM && haveVulkan();
 -               (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine());
++               (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine()) ||
++               (backendId == DNN_BACKEND_VKCOM && haveVulkan());
      }
  
      bool getMemoryShapes(const std::vector<MatShape> &inputs,
@@@ -155,10 -154,8 +155,10 @@@ public
          }
          else
              return backendId == DNN_BACKEND_OPENCV ||
-                    backendId == DNN_BACKEND_HALIDE && haveHalide() &&
-                    (type == MAX || type == AVE && !pad_t && !pad_l && !pad_b && !pad_r) ||
-                    backendId == DNN_BACKEND_VKCOM && haveVulkan() &&
-                    (type == MAX || type == AVE);
+                    (backendId == DNN_BACKEND_HALIDE && haveHalide() &&
 -                   (type == MAX || (type == AVE && !pad_t && !pad_l && !pad_b && !pad_r)));
++                       (type == MAX || (type == AVE && !pad_t && !pad_l && !pad_b && !pad_r))) ||
++                   (backendId == DNN_BACKEND_VKCOM && haveVulkan() &&
++                       (type == MAX || type == AVE));
      }
  
  #ifdef HAVE_OPENCL
@@@ -272,8 -271,7 +272,8 @@@ public
      virtual bool supportBackend(int backendId) CV_OVERRIDE
      {
          return backendId == DNN_BACKEND_OPENCV ||
-                backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() ||
-                backendId == DNN_BACKEND_VKCOM && haveVulkan();
 -               (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine());
++               (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine()) ||
++               (backendId == DNN_BACKEND_VKCOM && haveVulkan());
      }
  
      bool getMemoryShapes(const std::vector<MatShape> &inputs,
@@@ -90,9 -89,8 +90,9 @@@ public
      virtual bool supportBackend(int backendId) CV_OVERRIDE
      {
          return backendId == DNN_BACKEND_OPENCV ||
-                backendId == DNN_BACKEND_HALIDE && haveHalide() && axisRaw == 1 ||
-                backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() && !logSoftMax ||
-                backendId == DNN_BACKEND_VKCOM && haveVulkan();
+                (backendId == DNN_BACKEND_HALIDE && haveHalide() && axisRaw == 1) ||
 -               (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() && !logSoftMax);
++               (backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() && !logSoftMax) ||
++               (backendId == DNN_BACKEND_VKCOM && haveVulkan());
      }
  
  #ifdef HAVE_OPENCL
@@@ -307,12 -307,12 +307,12 @@@ void InfEngineBackendNet::setTargetDevi
      targetDevice = device;
  }
  
 -InferenceEngine::TargetDevice InfEngineBackendNet::getTargetDevice() noexcept
 +InferenceEngine::TargetDevice InfEngineBackendNet::getTargetDevice() CV_NOEXCEPT
  {
-     return targetDevice;
+     return const_cast<const InfEngineBackendNet*>(this)->getTargetDevice();
  }
  
 -InferenceEngine::TargetDevice InfEngineBackendNet::getTargetDevice() const noexcept
 +InferenceEngine::TargetDevice InfEngineBackendNet::getTargetDevice() const CV_NOEXCEPT
  {
      return targetDevice;
  }
Simple merge
Simple merge
@@@ -55,9 -55,8 +55,9 @@@ static inline void PrintTo(const cv::dn
      case DNN_BACKEND_HALIDE: *os << "HALIDE"; return;
      case DNN_BACKEND_INFERENCE_ENGINE: *os << "DLIE"; return;
      case DNN_BACKEND_OPENCV: *os << "OCV"; return;
 +    case DNN_BACKEND_VKCOM: *os << "VKCOM"; return;
      } // don't use "default:" to emit compiler warnings
-     *os << "DNN_BACKEND_UNKNOWN(" << v << ")";
+     *os << "DNN_BACKEND_UNKNOWN(" << (int)v << ")";
  }
  
  static inline void PrintTo(const cv::dnn::Target& v, std::ostream* os)
@@@ -67,9 -66,8 +67,9 @@@
      case DNN_TARGET_OPENCL: *os << "OCL"; return;
      case DNN_TARGET_OPENCL_FP16: *os << "OCL_FP16"; return;
      case DNN_TARGET_MYRIAD: *os << "MYRIAD"; return;
 +    case DNN_TARGET_VULKAN: *os << "VULKAN"; return;
      } // don't use "default:" to emit compiler warnings
-     *os << "DNN_TARGET_UNKNOWN(" << v << ")";
+     *os << "DNN_TARGET_UNKNOWN(" << (int)v << ")";
  }
  
  using opencv_test::tuple;
@@@ -237,11 -235,11 +237,12 @@@ namespace opencv_test 
  
  using namespace cv::dnn;
  
- static testing::internal::ParamGenerator<tuple<Backend, Target> > dnnBackendsAndTargets(
+ static inline
+ testing::internal::ParamGenerator<tuple<Backend, Target> > dnnBackendsAndTargets(
          bool withInferenceEngine = true,
          bool withHalide = false,
 -        bool withCpuOCV = true
 +        bool withCpuOCV = true,
 +        bool withVkCom = true
  )
  {
      std::vector<tuple<Backend, Target> > targets;
Simple merge
@@@ -558,41 -558,23 +558,60 @@@ TEST( Features2d_DMatch, read_write 
      ASSERT_NE( strstr(str.c_str(), "4.5"), (char*)0 );
  }
  
 +TEST( Features2d_FlannBasedMatcher, read_write )
 +{
 +    static const char* ymlfile = "%YAML:1.0\n---\n"
 +    "format: 3\n"
 +    "indexParams:\n"
 +    "   -\n"
 +    "      name: algorithm\n"
 +    "      type: 9\n"  // FLANN_INDEX_TYPE_ALGORITHM
 +    "      value: 6\n"// this line is changed!
 +    "   -\n"
 +    "      name: trees\n"
 +    "      type: 4\n"
 +    "      value: 4\n"
 +    "searchParams:\n"
 +    "   -\n"
 +    "      name: checks\n"
 +    "      type: 4\n"
 +    "      value: 32\n"
 +    "   -\n"
 +    "      name: eps\n"
 +    "      type: 5\n"
 +    "      value: 4.\n"// this line is changed!
 +    "   -\n"
 +    "      name: sorted\n"
 +    "      type: 8\n"    // FLANN_INDEX_TYPE_BOOL
 +    "      value: 1\n";
 +
 +    Ptr<DescriptorMatcher> matcher = FlannBasedMatcher::create();
 +    FileStorage fs_in(ymlfile, FileStorage::READ + FileStorage::MEMORY);
 +    matcher->read(fs_in.root());
 +    FileStorage fs_out(".yml", FileStorage::WRITE + FileStorage::MEMORY);
 +    matcher->write(fs_out);
 +    std::string out = fs_out.releaseAndGetString();
 +
 +    EXPECT_EQ(ymlfile, out);
 +}
 +
+ TEST(Features2d_DMatch, issue_11855)
+ {
+     Mat sources = (Mat_<uchar>(2, 3) << 1, 1, 0,
+                                         1, 1, 1);
+     Mat targets = (Mat_<uchar>(2, 3) << 1, 1, 1,
+                                         0, 0, 0);
+     Ptr<BFMatcher> bf = BFMatcher::create(NORM_HAMMING, true);
+     vector<vector<DMatch> > match;
+     bf->knnMatch(sources, targets, match, 1, noArray(), true);
+     ASSERT_EQ((size_t)1, match.size());
+     ASSERT_EQ((size_t)1, match[0].size());
+     EXPECT_EQ(1, match[0][0].queryIdx);
+     EXPECT_EQ(0, match[0][0].trainIdx);
+     EXPECT_EQ(0.0f, match[0][0].distance);
+ }
  }} // namespace
Simple merge
@@@ -42,11 -42,8 +42,12 @@@ ocv_list_filterout(opencv_hdrs "modules
  ocv_list_filterout(opencv_hdrs "modules/.*_inl\\\\.h*")
  ocv_list_filterout(opencv_hdrs "modules/.*\\\\.details\\\\.h*")
  ocv_list_filterout(opencv_hdrs "modules/.*\\\\.private\\\\.h*")
+ ocv_list_filterout(opencv_hdrs "modules/.*/private\\\\.h*")
  ocv_list_filterout(opencv_hdrs "modules/.*/detection_based_tracker\\\\.hpp") # Conditional compilation
 +if(NOT HAVE_CUDA)
 +  ocv_list_filterout(opencv_hdrs "modules/cuda.*")
 +  ocv_list_filterout(opencv_hdrs "modules/cudev")
 +endif()
  
  set(cv2_generated_files
      "${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_include.h"
index 0000000,cdf1093..1c0637c
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,57 +1,57 @@@
 -    package_version = os.environ.get('OPENCV_VERSION', '3.4.4')  # TODO
+ import os
+ import sys
+ import platform
+ import setuptools
+ SCRIPT_DIR=os.path.dirname(os.path.abspath(__file__))
+ def main():
+     os.chdir(SCRIPT_DIR)
+     package_name = 'opencv'
++    package_version = os.environ.get('OPENCV_VERSION', '4.0.0')  # TODO
+     long_description = 'Open Source Computer Vision Library Python bindings'  # TODO
+     setuptools.setup(
+         name=package_name,
+         version=package_version,
+         url='https://github.com/opencv/opencv',
+         license='BSD',
+         description='OpenCV python bindings',
+         long_description=long_description,
+         long_description_content_type="text/markdown",
+         packages=setuptools.find_packages(),
+         maintainer="OpenCV Team",
+         install_requires="numpy",
+         classifiers=[
+           'Development Status :: 5 - Production/Stable',
+           'Environment :: Console',
+           'Intended Audience :: Developers',
+           'Intended Audience :: Education',
+           'Intended Audience :: Information Technology',
+           'Intended Audience :: Science/Research',
+           'License :: BSD License',
+           'Operating System :: MacOS',
+           'Operating System :: Microsoft :: Windows',
+           'Operating System :: POSIX',
+           'Operating System :: Unix',
+           'Programming Language :: Python',
+           'Programming Language :: Python :: 2',
+           'Programming Language :: Python :: 2.7',
+           'Programming Language :: Python :: 3',
+           'Programming Language :: Python :: 3.4',
+           'Programming Language :: Python :: 3.5',
+           'Programming Language :: Python :: 3.6',
+           'Programming Language :: Python :: 3.7',
+           'Programming Language :: C++',
+           'Programming Language :: Python :: Implementation :: CPython',
+           'Topic :: Scientific/Engineering',
+           'Topic :: Scientific/Engineering :: Image Recognition',
+           'Topic :: Software Development',
+           'Topic :: Software Development :: Libraries',
+         ],
+     )
+ if __name__ == '__main__':
+     main()
Simple merge
@@@ -4,7 -4,7 +4,7 @@@
      <parent>
          <groupId>org.opencv</groupId>
          <artifactId>opencv-parent</artifactId>
-         <version>3.4.3</version>
 -        <version>3.4.4</version>
++        <version>4.0.0</version>
      </parent>
      <groupId>org.opencv</groupId>
      <artifactId>opencv-it</artifactId>
@@@ -4,7 -4,7 +4,7 @@@
      <parent>
          <groupId>org.opencv</groupId>
          <artifactId>opencv-parent</artifactId>
-         <version>3.4.3</version>
 -        <version>3.4.4</version>
++        <version>4.0.0</version>
      </parent>
      <groupId>org.opencv</groupId>
      <artifactId>opencv</artifactId>
@@@ -3,7 -3,7 +3,7 @@@
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.opencv</groupId>
      <artifactId>opencv-parent</artifactId>
-     <version>3.4.3</version>
 -    <version>3.4.4</version>
++    <version>4.0.0</version>
      <packaging>pom</packaging>
      <name>OpenCV Parent POM</name>
      <licenses>
index 0000000,5e84e2e..b7075e3
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,124 +1,124 @@@
 -IF NOT EXIST "%SCRIPT_DIR%\..\..\build\setup_vars_opencv3.cmd" (
+ @ECHO OFF
+ SETLOCAL
+ SET SCRIPT_DIR=%~dp0
 -CALL "%SCRIPT_DIR%\..\..\build\setup_vars_opencv3.cmd"
++IF NOT EXIST "%SCRIPT_DIR%\..\..\build\setup_vars_opencv4.cmd" (
+   ECHO ERROR: OpenCV Winpack installation is required
+   pause
+   exit
+ )
+ :: Detect Python binary
+ python -V 2>nul
+ IF %ERRORLEVEL% EQU 0 (
+   SET PYTHON=python
+   GOTO :PYTHON_FOUND
+ )
+ CALL :QUERY_PYTHON 3.7
+ IF %ERRORLEVEL% EQU 0 GOTO :PYTHON_FOUND
+ CALL :QUERY_PYTHON 3.6
+ IF %ERRORLEVEL% EQU 0 GOTO :PYTHON_FOUND
+ CALL :QUERY_PYTHON 3.5
+ IF %ERRORLEVEL% EQU 0 GOTO :PYTHON_FOUND
+ CALL :QUERY_PYTHON 3.4
+ IF %ERRORLEVEL% EQU 0 GOTO :PYTHON_FOUND
+ CALL :QUERY_PYTHON 2.7
+ IF %ERRORLEVEL% EQU 0 GOTO :PYTHON_FOUND
+ GOTO :PYTHON_NOT_FOUND
+ :QUERY_PYTHON
+ SETLOCAL
+ SET PY_VERSION=%1
+ SET PYTHON_DIR=
+ CALL :regquery "HKCU\SOFTWARE\Python\PythonCore\%PY_VERSION%\InstallPath" PYTHON_DIR
+ IF EXIST "%PYTHON_DIR%\python.exe" (
+   SET "PYTHON=%PYTHON_DIR%\python.exe"
+   GOTO :QUERY_PYTHON_FOUND
+ )
+ CALL :regquery "HKLM\SOFTWARE\Python\PythonCore\%PY_VERSION%\InstallPath" PYTHON_DIR
+ IF EXIST "%PYTHON_DIR%\python.exe" (
+   SET "PYTHON=%PYTHON_DIR%\python.exe"
+   GOTO :QUERY_PYTHON_FOUND
+ )
+ ::echo Python %PY_VERSION% is not detected
+ ENDLOCAL
+ EXIT /B 1
+ :QUERY_PYTHON_FOUND
+ ECHO Found Python %PY_VERSION% from Windows Registry: %PYTHON%
+ ENDLOCAL & SET PYTHON=%PYTHON%
+ EXIT /B 0
+ IF exist C:\Python27-x64\python.exe (
+   SET PYTHON=C:\Python27-x64\python.exe
+   GOTO :PYTHON_FOUND
+ )
+ IF exist C:\Python27\python.exe (
+   SET PYTHON=C:\Python27\python.exe
+   GOTO :PYTHON_FOUND
+ )
+ :PYTHON_NOT_FOUND
+ ECHO ERROR: Python not found
+ IF NOT DEFINED OPENCV_BATCH_MODE ( pause )
+ EXIT /B
+ :PYTHON_FOUND
+ ECHO Using Python: %PYTHON%
+ :: Don't generate unnecessary .pyc cache files
+ SET PYTHONDONTWRITEBYTECODE=1
+ IF [%1]==[] goto rundemo
+ set SRC_FILENAME=%~dpnx1
+ echo SRC_FILENAME=%SRC_FILENAME%
+ call :dirname "%SRC_FILENAME%" SRC_DIR
+ call :dirname "%PYTHON%" PYTHON_DIR
+ PUSHD %SRC_DIR%
 -CALL "%SCRIPT_DIR%\..\..\build\setup_vars_opencv3.cmd"
++CALL "%SCRIPT_DIR%\..\..\build\setup_vars_opencv4.cmd"
+ ECHO Run: %*
+ %PYTHON% %*
+ SET result=%errorlevel%
+ IF %result% NEQ 0 (
+   IF NOT DEFINED OPENCV_BATCH_MODE (
+     SET "PATH=%PYTHON_DIR%;%PATH%"
+     echo ================================================================================
+     echo **  Type 'python sample_name.py' to run sample
+     echo **  Type 'exit' to exit from interactive shell and open the build directory
+     echo ================================================================================
+     cmd /k echo Current directory: %CD%
+   )
+ )
+ POPD
+ EXIT /B %result%
+ :rundemo
+ PUSHD "%SCRIPT_DIR%\python"
++CALL "%SCRIPT_DIR%\..\..\build\setup_vars_opencv4.cmd"
+ %PYTHON% demo.py
+ SET result=%errorlevel%
+ IF %result% NEQ 0 (
+   IF NOT DEFINED OPENCV_BATCH_MODE ( pause )
+ )
+ POPD
+ EXIT /B %result%
+ :dirname file resultVar
+   setlocal
+   set _dir=%~dp1
+   set _dir=%_dir:~0,-1%
+   endlocal & set %2=%_dir%
+   EXIT /B 0
+ :regquery name resultVar
+   SETLOCAL
+   FOR /F "tokens=*" %%A IN ('REG QUERY "%1" /reg:64 /ve 2^>NUL ^| FIND "REG_SZ"') DO SET _val=%%A
+   IF "x%_val%x"=="xx" EXIT /B 1
+   SET _val=%_val:*REG_SZ=%
+   FOR /F "tokens=*" %%A IN ("%_val%") DO SET _val=%%A
+   ENDLOCAL & SET %2=%_val%
+   EXIT /B 0
Simple merge
@@@ -123,7 -125,7 +125,7 @@@ int main(int argc, char *argv[]
  
      // These descriptors are going to be detecting and computing BLOBS with 6 different params
      // Param for first BLOB detector we want all
-     typeDesc.push_back("BLOB");    // see http://docs.opencv.org/trunk/d0/d7a/classcv_1_1SimpleBlobDetector.html
 -    typeDesc.push_back("BLOB");    // see http://docs.opencv.org/3.4/d0/d7a/classcv_1_1SimpleBlobDetector.html
++    typeDesc.push_back("BLOB");    // see http://docs.opencv.org/master/d0/d7a/classcv_1_1SimpleBlobDetector.html
      pBLOB.push_back(pDefaultBLOB);
      pBLOB.back().filterByArea = true;
      pBLOB.back().minArea = 1;
Simple merge
Simple merge
@@@ -8,17 -8,27 +8,27 @@@ using namespace cv
  int main( int argc, const char** argv )
  {
      CommandLineParser parser(argc, argv,
-         "{ i | ../data/lena_tmpl.jpg |image name }"
-         "{ t | ../data/tmpl.png |template name }"
-         "{ m | ../data/mask.png |mask name }"
+         "{ i | lena_tmpl.jpg |image name }"
+         "{ t | tmpl.png |template name }"
+         "{ m | mask.png |mask name }"
          "{ cm| 3 |comparison method }");
  
-     cout << "This program demonstrates the use of template matching with mask.\n\n";
+     cout << "This program demonstrates the use of template matching with mask." << endl
+          << endl
 -         << "Available methods: https://docs.opencv.org/3.4/df/dfb/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d" << endl
++         << "Available methods: https://docs.opencv.org/master/df/dfb/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d" << endl
+          << "    TM_SQDIFF = " << (int)TM_SQDIFF << endl
+          << "    TM_SQDIFF_NORMED = " << (int)TM_SQDIFF_NORMED << endl
+          << "    TM_CCORR = " << (int)TM_CCORR << endl
+          << "    TM_CCORR_NORMED = " << (int)TM_CCORR_NORMED << endl
+          << "    TM_CCOEFF = " << (int)TM_CCOEFF << endl
+          << "    TM_CCOEFF_NORMED = " << (int)TM_CCOEFF_NORMED << endl
+          << endl;
      parser.printMessage();
  
-     string filename = parser.get<string>("i");
-     string tmplname = parser.get<string>("t");
-     string maskname = parser.get<string>("m");
+     string filename = samples::findFile(parser.get<string>("i"));
+     string tmplname = samples::findFile(parser.get<string>("t"));
+     string maskname = samples::findFile(parser.get<string>("m"));
      Mat img = imread(filename);
      Mat tmpl = imread(tmplname);
      Mat mask = imread(maskname);
Simple merge
Simple merge
@@@ -61,10 -61,10 +61,10 @@@ int main(int argc, char** argv
          "{ h help      |                | print help message }"
          "{ i input     |                | specify input image}"
          "{ c camera    | -1             | enable camera capturing }"
-         "{ v video     | ../data/vtest.avi | use video as input }"
+         "{ v video     | vtest.avi | use video as input }"
          "{ g gray      |                | convert image to gray one or not}"
          "{ s scale     | 1.0            | resize the image before detect}"
 -        "{ o output    |                | specify output path when input is images}";
 +        "{ o output    |   output.avi   | specify output path when input is images}";
      CommandLineParser cmd(argc, argv, keys);
      if (cmd.has("help"))
      {