From d34717d8c9759f15b3920f428b7616c418e0511c Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sun, 4 Oct 2020 15:11:55 +0000 Subject: [PATCH 1/9] core: allow to disable including of unsupported/Eigen/CXX11/Tensor - define OPENCV_DISABLE_EIGEN_TENSOR_SUPPORT --- modules/core/include/opencv2/core/eigen.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/core/include/opencv2/core/eigen.hpp b/modules/core/include/opencv2/core/eigen.hpp index 3f4be931e6..51f41474bd 100644 --- a/modules/core/include/opencv2/core/eigen.hpp +++ b/modules/core/include/opencv2/core/eigen.hpp @@ -58,11 +58,13 @@ #pragma warning( disable: 4244 ) //conversion from '__int64' to 'int', possible loss of data #endif +#if !defined(OPENCV_DISABLE_EIGEN_TENSOR_SUPPORT) #if EIGEN_WORLD_VERSION == 3 && EIGEN_MAJOR_VERSION >= 3 \ && defined(CV_CXX11) && defined(CV_CXX_STD_ARRAY) #include -#define OPENCV_EIGEN_TENSOR_SUPPORT -#endif // EIGEN_WORLD_VERSION == 3 && EIGEN_MAJOR_VERSION >= 3 +#define OPENCV_EIGEN_TENSOR_SUPPORT 1 +#endif // EIGEN_WORLD_VERSION == 3 && EIGEN_MAJOR_VERSION >= 3 +#endif // !defined(OPENCV_DISABLE_EIGEN_TENSOR_SUPPORT) namespace cv { From 3acf8cfd6343f78dbaf7afb442dfaf5a39b4f2fd Mon Sep 17 00:00:00 2001 From: Rafael Sadowski Date: Sun, 4 Oct 2020 20:43:07 +0200 Subject: [PATCH 2/9] Add an OpenBSD check --- modules/core/src/parallel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/core/src/parallel.cpp b/modules/core/src/parallel.cpp index 23f8a98f26..9ac7d3e4c0 100644 --- a/modules/core/src/parallel.cpp +++ b/modules/core/src/parallel.cpp @@ -54,7 +54,8 @@ #endif #if defined __linux__ || defined __APPLE__ || defined __GLIBC__ \ - || defined __HAIKU__ || defined __EMSCRIPTEN__ || defined __FreeBSD__ + || defined __HAIKU__ || defined __EMSCRIPTEN__ || defined __FreeBSD__ \ + || defined __OpenBSD__ #include #include #include From a00fe15abd821463600498fdd7d819dd4fb1d123 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 5 Oct 2020 06:23:47 +0000 Subject: [PATCH 3/9] dnn: check for empty Net in .forward() --- modules/dnn/src/dnn.cpp | 24 +++++++++++++++++++++--- modules/dnn/test/test_misc.cpp | 9 +++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/modules/dnn/src/dnn.cpp b/modules/dnn/src/dnn.cpp index 8947791061..1d145dd502 100644 --- a/modules/dnn/src/dnn.cpp +++ b/modules/dnn/src/dnn.cpp @@ -3486,11 +3486,16 @@ void Net::connect(String _outPin, String _inPin) Mat Net::forward(const String& outputName) { CV_TRACE_FUNCTION(); + CV_Assert(!empty()); String layerName = outputName; if (layerName.empty()) - layerName = getLayerNames().back(); + { + std::vector layerNames = getLayerNames(); + CV_Assert(!layerNames.empty()); + layerName = layerNames.back(); + } std::vector pins(1, impl->getPinByAlias(layerName)); impl->setUpNet(pins); @@ -3502,11 +3507,17 @@ Mat Net::forward(const String& outputName) AsyncArray Net::forwardAsync(const String& outputName) { CV_TRACE_FUNCTION(); + CV_Assert(!empty()); + #ifdef CV_CXX11 String layerName = outputName; if (layerName.empty()) - layerName = getLayerNames().back(); + { + std::vector layerNames = getLayerNames(); + CV_Assert(!layerNames.empty()); + layerName = layerNames.back(); + } std::vector pins(1, impl->getPinByAlias(layerName)); impl->setUpNet(pins); @@ -3527,11 +3538,16 @@ AsyncArray Net::forwardAsync(const String& outputName) void Net::forward(OutputArrayOfArrays outputBlobs, const String& outputName) { CV_TRACE_FUNCTION(); + CV_Assert(!empty()); String layerName = outputName; if (layerName.empty()) - layerName = getLayerNames().back(); + { + std::vector layerNames = getLayerNames(); + CV_Assert(!layerNames.empty()); + layerName = layerNames.back(); + } std::vector pins(1, impl->getPinByAlias(layerName)); impl->setUpNet(pins); @@ -4118,6 +4134,8 @@ std::vector > Net::getLayerInputs(LayerId layerId) std::vector Net::getLayerNames() const { + CV_TRACE_FUNCTION(); + std::vector res; res.reserve(impl->layers.size()); diff --git a/modules/dnn/test/test_misc.cpp b/modules/dnn/test/test_misc.cpp index 6df089e11d..11e0f0ec2d 100644 --- a/modules/dnn/test/test_misc.cpp +++ b/modules/dnn/test/test_misc.cpp @@ -99,6 +99,15 @@ TEST(readNet, do_not_call_setInput) // https://github.com/opencv/opencv/issues/ EXPECT_TRUE(res.empty()) << res.size; } +TEST(Net, empty_forward_18392) +{ + cv::dnn::Net net; + Mat image(Size(512, 512), CV_8UC3, Scalar::all(0)); + Mat inputBlob = cv::dnn::blobFromImage(image, 1.0, Size(512, 512), Scalar(0,0,0), true, false); + net.setInput(inputBlob); + EXPECT_ANY_THROW(Mat output = net.forward()); +} + #ifdef HAVE_INF_ENGINE static void test_readNet_IE_do_not_call_setInput(Backend backendId) From 102d8f67cd957777107056be3f3d93383b71649e Mon Sep 17 00:00:00 2001 From: Mario Emmenlauer Date: Wed, 30 Sep 2020 18:16:02 +0200 Subject: [PATCH 4/9] matrix.cpp::setSize(): fixed out-of-bounds access on cv::Mat steps --- modules/core/src/matrix.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 5e37774a6a..fc9e4c69b2 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -237,12 +237,19 @@ void setSize( Mat& m, int _dims, const int* _sz, const size_t* _steps, bool auto if( _steps ) { - if (_steps[i] % esz1 != 0) + if (i < _dims-1) { - CV_Error(Error::BadStep, "Step must be a multiple of esz1"); - } + if (_steps[i] % esz1 != 0) + { + CV_Error_(Error::BadStep, ("Step %zu for dimension %d must be a multiple of esz1 %zu", _steps[i], i, esz1)); + } - m.step.p[i] = i < _dims-1 ? _steps[i] : esz; + m.step.p[i] = _steps[i]; + } + else + { + m.step.p[i] = esz; + } } else if( autoSteps ) { From f30aafc3cc77e87898dbbb9013f9de7ca32a73b4 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sun, 4 Oct 2020 07:11:41 +0000 Subject: [PATCH 5/9] core(test): regression test for 18473 --- modules/core/test/test_mat.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index 43e0078ec8..0bc3961fe2 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -2185,4 +2185,32 @@ TEST(Mat, empty_iterator_16855) EXPECT_TRUE(m.begin() == m.end()); } + +TEST(Mat, regression_18473) +{ + std::vector sizes(3); + sizes[0] = 20; + sizes[1] = 50; + sizes[2] = 100; +#if 1 // with the fix + std::vector steps(2); + steps[0] = 50*100*2; + steps[1] = 100*2; +#else // without the fix + std::vector steps(3); + steps[0] = 50*100*2; + steps[1] = 100*2; + steps[2] = 2; +#endif + std::vector data(20*50*100, 0); // 1Mb + data[data.size() - 1] = 5; + + // param steps Array of ndims-1 steps + Mat m(sizes, CV_16SC1, (void*)data.data(), (const size_t*)steps.data()); + + ASSERT_FALSE(m.empty()); + EXPECT_EQ((int)5, (int)m.at(19, 49, 99)); +} + + }} // namespace From aa11f7d8a36838549b6a4e3a9889b1633cff21ae Mon Sep 17 00:00:00 2001 From: Ilya Churaev Date: Tue, 4 Aug 2020 08:18:38 +0300 Subject: [PATCH 6/9] Removed get_output_as_single_output_node method backported commit: 5fd3d36fe8b36fb9e39a192fedc9ffec2883efe1 --- modules/dnn/src/dnn.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/dnn/src/dnn.cpp b/modules/dnn/src/dnn.cpp index 8947791061..f1bff3cee5 100644 --- a/modules/dnn/src/dnn.cpp +++ b/modules/dnn/src/dnn.cpp @@ -2113,7 +2113,9 @@ struct Net::Impl : public detail::NetImplBase auto ieInpNode = inputNodes[i].dynamicCast(); CV_Assert(oid < ieInpNode->node->get_output_size()); -#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2020_3) +#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2020_4) + inputNodes[i] = Ptr(new InfEngineNgraphNode(ieInpNode->node)); +#elif INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2020_3) inputNodes[i] = Ptr(new InfEngineNgraphNode(ieInpNode->node->get_output_as_single_output_node(oid))); #else inputNodes[i] = Ptr(new InfEngineNgraphNode(ieInpNode->node->get_output_as_single_output_node(oid, false))); From 36f61f38790ed8ca6ddfcca73d291a5dd4b18a0d Mon Sep 17 00:00:00 2001 From: Maksim Doronin Date: Thu, 30 Jul 2020 17:46:37 +0300 Subject: [PATCH 7/9] [IE][VPU]: Refactor vpu configs backported commit: 7fe87d9a5b3aeda1ae449b57652462247c89ef4a --- modules/dnn/src/ie_ngraph.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/dnn/src/ie_ngraph.cpp b/modules/dnn/src/ie_ngraph.cpp index 82d8b9ca73..84b984ac97 100644 --- a/modules/dnn/src/ie_ngraph.cpp +++ b/modules/dnn/src/ie_ngraph.cpp @@ -684,7 +684,11 @@ void InfEngineNgraphNet::initPlugin(InferenceEngine::CNNNetwork& net) } std::map config; if (device_name == "MYRIAD") { +#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2020_4) + config.emplace("MYRIAD_DETECT_NETWORK_BATCH", CONFIG_VALUE(NO)); +#else config.emplace("VPU_DETECT_NETWORK_BATCH", CONFIG_VALUE(NO)); +#endif } bool isHetero = device_name == "FPGA"; From 644de8f22a1045ae6df15dce7892fd00ab15d310 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 6 Oct 2020 04:28:25 +0000 Subject: [PATCH 8/9] java: fix javadoc generation --- modules/calib3d/include/opencv2/calib3d.hpp | 2 +- modules/java/generator/gen_java.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/calib3d/include/opencv2/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d.hpp index e025a79ee0..7ce36c6fed 100644 --- a/modules/calib3d/include/opencv2/calib3d.hpp +++ b/modules/calib3d/include/opencv2/calib3d.hpp @@ -2163,7 +2163,7 @@ final fundamental matrix. It can be set to something like 1-3, depending on the point localization, image resolution, and the image noise. @param confidence Parameter used for the RANSAC and LMedS methods only. It specifies a desirable level of confidence (probability) that the estimated matrix is correct. -@param mask +@param[out] mask optional output mask @param maxIters The maximum number of robust method iterations. The epipolar geometry is described by the following equation: diff --git a/modules/java/generator/gen_java.py b/modules/java/generator/gen_java.py index fe61c0be33..03075c5ae7 100755 --- a/modules/java/generator/gen_java.py +++ b/modules/java/generator/gen_java.py @@ -769,6 +769,7 @@ class JavaWrapperGenerator(object): inCode = True if "" in line: inCode = False + line = line.replace('@result ', '@return ') # @result is valid in Doxygen, but invalid in Javadoc if "@return " in line: returnTag = True From f2bb3d0d8062645114e23479ab2352e74330ff01 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 6 Oct 2020 20:57:40 +0000 Subject: [PATCH 9/9] videoio(dc1394_v2): ensure variable initialization --- modules/videoio/src/cap_dc1394_v2.cpp | 41 +++++++++++++-------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/modules/videoio/src/cap_dc1394_v2.cpp b/modules/videoio/src/cap_dc1394_v2.cpp index ba309fbf54..938b31f4a9 100644 --- a/modules/videoio/src/cap_dc1394_v2.cpp +++ b/modules/videoio/src/cap_dc1394_v2.cpp @@ -221,60 +221,57 @@ bool CvCaptureCAM_DC1394_v2_CPP::startCapture() DC1394_ISO_SPEED_3200); } - // should a specific mode be used - if (userMode >= 0) + dc1394video_modes_t videoModes; + dc1394_video_get_supported_modes(dcCam, &videoModes); + // should a specific mode be used + while (userMode >= 0) // 'if' semantic, no real loop here { dc1394video_mode_t wantedMode; - dc1394video_modes_t videoModes; - dc1394_video_get_supported_modes(dcCam, &videoModes); - - //set mode from number, for example the second supported mode, i.e userMode = 1 if (userMode < (int)videoModes.num) { + // set mode from number, for example the second supported mode, i.e userMode = 1 wantedMode = videoModes.modes[userMode]; } - - //set modes directly from DC134 constants (from dc1394video_mode_t) - else if ((userMode >= DC1394_VIDEO_MODE_MIN) && (userMode <= DC1394_VIDEO_MODE_MAX )) + else if ((userMode >= DC1394_VIDEO_MODE_MIN) && (userMode <= DC1394_VIDEO_MODE_MAX)) { + // set modes directly from DC134 constants (from dc1394video_mode_t) + //search for wanted mode, to check if camera supports it int j = 0; - while ((j< (int)videoModes.num) && videoModes.modes[j]!=userMode) + while ((j < (int)videoModes.num) && videoModes.modes[j] != userMode) { j++; } - - if ((int)videoModes.modes[j]==userMode) - { - wantedMode = videoModes.modes[j]; - } - else + if (!(j < (int)videoModes.num)) { userMode = -1; // wanted mode not supported, search for best mode + break; } + + wantedMode = videoModes.modes[j]; } else { - userMode = -1; // wanted mode not supported, search for best mode + userMode = -1; // wanted mode not supported, search for best mode + break; } + //if userMode is available: set it and update size - if (userMode != -1) { code = dc1394_video_set_mode(dcCam, wantedMode); - uint32_t width, height; + uint32_t width = 0, height = 0; dc1394_get_image_size_from_video_mode(dcCam, wantedMode, &width, &height); frameWidth = (int)width; frameHeight = (int)height; } + break; } if (userMode == -1 && (frameWidth > 0 || frameHeight > 0)) { - dc1394video_mode_t bestMode = (dc1394video_mode_t) - 1; - dc1394video_modes_t videoModes; - dc1394_video_get_supported_modes(dcCam, &videoModes); + dc1394video_mode_t bestMode = (dc1394video_mode_t)(-1); for (i = 0; i < (int)videoModes.num; i++) { dc1394video_mode_t mode = videoModes.modes[i];