From 95dd4b3f27bda8bcf1bbf8ec7babdc923fdd7c39 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 24 Jul 2018 18:31:40 +0000 Subject: [PATCH] bindings: add debug helpers for args conversions --- .../include/opencv2/core/bindings_utils.hpp | 23 +++ modules/core/src/bindings_utils.cpp | 145 ++++++++++++++++++ modules/python/test/test_misc.py | 39 +++++ modules/python/test/tests_common.py | 4 +- 4 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 modules/core/include/opencv2/core/bindings_utils.hpp create mode 100644 modules/core/src/bindings_utils.cpp diff --git a/modules/core/include/opencv2/core/bindings_utils.hpp b/modules/core/include/opencv2/core/bindings_utils.hpp new file mode 100644 index 0000000000..c1123f2b0e --- /dev/null +++ b/modules/core/include/opencv2/core/bindings_utils.hpp @@ -0,0 +1,23 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_BINDINGS_UTILS_HPP +#define OPENCV_CORE_BINDINGS_UTILS_HPP + +namespace cv { namespace utils { +//! @addtogroup core_utils +//! @{ + +CV_EXPORTS_W String dumpInputArray(InputArray argument); + +CV_EXPORTS_W String dumpInputArrayOfArrays(InputArrayOfArrays argument); + +CV_EXPORTS_W String dumpInputOutputArray(InputOutputArray argument); + +CV_EXPORTS_W String dumpInputOutputArrayOfArrays(InputOutputArrayOfArrays argument); + +//! @} +}} // namespace + +#endif // OPENCV_CORE_BINDINGS_UTILS_HPP diff --git a/modules/core/src/bindings_utils.cpp b/modules/core/src/bindings_utils.cpp new file mode 100644 index 0000000000..c1a549c218 --- /dev/null +++ b/modules/core/src/bindings_utils.cpp @@ -0,0 +1,145 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include "precomp.hpp" +#include "opencv2/core/bindings_utils.hpp" +#include + +namespace cv { namespace utils { + +String dumpInputArray(InputArray argument) +{ + if (&argument == &noArray()) + return "InputArray: noArray()"; + std::ostringstream ss; + ss << "InputArray:"; + try { + do { + ss << (argument.empty() ? " empty()=true" : " empty()=false"); + ss << cv::format(" kind=0x%08llx", (long long int)argument.kind()); + ss << cv::format(" flags=0x%08llx", (long long int)argument.getFlags()); + if (argument.getObj() == NULL) + { + ss << " obj=NULL"; + break; // done + } + ss << cv::format(" total(-1)=%lld", (long long int)argument.total(-1)); + ss << cv::format(" dims(-1)=%d", argument.dims(-1)); + Size size = argument.size(-1); + ss << cv::format(" size(-1)=%dx%d", size.width, size.height); + ss << " type(-1)=" << cv::typeToString(argument.type(-1)); + } while (0); + } + catch (...) + { + ss << " ERROR: exception occured, dump is non-complete"; // need to properly support different kinds + } + return ss.str(); +} + +CV_EXPORTS_W String dumpInputArrayOfArrays(InputArrayOfArrays argument) +{ + if (&argument == &noArray()) + return "InputArrayOfArrays: noArray()"; + std::ostringstream ss; + ss << "InputArrayOfArrays:"; + try { + do { + ss << (argument.empty() ? " empty()=true" : " empty()=false"); + ss << cv::format(" kind=0x%08llx", (long long int)argument.kind()); + ss << cv::format(" flags=0x%08llx", (long long int)argument.getFlags()); + if (argument.getObj() == NULL) + { + ss << " obj=NULL"; + break; // done + } + ss << cv::format(" total(-1)=%lld", (long long int)argument.total(-1)); + ss << cv::format(" dims(-1)=%d", argument.dims(-1)); + Size size = argument.size(-1); + ss << cv::format(" size(-1)=%dx%d", size.width, size.height); + if (argument.total(-1) > 0) + { + ss << " type(0)=" << cv::typeToString(argument.type(0)); + ss << cv::format(" dims(0)=%d", argument.dims(0)); + size = argument.size(0); + ss << cv::format(" size(0)=%dx%d", size.width, size.height); + ss << " type(0)=" << cv::typeToString(argument.type(0)); + } + } while (0); + } + catch (...) + { + ss << " ERROR: exception occured, dump is non-complete"; // need to properly support different kinds + } + return ss.str(); +} + +CV_EXPORTS_W String dumpInputOutputArray(InputOutputArray argument) +{ + if (&argument == &noArray()) + return "InputOutputArray: noArray()"; + std::ostringstream ss; + ss << "InputOutputArray:"; + try { + do { + ss << (argument.empty() ? " empty()=true" : " empty()=false"); + ss << cv::format(" kind=0x%08llx", (long long int)argument.kind()); + ss << cv::format(" flags=0x%08llx", (long long int)argument.getFlags()); + if (argument.getObj() == NULL) + { + ss << " obj=NULL"; + break; // done + } + ss << cv::format(" total(-1)=%lld", (long long int)argument.total(-1)); + ss << cv::format(" dims(-1)=%d", argument.dims(-1)); + Size size = argument.size(-1); + ss << cv::format(" size(-1)=%dx%d", size.width, size.height); + ss << " type(-1)=" << cv::typeToString(argument.type(-1)); + } while (0); + } + catch (...) + { + ss << " ERROR: exception occured, dump is non-complete"; // need to properly support different kinds + } + return ss.str(); +} + +CV_EXPORTS_W String dumpInputOutputArrayOfArrays(InputOutputArrayOfArrays argument) +{ + if (&argument == &noArray()) + return "InputOutputArrayOfArrays: noArray()"; + std::ostringstream ss; + ss << "InputOutputArrayOfArrays:"; + try { + do { + ss << (argument.empty() ? " empty()=true" : " empty()=false"); + ss << cv::format(" kind=0x%08llx", (long long int)argument.kind()); + ss << cv::format(" flags=0x%08llx", (long long int)argument.getFlags()); + if (argument.getObj() == NULL) + { + ss << " obj=NULL"; + break; // done + } + ss << cv::format(" total(-1)=%lld", (long long int)argument.total(-1)); + ss << cv::format(" dims(-1)=%d", argument.dims(-1)); + Size size = argument.size(-1); + ss << cv::format(" size(-1)=%dx%d", size.width, size.height); + if (argument.total(-1) > 0) + { + ss << " type(0)=" << cv::typeToString(argument.type(0)); + ss << cv::format(" dims(0)=%d", argument.dims(0)); + size = argument.size(0); + ss << cv::format(" size(0)=%dx%d", size.width, size.height); + ss << " type(0)=" << cv::typeToString(argument.type(0)); + } + } while (0); + } + catch (...) + { + ss << " ERROR: exception occured, dump is non-complete"; // need to properly support different kinds + } + return ss.str(); +} + +}} // namespace diff --git a/modules/python/test/test_misc.py b/modules/python/test/test_misc.py index 5f07d733f2..e84de50247 100644 --- a/modules/python/test/test_misc.py +++ b/modules/python/test/test_misc.py @@ -46,5 +46,44 @@ class Bindings(NewOpenCVTests): pass +class Arguments(NewOpenCVTests): + + def test_InputArray(self): + res1 = cv.utils.dumpInputArray(None) + #self.assertEqual(res1, "InputArray: noArray()") # not supported + self.assertEqual(res1, "InputArray: empty()=true kind=0x00010000 flags=0x01010000 total(-1)=0 dims(-1)=0 size(-1)=0x0 type(-1)=CV_8UC1") + res2_1 = cv.utils.dumpInputArray((1, 2)) + self.assertEqual(res2_1, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=2 dims(-1)=2 size(-1)=1x2 type(-1)=CV_64FC1") + res2_2 = cv.utils.dumpInputArray(1.5) # Scalar(1.5, 1.5, 1.5, 1.5) + self.assertEqual(res2_2, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=4 dims(-1)=2 size(-1)=1x4 type(-1)=CV_64FC1") + a = np.array([[1,2],[3,4],[5,6]]) + res3 = cv.utils.dumpInputArray(a) # 32SC1 + self.assertEqual(res3, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=6 dims(-1)=2 size(-1)=2x3 type(-1)=CV_32SC1") + a = np.array([[[1,2],[3,4],[5,6]]], dtype='f') + res4 = cv.utils.dumpInputArray(a) # 32FC2 + self.assertEqual(res4, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=3 dims(-1)=2 size(-1)=3x1 type(-1)=CV_32FC2") + a = np.array([[[1,2]],[[3,4]],[[5,6]]], dtype=float) + res5 = cv.utils.dumpInputArray(a) # 64FC2 + self.assertEqual(res5, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=3 dims(-1)=2 size(-1)=1x3 type(-1)=CV_64FC2") + + + def test_InputArrayOfArrays(self): + res1 = cv.utils.dumpInputArrayOfArrays(None) + #self.assertEqual(res1, "InputArray: noArray()") # not supported + self.assertEqual(res1, "InputArrayOfArrays: empty()=true kind=0x00050000 flags=0x01050000 total(-1)=0 dims(-1)=1 size(-1)=0x0") + res2_1 = cv.utils.dumpInputArrayOfArrays((1, 2)) # { Scalar:all(1), Scalar::all(2) } + self.assertEqual(res2_1, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=2 dims(-1)=1 size(-1)=2x1 type(0)=CV_64FC1 dims(0)=2 size(0)=1x4 type(0)=CV_64FC1") + res2_2 = cv.utils.dumpInputArrayOfArrays([1.5]) + self.assertEqual(res2_2, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=1 dims(-1)=1 size(-1)=1x1 type(0)=CV_64FC1 dims(0)=2 size(0)=1x4 type(0)=CV_64FC1") + a = np.array([[1,2],[3,4],[5,6]]) + b = np.array([[1,2,3],[4,5,6],[7,8,9]]) + res3 = cv.utils.dumpInputArrayOfArrays([a, b]) + self.assertEqual(res3, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=2 dims(-1)=1 size(-1)=2x1 type(0)=CV_32SC1 dims(0)=2 size(0)=2x3 type(0)=CV_32SC1") + c = np.array([[[1,2],[3,4],[5,6]]], dtype='f') + res4 = cv.utils.dumpInputArrayOfArrays([c, a, b]) + self.assertEqual(res4, "InputArrayOfArrays: empty()=false kind=0x00050000 flags=0x01050000 total(-1)=3 dims(-1)=1 size(-1)=3x1 type(0)=CV_32FC2 dims(0)=2 size(0)=3x1 type(0)=CV_32FC2") + + + if __name__ == '__main__': NewOpenCVTests.bootstrap() diff --git a/modules/python/test/tests_common.py b/modules/python/test/tests_common.py index 93c7b2f346..e6539ae7f4 100644 --- a/modules/python/test/tests_common.py +++ b/modules/python/test/tests_common.py @@ -26,7 +26,9 @@ class NewOpenCVTests(unittest.TestCase): # github repository url repoUrl = 'https://raw.github.com/opencv/opencv/master' - def get_sample(self, filename, iscolor = cv.IMREAD_COLOR): + def get_sample(self, filename, iscolor = None): + if iscolor is None: + iscolor = cv.IMREAD_COLOR if not filename in self.image_cache: filedata = None if NewOpenCVTests.repoPath is not None: