From 2e429268ff41dd616f45b5f4bdd16e225c69038d Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov <2536374+asmorkalov@users.noreply.github.com> Date: Thu, 4 Mar 2021 19:17:57 +0300 Subject: [PATCH] Merge pull request #19668 from asmorkalov:as/filesystem_py * Add Python Bindings for getCacheDirectory function * Added getCacheDirectory interop test with image codecs. Co-authored-by: Sergey Slashchinin --- .../core/include/opencv2/core/bindings_utils.hpp | 5 ++- modules/core/src/bindings_utils.cpp | 13 +++++++ modules/python/test/test_fs_cache_dir.py | 41 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 modules/python/test/test_fs_cache_dir.py diff --git a/modules/core/include/opencv2/core/bindings_utils.hpp b/modules/core/include/opencv2/core/bindings_utils.hpp index 179d603..96d5c77 100644 --- a/modules/core/include/opencv2/core/bindings_utils.hpp +++ b/modules/core/include/opencv2/core/bindings_utils.hpp @@ -144,7 +144,10 @@ AsyncArray testAsyncException() return p.getArrayResult(); } +namespace fs { + CV_EXPORTS_W cv::String getCacheDirectoryForDownloads(); +} // namespace fs //! @} -}} // namespace +}} // namespaces cv / utils #endif // OPENCV_CORE_BINDINGS_UTILS_HPP diff --git a/modules/core/src/bindings_utils.cpp b/modules/core/src/bindings_utils.cpp index 050b724..78716c2 100644 --- a/modules/core/src/bindings_utils.cpp +++ b/modules/core/src/bindings_utils.cpp @@ -5,6 +5,8 @@ #include "precomp.hpp" #include "opencv2/core/bindings_utils.hpp" #include +#include +#include namespace cv { namespace utils { @@ -208,4 +210,15 @@ CV_EXPORTS_W String dumpInputOutputArrayOfArrays(InputOutputArrayOfArrays argume return ss.str(); } +namespace fs { +cv::String getCacheDirectoryForDownloads() +{ +#if OPENCV_HAVE_FILESYSTEM_SUPPORT + return cv::utils::fs::getCacheDirectory("downloads", "OPENCV_DOWNLOADS_CACHE_DIR"); +#else + CV_Error(Error::StsNotImplemented, "File system support is disabled in this OpenCV build!"); +#endif +} +} // namespace fs + }} // namespace diff --git a/modules/python/test/test_fs_cache_dir.py b/modules/python/test/test_fs_cache_dir.py new file mode 100644 index 0000000..6cb40b2 --- /dev/null +++ b/modules/python/test/test_fs_cache_dir.py @@ -0,0 +1,41 @@ +# Python 2/3 compatibility +from __future__ import print_function + +import numpy as np +import cv2 as cv +import os +import datetime + +from tests_common import NewOpenCVTests + +class get_cache_dir_test(NewOpenCVTests): + def test_get_cache_dir(self): + #New binding + path = cv.utils.fs.getCacheDirectoryForDownloads() + self.assertTrue(os.path.exists(path)) + self.assertTrue(os.path.isdir(path)) + + def get_cache_dir_imread_interop(self, ext): + path = cv.utils.fs.getCacheDirectoryForDownloads() + gold_image = np.ones((16, 16, 3), np.uint8) + read_from_file = np.zeros((16, 16, 3), np.uint8) + test_file_name = os.path.join(path, "test." + ext) + try: + cv.imwrite(test_file_name, gold_image) + read_from_file = cv.imread(test_file_name) + finally: + os.remove(test_file_name) + + self.assertEqual(cv.norm(gold_image, read_from_file), 0) + + def test_get_cache_dir_imread_interop_png(self): + self.get_cache_dir_imread_interop("png") + + def test_get_cache_dir_imread_interop_jpeg(self): + self.get_cache_dir_imread_interop("jpg") + + def test_get_cache_dir_imread_interop_tiff(self): + self.get_cache_dir_imread_interop("tif") + +if __name__ == '__main__': + NewOpenCVTests.bootstrap() -- 2.7.4