From 886220b9be6190ffabc925a48a68879cc63ae44d Mon Sep 17 00:00:00 2001 From: Julien <182520+JulienMaille@users.noreply.github.com> Date: Fri, 17 Jan 2020 17:24:37 +0100 Subject: [PATCH] Merge pull request #16273 from JulienMaille:wrapper_available_target * add a wrapper for getAvailableTargets * add java wrapper on Target enum --- modules/dnn/include/opencv2/dnn/dnn.hpp | 4 ++-- modules/dnn/misc/java/gen_dict.json | 8 ++++++++ .../dnn/misc/java/src/cpp/dnn_converters.cpp | 19 +++++++++++++++++++ .../dnn/misc/java/src/cpp/dnn_converters.hpp | 1 + .../dnn/misc/java/test/DnnTensorFlowTest.java | 5 +++++ modules/dnn/misc/python/pyopencv_dnn.hpp | 6 ++++++ modules/dnn/misc/python/test/test_dnn.py | 4 ++++ 7 files changed, 45 insertions(+), 2 deletions(-) diff --git a/modules/dnn/include/opencv2/dnn/dnn.hpp b/modules/dnn/include/opencv2/dnn/dnn.hpp index 94e2ada3f1..1b26fbccec 100644 --- a/modules/dnn/include/opencv2/dnn/dnn.hpp +++ b/modules/dnn/include/opencv2/dnn/dnn.hpp @@ -94,7 +94,7 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN */ enum Target { - DNN_TARGET_CPU, + DNN_TARGET_CPU = 0, DNN_TARGET_OPENCL, DNN_TARGET_OPENCL_FP16, DNN_TARGET_MYRIAD, @@ -102,7 +102,7 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN }; CV_EXPORTS std::vector< std::pair > getAvailableBackends(); - CV_EXPORTS std::vector getAvailableTargets(Backend be); + CV_EXPORTS_W std::vector getAvailableTargets(dnn::Backend be); /** @brief This class provides all data needed to initialize layer. * diff --git a/modules/dnn/misc/java/gen_dict.json b/modules/dnn/misc/java/gen_dict.json index c0e0a1b6ea..5a397eac51 100644 --- a/modules/dnn/misc/java/gen_dict.json +++ b/modules/dnn/misc/java/gen_dict.json @@ -36,6 +36,14 @@ "v_type": "vector_Layer", "j_import": "org.opencv.dnn.Layer" }, + "vector_Target": { + "j_type": "List", + "jn_type": "List", + "jni_type": "jobject", + "jni_var": "std::vector< cv::dnn::Target > %(n)s", + "suffix": "Ljava_util_List", + "v_type": "vector_Target" + }, "LayerId": { "j_type": "DictValue", "jn_type": "long", diff --git a/modules/dnn/misc/java/src/cpp/dnn_converters.cpp b/modules/dnn/misc/java/src/cpp/dnn_converters.cpp index 97ff01cc15..e4cea05d71 100644 --- a/modules/dnn/misc/java/src/cpp/dnn_converters.cpp +++ b/modules/dnn/misc/java/src/cpp/dnn_converters.cpp @@ -59,6 +59,25 @@ jobject vector_Ptr_Layer_to_List(JNIEnv* env, std::vector& vs) +{ + static jclass juArrayList = ARRAYLIST(env); + static jmethodID m_create = CONSTRUCTOR(env, juArrayList); + jmethodID m_add = LIST_ADD(env, juArrayList); + + static jclass jInteger = env->FindClass("java/lang/Integer"); + static jmethodID m_create_Integer = env->GetMethodID(jInteger, "", "(I)V"); + + jobject result = env->NewObject(juArrayList, m_create, vs.size()); + for (size_t i = 0; i < vs.size(); ++i) + { + jobject element = env->NewObject(jInteger, m_create_Integer, vs[i]); + env->CallBooleanMethod(result, m_add, element); + env->DeleteLocalRef(element); + } + return result; +} + std::vector > List_to_vector_Ptr_Layer(JNIEnv* env, jobject list) { static jclass juArrayList = ARRAYLIST(env); diff --git a/modules/dnn/misc/java/src/cpp/dnn_converters.hpp b/modules/dnn/misc/java/src/cpp/dnn_converters.hpp index 6a7270174c..e1f63e0a00 100644 --- a/modules/dnn/misc/java/src/cpp/dnn_converters.hpp +++ b/modules/dnn/misc/java/src/cpp/dnn_converters.hpp @@ -28,5 +28,6 @@ jobject vector_Ptr_Layer_to_List(JNIEnv* env, std::vector > List_to_vector_Ptr_Layer(JNIEnv* env, jobject list); +jobject vector_Target_to_List(JNIEnv* env, std::vector& vs); #endif /* DNN_CONVERTERS_HPP */ diff --git a/modules/dnn/misc/java/test/DnnTensorFlowTest.java b/modules/dnn/misc/java/test/DnnTensorFlowTest.java index 4e96c73e28..469573642b 100644 --- a/modules/dnn/misc/java/test/DnnTensorFlowTest.java +++ b/modules/dnn/misc/java/test/DnnTensorFlowTest.java @@ -141,4 +141,9 @@ public class DnnTensorFlowTest extends OpenCVTestCase { net = Dnn.readNetFromTensorflow(new MatOfByte(modelBuffer)); checkInceptionNet(net); } + + public void testGetAvailableTargets() { + List targets = Dnn.getAvailableTargets(Dnn.DNN_BACKEND_OPENCV); + assertTrue(targets.contains(Dnn.DNN_TARGET_CPU)); + } } diff --git a/modules/dnn/misc/python/pyopencv_dnn.hpp b/modules/dnn/misc/python/pyopencv_dnn.hpp index 34aeacb08d..69c14240c3 100644 --- a/modules/dnn/misc/python/pyopencv_dnn.hpp +++ b/modules/dnn/misc/python/pyopencv_dnn.hpp @@ -71,6 +71,12 @@ PyObject* pyopencv_from(const dnn::LayerParams& lp) return dict; } +template<> +PyObject* pyopencv_from(const std::vector &t) +{ + return pyopencv_from(std::vector(t.begin(), t.end())); +} + class pycvLayer CV_FINAL : public dnn::Layer { public: diff --git a/modules/dnn/misc/python/test/test_dnn.py b/modules/dnn/misc/python/test/test_dnn.py index 24a23d6ace..f849cfaa10 100644 --- a/modules/dnn/misc/python/test/test_dnn.py +++ b/modules/dnn/misc/python/test/test_dnn.py @@ -117,6 +117,10 @@ class dnn_test(NewOpenCVTests): return False return True + def test_getAvailableTargets(self): + targets = cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_OPENCV) + self.assertTrue(cv.dnn.DNN_TARGET_CPU in targets) + def test_blobFromImage(self): np.random.seed(324)