Merge pull request #20196 from TolyaTalamanov:at/support-vaargs-compile-args
authorAnatoliy Talamanov <anatoliy.talamanov@intel.com>
Fri, 18 Jun 2021 17:16:07 +0000 (20:16 +0300)
committerGitHub <noreply@github.com>
Fri, 18 Jun 2021 17:16:07 +0000 (20:16 +0300)
G-API: Support vaargs for cv.compile_args

* Support cv.compile_args to work with variadic number of inputs

* Disable python2.x G-API

* Move compile_args to gapi pkg

modules/gapi/misc/python/package/gapi/__init__.py
modules/gapi/misc/python/shadow_gapi.hpp
modules/gapi/misc/python/test/test_gapi_core.py
modules/gapi/misc/python/test/test_gapi_imgproc.py
modules/gapi/misc/python/test/test_gapi_infer.py
modules/gapi/misc/python/test/test_gapi_sample_pipelines.py
modules/gapi/misc/python/test/test_gapi_streaming.py
modules/gapi/misc/python/test/test_gapi_types.py

index 733c980..23f5f41 100644 (file)
@@ -11,6 +11,11 @@ def register(mname):
     return parameterized
 
 
+@register('cv2.gapi')
+def compile_args(*args):
+    return list(map(cv.GCompileArg, args))
+
+
 @register('cv2')
 class GOpaque():
     # NB: Inheritance from c++ class cause segfault.
index 40dab41..941250c 100644 (file)
@@ -3,11 +3,10 @@
 
 namespace cv
 {
-   struct GAPI_EXPORTS_W_SIMPLE GCompileArg { };
-
-   GAPI_EXPORTS_W GCompileArgs compile_args(gapi::GKernelPackage pkg);
-   GAPI_EXPORTS_W GCompileArgs compile_args(gapi::GNetPackage pkg);
-   GAPI_EXPORTS_W GCompileArgs compile_args(gapi::GKernelPackage kernels, gapi::GNetPackage nets);
+   struct GAPI_EXPORTS_W_SIMPLE GCompileArg {
+       GAPI_WRAP GCompileArg(gapi::GKernelPackage pkg);
+       GAPI_WRAP GCompileArg(gapi::GNetPackage pkg);
+   };
 
    // NB: This classes doesn't exist in *.so
    // HACK: Mark them as a class to force python wrapper generate code for this entities
index 814d05d..780558d 100644 (file)
 import numpy as np
 import cv2 as cv
 import os
+import sys
+import unittest
 
 from tests_common import NewOpenCVTests
 
 
-# Plaidml is an optional backend
-pkgs = [
-          ('ocl'    , cv.gapi.core.ocl.kernels()),
-          ('cpu'    , cv.gapi.core.cpu.kernels()),
-          ('fluid'  , cv.gapi.core.fluid.kernels())
-          # ('plaidml', cv.gapi.core.plaidml.kernels())
-       ]
+try:
 
+    if sys.version_info[:2] < (3, 0):
+        raise unittest.SkipTest('Python 2.x is not supported')
 
-class gapi_core_test(NewOpenCVTests):
+    # Plaidml is an optional backend
+    pkgs = [
+              ('ocl'    , cv.gapi.core.ocl.kernels()),
+              ('cpu'    , cv.gapi.core.cpu.kernels()),
+              ('fluid'  , cv.gapi.core.fluid.kernels())
+              # ('plaidml', cv.gapi.core.plaidml.kernels())
+           ]
 
-    def test_add(self):
-        # TODO: Extend to use any type and size here
-        sz = (720, 1280)
-        in1 = np.full(sz, 100)
-        in2 = np.full(sz, 50)
 
-        # OpenCV
-        expected = cv.add(in1, in2)
+    class gapi_core_test(NewOpenCVTests):
 
-        # G-API
-        g_in1 = cv.GMat()
-        g_in2 = cv.GMat()
-        g_out = cv.gapi.add(g_in1, g_in2)
-        comp = cv.GComputation(cv.GIn(g_in1, g_in2), cv.GOut(g_out))
+        def test_add(self):
+            # TODO: Extend to use any type and size here
+            sz = (720, 1280)
+            in1 = np.full(sz, 100)
+            in2 = np.full(sz, 50)
 
-        for pkg_name, pkg in pkgs:
-            actual = comp.apply(cv.gin(in1, in2), args=cv.compile_args(pkg))
-            # Comparison
-            self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
-                             'Failed on ' + pkg_name + ' backend')
-            self.assertEqual(expected.dtype, actual.dtype, 'Failed on ' + pkg_name + ' backend')
+            # OpenCV
+            expected = cv.add(in1, in2)
 
+            # G-API
+            g_in1 = cv.GMat()
+            g_in2 = cv.GMat()
+            g_out = cv.gapi.add(g_in1, g_in2)
+            comp = cv.GComputation(cv.GIn(g_in1, g_in2), cv.GOut(g_out))
+
+            for pkg_name, pkg in pkgs:
+                actual = comp.apply(cv.gin(in1, in2), args=cv.gapi.compile_args(pkg))
+                # Comparison
+                self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
+                                 'Failed on ' + pkg_name + ' backend')
+                self.assertEqual(expected.dtype, actual.dtype, 'Failed on ' + pkg_name + ' backend')
+
+
+        def test_add_uint8(self):
+            sz = (720, 1280)
+            in1 = np.full(sz, 100, dtype=np.uint8)
+            in2 = np.full(sz, 50 , dtype=np.uint8)
+
+            # OpenCV
+            expected = cv.add(in1, in2)
+
+            # G-API
+            g_in1 = cv.GMat()
+            g_in2 = cv.GMat()
+            g_out = cv.gapi.add(g_in1, g_in2)
+            comp = cv.GComputation(cv.GIn(g_in1, g_in2), cv.GOut(g_out))
+
+            for pkg_name, pkg in pkgs:
+                actual = comp.apply(cv.gin(in1, in2), args=cv.gapi.compile_args(pkg))
+                # Comparison
+                self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
+                                 'Failed on ' + pkg_name + ' backend')
+                self.assertEqual(expected.dtype, actual.dtype, 'Failed on ' + pkg_name + ' backend')
 
-    def test_add_uint8(self):
-        sz = (720, 1280)
-        in1 = np.full(sz, 100, dtype=np.uint8)
-        in2 = np.full(sz, 50 , dtype=np.uint8)
 
-        # OpenCV
-        expected = cv.add(in1, in2)
+        def test_mean(self):
+            img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            in_mat = cv.imread(img_path)
 
-        # G-API
-        g_in1 = cv.GMat()
-        g_in2 = cv.GMat()
-        g_out = cv.gapi.add(g_in1, g_in2)
-        comp = cv.GComputation(cv.GIn(g_in1, g_in2), cv.GOut(g_out))
+            # OpenCV
+            expected = cv.mean(in_mat)
 
-        for pkg_name, pkg in pkgs:
-            actual = comp.apply(cv.gin(in1, in2), args=cv.compile_args(pkg))
-            # Comparison
-            self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
-                             'Failed on ' + pkg_name + ' backend')
-            self.assertEqual(expected.dtype, actual.dtype, 'Failed on ' + pkg_name + ' backend')
+            # G-API
+            g_in = cv.GMat()
+            g_out = cv.gapi.mean(g_in)
+            comp = cv.GComputation(g_in, g_out)
+
+            for pkg_name, pkg in pkgs:
+                actual = comp.apply(cv.gin(in_mat), args=cv.gapi.compile_args(pkg))
+                # Comparison
+                self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
+                                 'Failed on ' + pkg_name + ' backend')
 
 
-    def test_mean(self):
-        img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        in_mat = cv.imread(img_path)
+        def test_split3(self):
+            img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            in_mat = cv.imread(img_path)
 
-        # OpenCV
-        expected = cv.mean(in_mat)
+            # OpenCV
+            expected = cv.split(in_mat)
 
-        # G-API
-        g_in = cv.GMat()
-        g_out = cv.gapi.mean(g_in)
-        comp = cv.GComputation(g_in, g_out)
+            # G-API
+            g_in = cv.GMat()
+            b, g, r = cv.gapi.split3(g_in)
+            comp = cv.GComputation(cv.GIn(g_in), cv.GOut(b, g, r))
 
-        for pkg_name, pkg in pkgs:
-            actual = comp.apply(cv.gin(in_mat), args=cv.compile_args(pkg))
-            # Comparison
-            self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
-                             'Failed on ' + pkg_name + ' backend')
+            for pkg_name, pkg in pkgs:
+                actual = comp.apply(cv.gin(in_mat), args=cv.gapi.compile_args(pkg))
+                # Comparison
+                for e, a in zip(expected, actual):
+                    self.assertEqual(0.0, cv.norm(e, a, cv.NORM_INF),
+                                     'Failed on ' + pkg_name + ' backend')
+                    self.assertEqual(e.dtype, a.dtype, 'Failed on ' + pkg_name + ' backend')
 
 
-    def test_split3(self):
-        img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        in_mat = cv.imread(img_path)
+        def test_threshold(self):
+            img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            in_mat = cv.cvtColor(cv.imread(img_path), cv.COLOR_RGB2GRAY)
+            maxv = (30, 30)
 
-        # OpenCV
-        expected = cv.split(in_mat)
+            # OpenCV
+            expected_thresh, expected_mat = cv.threshold(in_mat, maxv[0], maxv[0], cv.THRESH_TRIANGLE)
 
-        # G-API
-        g_in = cv.GMat()
-        b, g, r = cv.gapi.split3(g_in)
-        comp = cv.GComputation(cv.GIn(g_in), cv.GOut(b, g, r))
+            # G-API
+            g_in = cv.GMat()
+            g_sc = cv.GScalar()
+            mat, threshold = cv.gapi.threshold(g_in, g_sc, cv.THRESH_TRIANGLE)
+            comp = cv.GComputation(cv.GIn(g_in, g_sc), cv.GOut(mat, threshold))
 
-        for pkg_name, pkg in pkgs:
-            actual = comp.apply(cv.gin(in_mat), args=cv.compile_args(pkg))
-            # Comparison
-            for e, a in zip(expected, actual):
-                self.assertEqual(0.0, cv.norm(e, a, cv.NORM_INF),
+            for pkg_name, pkg in pkgs:
+                actual_mat, actual_thresh = comp.apply(cv.gin(in_mat, maxv), args=cv.gapi.compile_args(pkg))
+                # Comparison
+                self.assertEqual(0.0, cv.norm(expected_mat, actual_mat, cv.NORM_INF),
+                                 'Failed on ' + pkg_name + ' backend')
+                self.assertEqual(expected_mat.dtype, actual_mat.dtype,
+                                 'Failed on ' + pkg_name + ' backend')
+                self.assertEqual(expected_thresh, actual_thresh[0],
                                  'Failed on ' + pkg_name + ' backend')
-                self.assertEqual(e.dtype, a.dtype, 'Failed on ' + pkg_name + ' backend')
-
-
-    def test_threshold(self):
-        img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        in_mat = cv.cvtColor(cv.imread(img_path), cv.COLOR_RGB2GRAY)
-        maxv = (30, 30)
-
-        # OpenCV
-        expected_thresh, expected_mat = cv.threshold(in_mat, maxv[0], maxv[0], cv.THRESH_TRIANGLE)
-
-        # G-API
-        g_in = cv.GMat()
-        g_sc = cv.GScalar()
-        mat, threshold = cv.gapi.threshold(g_in, g_sc, cv.THRESH_TRIANGLE)
-        comp = cv.GComputation(cv.GIn(g_in, g_sc), cv.GOut(mat, threshold))
-
-        for pkg_name, pkg in pkgs:
-            actual_mat, actual_thresh = comp.apply(cv.gin(in_mat, maxv), args=cv.compile_args(pkg))
-            # Comparison
-            self.assertEqual(0.0, cv.norm(expected_mat, actual_mat, cv.NORM_INF),
-                             'Failed on ' + pkg_name + ' backend')
-            self.assertEqual(expected_mat.dtype, actual_mat.dtype,
-                             'Failed on ' + pkg_name + ' backend')
-            self.assertEqual(expected_thresh, actual_thresh[0],
-                             'Failed on ' + pkg_name + ' backend')
-
-    def test_kmeans(self):
-        # K-means params
-        count    = 100
-        sz       = (count, 2)
-        in_mat   = np.random.random(sz).astype(np.float32)
-        K        = 5
-        flags    = cv.KMEANS_RANDOM_CENTERS
-        attempts = 1;
-        criteria = (cv.TERM_CRITERIA_MAX_ITER + cv.TERM_CRITERIA_EPS, 30, 0)
-
-        # G-API
-        g_in = cv.GMat()
-        compactness, out_labels, centers = cv.gapi.kmeans(g_in, K, criteria, attempts, flags)
-        comp = cv.GComputation(cv.GIn(g_in), cv.GOut(compactness, out_labels, centers))
-
-        compact, labels, centers = comp.apply(cv.gin(in_mat))
-
-        # Assert
-        self.assertTrue(compact >= 0)
-        self.assertEqual(sz[0], labels.shape[0])
-        self.assertEqual(1, labels.shape[1])
-        self.assertTrue(labels.size != 0)
-        self.assertEqual(centers.shape[1], sz[1]);
-        self.assertEqual(centers.shape[0], K);
-        self.assertTrue(centers.size != 0);
-
-
-    def generate_random_points(self, sz):
-        arr = np.random.random(sz).astype(np.float32).T
-        return list(zip(arr[0], arr[1]))
-
-
-    def test_kmeans_2d(self):
-        # K-means 2D params
-        count     = 100
-        sz        = (count, 2)
-        amount    = sz[0]
-        K         = 5
-        flags     = cv.KMEANS_RANDOM_CENTERS
-        attempts  = 1;
-        criteria  = (cv.TERM_CRITERIA_MAX_ITER + cv.TERM_CRITERIA_EPS, 30, 0);
-        in_vector = self.generate_random_points(sz)
-        in_labels = []
-
-        # G-API
-        data        = cv.GArrayT(cv.gapi.CV_POINT2F)
-        best_labels = cv.GArrayT(cv.gapi.CV_INT)
-
-        compactness, out_labels, centers = cv.gapi.kmeans(data, K, best_labels, criteria, attempts, flags);
-        comp = cv.GComputation(cv.GIn(data, best_labels), cv.GOut(compactness, out_labels, centers));
-
-        compact, labels, centers = comp.apply(cv.gin(in_vector, in_labels));
-
-        # Assert
-        self.assertTrue(compact >= 0)
-        self.assertEqual(amount, len(labels))
-        self.assertEqual(K, len(centers))
+
+
+        def test_kmeans(self):
+            # K-means params
+            count    = 100
+            sz       = (count, 2)
+            in_mat   = np.random.random(sz).astype(np.float32)
+            K        = 5
+            flags    = cv.KMEANS_RANDOM_CENTERS
+            attempts = 1
+            criteria = (cv.TERM_CRITERIA_MAX_ITER + cv.TERM_CRITERIA_EPS, 30, 0)
+
+            # G-API
+            g_in = cv.GMat()
+            compactness, out_labels, centers = cv.gapi.kmeans(g_in, K, criteria, attempts, flags)
+            comp = cv.GComputation(cv.GIn(g_in), cv.GOut(compactness, out_labels, centers))
+
+            compact, labels, centers = comp.apply(cv.gin(in_mat))
+
+            # Assert
+            self.assertTrue(compact >= 0)
+            self.assertEqual(sz[0], labels.shape[0])
+            self.assertEqual(1, labels.shape[1])
+            self.assertTrue(labels.size != 0)
+            self.assertEqual(centers.shape[1], sz[1])
+            self.assertEqual(centers.shape[0], K)
+            self.assertTrue(centers.size != 0)
+
+
+        def generate_random_points(self, sz):
+            arr = np.random.random(sz).astype(np.float32).T
+            return list(zip(arr[0], arr[1]))
+
+
+        def test_kmeans_2d(self):
+            # K-means 2D params
+            count     = 100
+            sz        = (count, 2)
+            amount    = sz[0]
+            K         = 5
+            flags     = cv.KMEANS_RANDOM_CENTERS
+            attempts  = 1
+            criteria  = (cv.TERM_CRITERIA_MAX_ITER + cv.TERM_CRITERIA_EPS, 30, 0)
+            in_vector = self.generate_random_points(sz)
+            in_labels = []
+
+            # G-API
+            data        = cv.GArrayT(cv.gapi.CV_POINT2F)
+            best_labels = cv.GArrayT(cv.gapi.CV_INT)
+
+            compactness, out_labels, centers = cv.gapi.kmeans(data, K, best_labels, criteria, attempts, flags)
+            comp = cv.GComputation(cv.GIn(data, best_labels), cv.GOut(compactness, out_labels, centers))
+
+            compact, labels, centers = comp.apply(cv.gin(in_vector, in_labels))
+
+            # Assert
+            self.assertTrue(compact >= 0)
+            self.assertEqual(amount, len(labels))
+            self.assertEqual(K, len(centers))
+
+
+except unittest.SkipTest as e:
+
+    message = str(e)
+
+    class TestSkip(unittest.TestCase):
+        def setUp(self):
+            self.skipTest('Skip tests: ' + message)
+
+        def test_skip():
+            pass
+
+    pass
 
 
 if __name__ == '__main__':
index ed6f883..365a5a8 100644 (file)
 import numpy as np
 import cv2 as cv
 import os
+import sys
+import unittest
 
 from tests_common import NewOpenCVTests
 
 
-# Plaidml is an optional backend
-pkgs = [
-           ('ocl'    , cv.gapi.core.ocl.kernels()),
-           ('cpu'    , cv.gapi.core.cpu.kernels()),
-           ('fluid'  , cv.gapi.core.fluid.kernels())
-           # ('plaidml', cv.gapi.core.plaidml.kernels())
-       ]
+try:
 
+    if sys.version_info[:2] < (3, 0):
+        raise unittest.SkipTest('Python 2.x is not supported')
 
-class gapi_imgproc_test(NewOpenCVTests):
+    # Plaidml is an optional backend
+    pkgs = [
+               ('ocl'    , cv.gapi.core.ocl.kernels()),
+               ('cpu'    , cv.gapi.core.cpu.kernels()),
+               ('fluid'  , cv.gapi.core.fluid.kernels())
+               # ('plaidml', cv.gapi.core.plaidml.kernels())
+           ]
 
-    def test_good_features_to_track(self):
-        # TODO: Extend to use any type and size here
-        img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        in1 = cv.cvtColor(cv.imread(img_path), cv.COLOR_RGB2GRAY)
 
-        # NB: goodFeaturesToTrack configuration
-        max_corners         = 50
-        quality_lvl         = 0.01
-        min_distance        = 10
-        block_sz            = 3
-        use_harris_detector = True
-        k                   = 0.04
-        mask                = None
+    class gapi_imgproc_test(NewOpenCVTests):
 
-        # OpenCV
-        expected = cv.goodFeaturesToTrack(in1, max_corners, quality_lvl,
-                                          min_distance, mask=mask,
-                                          blockSize=block_sz, useHarrisDetector=use_harris_detector, k=k)
+        def test_good_features_to_track(self):
+            # TODO: Extend to use any type and size here
+            img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            in1 = cv.cvtColor(cv.imread(img_path), cv.COLOR_RGB2GRAY)
 
-        # G-API
-        g_in = cv.GMat()
-        g_out = cv.gapi.goodFeaturesToTrack(g_in, max_corners, quality_lvl,
-                                            min_distance, mask, block_sz, use_harris_detector, k)
+            # NB: goodFeaturesToTrack configuration
+            max_corners         = 50
+            quality_lvl         = 0.01
+            min_distance        = 10
+            block_sz            = 3
+            use_harris_detector = True
+            k                   = 0.04
+            mask                = None
 
-        comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
+            # OpenCV
+            expected = cv.goodFeaturesToTrack(in1, max_corners, quality_lvl,
+                                              min_distance, mask=mask,
+                                              blockSize=block_sz, useHarrisDetector=use_harris_detector, k=k)
 
-        for pkg_name, pkg in pkgs:
-            actual = comp.apply(cv.gin(in1), args=cv.compile_args(pkg))
-            # NB: OpenCV & G-API have different output shapes:
-            # OpenCV - (num_points, 1, 2)
-            # G-API  - (num_points, 2)
-            # Comparison
-            self.assertEqual(0.0, cv.norm(expected.flatten(),
-                                          np.array(actual, dtype=np.float32).flatten(),
-                                          cv.NORM_INF),
-                             'Failed on ' + pkg_name + ' backend')
+            # G-API
+            g_in = cv.GMat()
+            g_out = cv.gapi.goodFeaturesToTrack(g_in, max_corners, quality_lvl,
+                                                min_distance, mask, block_sz, use_harris_detector, k)
 
+            comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
 
-    def test_rgb2gray(self):
-        # TODO: Extend to use any type and size here
-        img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        in1 = cv.imread(img_path)
+            for pkg_name, pkg in pkgs:
+                actual = comp.apply(cv.gin(in1), args=cv.gapi.compile_args(pkg))
+                # NB: OpenCV & G-API have different output shapes:
+                # OpenCV - (num_points, 1, 2)
+                # G-API  - (num_points, 2)
+                # Comparison
+                self.assertEqual(0.0, cv.norm(expected.flatten(),
+                                              np.array(actual, dtype=np.float32).flatten(),
+                                              cv.NORM_INF),
+                                 'Failed on ' + pkg_name + ' backend')
 
-        # OpenCV
-        expected = cv.cvtColor(in1, cv.COLOR_RGB2GRAY)
 
-        # G-API
-        g_in = cv.GMat()
-        g_out = cv.gapi.RGB2Gray(g_in)
+        def test_rgb2gray(self):
+            # TODO: Extend to use any type and size here
+            img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            in1 = cv.imread(img_path)
 
-        comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
+            # OpenCV
+            expected = cv.cvtColor(in1, cv.COLOR_RGB2GRAY)
 
-        for pkg_name, pkg in pkgs:
-            actual = comp.apply(cv.gin(in1), args=cv.compile_args(pkg))
-            # Comparison
-            self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
-                             'Failed on ' + pkg_name + ' backend')
+            # G-API
+            g_in = cv.GMat()
+            g_out = cv.gapi.RGB2Gray(g_in)
 
+            comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
 
-    def test_bounding_rect(self):
-        sz = 1280
-        fscale = 256
+            for pkg_name, pkg in pkgs:
+                actual = comp.apply(cv.gin(in1), args=cv.gapi.compile_args(pkg))
+                # Comparison
+                self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
+                                 'Failed on ' + pkg_name + ' backend')
 
-        def sample_value(fscale):
-            return np.random.uniform(0, 255 * fscale) / fscale
 
-        points = np.array([(sample_value(fscale), sample_value(fscale)) for _ in range(1280)], np.float32)
+        def test_bounding_rect(self):
+            sz = 1280
+            fscale = 256
 
-        # OpenCV
-        expected = cv.boundingRect(points)
+            def sample_value(fscale):
+                return np.random.uniform(0, 255 * fscale) / fscale
 
-        # G-API
-        g_in  = cv.GMat()
-        g_out = cv.gapi.boundingRect(g_in)
+            points = np.array([(sample_value(fscale), sample_value(fscale)) for _ in range(1280)], np.float32)
 
-        comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
+            # OpenCV
+            expected = cv.boundingRect(points)
 
-        for pkg_name, pkg in pkgs:
-            actual = comp.apply(cv.gin(points), args=cv.compile_args(pkg))
-            # Comparison
-            self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
-                             'Failed on ' + pkg_name + ' backend')
+            # G-API
+            g_in  = cv.GMat()
+            g_out = cv.gapi.boundingRect(g_in)
+
+            comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
+
+            for pkg_name, pkg in pkgs:
+                actual = comp.apply(cv.gin(points), args=cv.gapi.compile_args(pkg))
+                # Comparison
+                self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF),
+                                 'Failed on ' + pkg_name + ' backend')
+
+
+except unittest.SkipTest as e:
+
+    message = str(e)
+
+    class TestSkip(unittest.TestCase):
+        def setUp(self):
+            self.skipTest('Skip tests: ' + message)
+
+        def test_skip():
+            pass
+
+    pass
 
 
 if __name__ == '__main__':
index db048f5..8ecc957 100644 (file)
 import numpy as np
 import cv2 as cv
 import os
+import sys
+import unittest
 
 from tests_common import NewOpenCVTests
 
 
-class test_gapi_infer(NewOpenCVTests):
+try:
 
-    def infer_reference_network(self, model_path, weights_path, img):
-        net = cv.dnn.readNetFromModelOptimizer(model_path, weights_path)
-        net.setPreferableBackend(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE)
-        net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
+    if sys.version_info[:2] < (3, 0):
+        raise unittest.SkipTest('Python 2.x is not supported')
 
-        blob = cv.dnn.blobFromImage(img)
 
-        net.setInput(blob)
-        return net.forward(net.getUnconnectedOutLayersNames())
+    class test_gapi_infer(NewOpenCVTests):
 
+        def infer_reference_network(self, model_path, weights_path, img):
+            net = cv.dnn.readNetFromModelOptimizer(model_path, weights_path)
+            net.setPreferableBackend(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE)
+            net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
 
-    def make_roi(self, img, roi):
-        return img[roi[1]:roi[1] + roi[3], roi[0]:roi[0] + roi[2], ...]
+            blob = cv.dnn.blobFromImage(img)
 
+            net.setInput(blob)
+            return net.forward(net.getUnconnectedOutLayersNames())
 
-    def test_age_gender_infer(self):
-        # NB: Check IE
-        if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
-            return
 
-        root_path    = '/omz_intel_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013'
-        model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        device_id    = 'CPU'
+        def make_roi(self, img, roi):
+            return img[roi[1]:roi[1] + roi[3], roi[0]:roi[0] + roi[2], ...]
 
-        img_path  = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        img       = cv.resize(cv.imread(img_path), (62,62))
 
-        # OpenCV DNN
-        dnn_age, dnn_gender = self.infer_reference_network(model_path, weights_path, img)
+        def test_age_gender_infer(self):
+            # NB: Check IE
+            if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
+                return
 
-        # OpenCV G-API
-        g_in   = cv.GMat()
-        inputs = cv.GInferInputs()
-        inputs.setInput('data', g_in)
+            root_path    = '/omz_intel_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013'
+            model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            device_id    = 'CPU'
 
-        outputs  = cv.gapi.infer("net", inputs)
-        age_g    = outputs.at("age_conv3")
-        gender_g = outputs.at("prob")
+            img_path  = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            img       = cv.resize(cv.imread(img_path), (62,62))
 
-        comp = cv.GComputation(cv.GIn(g_in), cv.GOut(age_g, gender_g))
-        pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
+            # OpenCV DNN
+            dnn_age, dnn_gender = self.infer_reference_network(model_path, weights_path, img)
 
-        gapi_age, gapi_gender = comp.apply(cv.gin(img), args=cv.compile_args(cv.gapi.networks(pp)))
+            # OpenCV G-API
+            g_in   = cv.GMat()
+            inputs = cv.GInferInputs()
+            inputs.setInput('data', g_in)
 
-        # Check
-        self.assertEqual(0.0, cv.norm(dnn_gender, gapi_gender, cv.NORM_INF))
-        self.assertEqual(0.0, cv.norm(dnn_age, gapi_age, cv.NORM_INF))
+            outputs  = cv.gapi.infer("net", inputs)
+            age_g    = outputs.at("age_conv3")
+            gender_g = outputs.at("prob")
 
+            comp = cv.GComputation(cv.GIn(g_in), cv.GOut(age_g, gender_g))
+            pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
 
-    def test_age_gender_infer_roi(self):
-        # NB: Check IE
-        if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
-            return
+            gapi_age, gapi_gender = comp.apply(cv.gin(img), args=cv.gapi.compile_args(cv.gapi.networks(pp)))
 
-        root_path    = '/omz_intel_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013'
-        model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        device_id    = 'CPU'
+            # Check
+            self.assertEqual(0.0, cv.norm(dnn_gender, gapi_gender, cv.NORM_INF))
+            self.assertEqual(0.0, cv.norm(dnn_age, gapi_age, cv.NORM_INF))
 
-        img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        img = cv.imread(img_path)
-        roi      = (10, 10, 62, 62)
 
-        # OpenCV DNN
-        dnn_age, dnn_gender = self.infer_reference_network(model_path,
-                                                           weights_path,
-                                                           self.make_roi(img, roi))
+        def test_age_gender_infer_roi(self):
+            # NB: Check IE
+            if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
+                return
 
-        # OpenCV G-API
-        g_in   = cv.GMat()
-        g_roi  = cv.GOpaqueT(cv.gapi.CV_RECT)
-        inputs = cv.GInferInputs()
-        inputs.setInput('data', g_in)
-
-        outputs  = cv.gapi.infer("net", g_roi, inputs)
-        age_g    = outputs.at("age_conv3")
-        gender_g = outputs.at("prob")
-
-        comp = cv.GComputation(cv.GIn(g_in, g_roi), cv.GOut(age_g, gender_g))
-        pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
-
-        gapi_age, gapi_gender = comp.apply(cv.gin(img, roi), args=cv.compile_args(cv.gapi.networks(pp)))
-
-        # Check
-        self.assertEqual(0.0, cv.norm(dnn_gender, gapi_gender, cv.NORM_INF))
-        self.assertEqual(0.0, cv.norm(dnn_age, gapi_age, cv.NORM_INF))
-
-
-    def test_age_gender_infer_roi_list(self):
-        # NB: Check IE
-        if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
-            return
-
-        root_path    = '/omz_intel_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013'
-        model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        device_id    = 'CPU'
-
-        rois = [(10, 15, 62, 62), (23, 50, 62, 62), (14, 100, 62, 62), (80, 50, 62, 62)]
-        img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        img = cv.imread(img_path)
-
-        # OpenCV DNN
-        dnn_age_list    = []
-        dnn_gender_list = []
-        for roi in rois:
-            age, gender = self.infer_reference_network(model_path,
-                                                       weights_path,
-                                                       self.make_roi(img, roi))
-            dnn_age_list.append(age)
-            dnn_gender_list.append(gender)
-
-        # OpenCV G-API
-        g_in   = cv.GMat()
-        g_rois = cv.GArrayT(cv.gapi.CV_RECT)
-        inputs = cv.GInferInputs()
-        inputs.setInput('data', g_in)
-
-        outputs  = cv.gapi.infer("net", g_rois, inputs)
-        age_g    = outputs.at("age_conv3")
-        gender_g = outputs.at("prob")
-
-        comp = cv.GComputation(cv.GIn(g_in, g_rois), cv.GOut(age_g, gender_g))
-        pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
-
-        gapi_age_list, gapi_gender_list = comp.apply(cv.gin(img, rois),
-                                                     args=cv.compile_args(cv.gapi.networks(pp)))
-
-        # Check
-        for gapi_age, gapi_gender, dnn_age, dnn_gender in zip(gapi_age_list,
-                                                              gapi_gender_list,
-                                                              dnn_age_list,
-                                                              dnn_gender_list):
-            self.assertEqual(0.0, cv.norm(dnn_gender, gapi_gender, cv.NORM_INF))
-            self.assertEqual(0.0, cv.norm(dnn_age, gapi_age, cv.NORM_INF))
+            root_path    = '/omz_intel_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013'
+            model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            device_id    = 'CPU'
+
+            img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            img = cv.imread(img_path)
+            roi      = (10, 10, 62, 62)
+
+            # OpenCV DNN
+            dnn_age, dnn_gender = self.infer_reference_network(model_path,
+                                                               weights_path,
+                                                               self.make_roi(img, roi))
+
+            # OpenCV G-API
+            g_in   = cv.GMat()
+            g_roi  = cv.GOpaqueT(cv.gapi.CV_RECT)
+            inputs = cv.GInferInputs()
+            inputs.setInput('data', g_in)
+
+            outputs  = cv.gapi.infer("net", g_roi, inputs)
+            age_g    = outputs.at("age_conv3")
+            gender_g = outputs.at("prob")
+
+            comp = cv.GComputation(cv.GIn(g_in, g_roi), cv.GOut(age_g, gender_g))
+            pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
 
+            gapi_age, gapi_gender = comp.apply(cv.gin(img, roi), args=cv.gapi.compile_args(cv.gapi.networks(pp)))
 
-    def test_age_gender_infer2_roi(self):
-        # NB: Check IE
-        if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
-            return
-
-        root_path    = '/omz_intel_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013'
-        model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        device_id    = 'CPU'
-
-        rois = [(10, 15, 62, 62), (23, 50, 62, 62), (14, 100, 62, 62), (80, 50, 62, 62)]
-        img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        img = cv.imread(img_path)
-
-        # OpenCV DNN
-        dnn_age_list    = []
-        dnn_gender_list = []
-        for roi in rois:
-            age, gender = self.infer_reference_network(model_path,
-                                                       weights_path,
-                                                       self.make_roi(img, roi))
-            dnn_age_list.append(age)
-            dnn_gender_list.append(gender)
-
-        # OpenCV G-API
-        g_in   = cv.GMat()
-        g_rois = cv.GArrayT(cv.gapi.CV_RECT)
-        inputs = cv.GInferListInputs()
-        inputs.setInput('data', g_rois)
-
-        outputs  = cv.gapi.infer2("net", g_in, inputs)
-        age_g    = outputs.at("age_conv3")
-        gender_g = outputs.at("prob")
-
-        comp = cv.GComputation(cv.GIn(g_in, g_rois), cv.GOut(age_g, gender_g))
-        pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
-
-        gapi_age_list, gapi_gender_list = comp.apply(cv.gin(img, rois),
-                                                     args=cv.compile_args(cv.gapi.networks(pp)))
-
-        # Check
-        for gapi_age, gapi_gender, dnn_age, dnn_gender in zip(gapi_age_list,
-                                                              gapi_gender_list,
-                                                              dnn_age_list,
-                                                              dnn_gender_list):
+            # Check
             self.assertEqual(0.0, cv.norm(dnn_gender, gapi_gender, cv.NORM_INF))
             self.assertEqual(0.0, cv.norm(dnn_age, gapi_age, cv.NORM_INF))
 
 
+        def test_age_gender_infer_roi_list(self):
+            # NB: Check IE
+            if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
+                return
+
+            root_path    = '/omz_intel_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013'
+            model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            device_id    = 'CPU'
+
+            rois = [(10, 15, 62, 62), (23, 50, 62, 62), (14, 100, 62, 62), (80, 50, 62, 62)]
+            img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            img = cv.imread(img_path)
+
+            # OpenCV DNN
+            dnn_age_list    = []
+            dnn_gender_list = []
+            for roi in rois:
+                age, gender = self.infer_reference_network(model_path,
+                                                           weights_path,
+                                                           self.make_roi(img, roi))
+                dnn_age_list.append(age)
+                dnn_gender_list.append(gender)
+
+            # OpenCV G-API
+            g_in   = cv.GMat()
+            g_rois = cv.GArrayT(cv.gapi.CV_RECT)
+            inputs = cv.GInferInputs()
+            inputs.setInput('data', g_in)
+
+            outputs  = cv.gapi.infer("net", g_rois, inputs)
+            age_g    = outputs.at("age_conv3")
+            gender_g = outputs.at("prob")
+
+            comp = cv.GComputation(cv.GIn(g_in, g_rois), cv.GOut(age_g, gender_g))
+            pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
+
+            gapi_age_list, gapi_gender_list = comp.apply(cv.gin(img, rois),
+                                                         args=cv.gapi.compile_args(cv.gapi.networks(pp)))
+
+            # Check
+            for gapi_age, gapi_gender, dnn_age, dnn_gender in zip(gapi_age_list,
+                                                                  gapi_gender_list,
+                                                                  dnn_age_list,
+                                                                  dnn_gender_list):
+                self.assertEqual(0.0, cv.norm(dnn_gender, gapi_gender, cv.NORM_INF))
+                self.assertEqual(0.0, cv.norm(dnn_age, gapi_age, cv.NORM_INF))
+
+
+        def test_age_gender_infer2_roi(self):
+            # NB: Check IE
+            if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
+                return
+
+            root_path    = '/omz_intel_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013'
+            model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            device_id    = 'CPU'
+
+            rois = [(10, 15, 62, 62), (23, 50, 62, 62), (14, 100, 62, 62), (80, 50, 62, 62)]
+            img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            img = cv.imread(img_path)
+
+            # OpenCV DNN
+            dnn_age_list    = []
+            dnn_gender_list = []
+            for roi in rois:
+                age, gender = self.infer_reference_network(model_path,
+                                                           weights_path,
+                                                           self.make_roi(img, roi))
+                dnn_age_list.append(age)
+                dnn_gender_list.append(gender)
+
+            # OpenCV G-API
+            g_in   = cv.GMat()
+            g_rois = cv.GArrayT(cv.gapi.CV_RECT)
+            inputs = cv.GInferListInputs()
+            inputs.setInput('data', g_rois)
+
+            outputs  = cv.gapi.infer2("net", g_in, inputs)
+            age_g    = outputs.at("age_conv3")
+            gender_g = outputs.at("prob")
+
+            comp = cv.GComputation(cv.GIn(g_in, g_rois), cv.GOut(age_g, gender_g))
+            pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
+
+            gapi_age_list, gapi_gender_list = comp.apply(cv.gin(img, rois),
+                                                         args=cv.gapi.compile_args(cv.gapi.networks(pp)))
+
+            # Check
+            for gapi_age, gapi_gender, dnn_age, dnn_gender in zip(gapi_age_list,
+                                                                  gapi_gender_list,
+                                                                  dnn_age_list,
+                                                                  dnn_gender_list):
+                self.assertEqual(0.0, cv.norm(dnn_gender, gapi_gender, cv.NORM_INF))
+                self.assertEqual(0.0, cv.norm(dnn_age, gapi_age, cv.NORM_INF))
+
+
+
+        def test_person_detection_retail_0013(self):
+            # NB: Check IE
+            if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
+                return
+
+            root_path    = '/omz_intel_models/intel/person-detection-retail-0013/FP32/person-detection-retail-0013'
+            model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            img_path     = self.find_file('gpu/lbpcascade/er.png', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            device_id    = 'CPU'
+            img          = cv.resize(cv.imread(img_path), (544, 320))
+
+            # OpenCV DNN
+            net = cv.dnn.readNetFromModelOptimizer(model_path, weights_path)
+            net.setPreferableBackend(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE)
+            net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
+
+            blob = cv.dnn.blobFromImage(img)
+
+            def parseSSD(detections, size):
+                h, w = size
+                bboxes = []
+                detections = detections.reshape(-1, 7)
+                for sample_id, class_id, confidence, xmin, ymin, xmax, ymax in detections:
+                    if confidence >= 0.5:
+                        x      = int(xmin * w)
+                        y      = int(ymin * h)
+                        width  = int(xmax * w - x)
+                        height = int(ymax * h - y)
+                        bboxes.append((x, y, width, height))
+
+                return bboxes
+
+            net.setInput(blob)
+            dnn_detections = net.forward()
+            dnn_boxes = parseSSD(np.array(dnn_detections), img.shape[:2])
+
+            # OpenCV G-API
+            g_in   = cv.GMat()
+            inputs = cv.GInferInputs()
+            inputs.setInput('data', g_in)
+
+            g_sz       = cv.gapi.streaming.size(g_in)
+            outputs    = cv.gapi.infer("net", inputs)
+            detections = outputs.at("detection_out")
+            bboxes     = cv.gapi.parseSSD(detections, g_sz, 0.5, False, False)
+
+            comp = cv.GComputation(cv.GIn(g_in), cv.GOut(bboxes))
+            pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
+
+            gapi_boxes = comp.apply(cv.gin(img.astype(np.float32)),
+                                    args=cv.gapi.compile_args(cv.gapi.networks(pp)))
+
+            # Comparison
+            self.assertEqual(0.0, cv.norm(np.array(dnn_boxes).flatten(),
+                                          np.array(gapi_boxes).flatten(),
+                                          cv.NORM_INF))
+
+
+        def test_person_detection_retail_0013(self):
+            # NB: Check IE
+            if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
+                return
+
+            root_path    = '/omz_intel_models/intel/person-detection-retail-0013/FP32/person-detection-retail-0013'
+            model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
+            img_path     = self.find_file('gpu/lbpcascade/er.png', [os.environ.get('OPENCV_TEST_DATA_PATH')])
+            device_id    = 'CPU'
+            img          = cv.resize(cv.imread(img_path), (544, 320))
+
+            # OpenCV DNN
+            net = cv.dnn.readNetFromModelOptimizer(model_path, weights_path)
+            net.setPreferableBackend(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE)
+            net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
+
+            blob = cv.dnn.blobFromImage(img)
+
+            def parseSSD(detections, size):
+                h, w = size
+                bboxes = []
+                detections = detections.reshape(-1, 7)
+                for sample_id, class_id, confidence, xmin, ymin, xmax, ymax in detections:
+                    if confidence >= 0.5:
+                        x      = int(xmin * w)
+                        y      = int(ymin * h)
+                        width  = int(xmax * w - x)
+                        height = int(ymax * h - y)
+                        bboxes.append((x, y, width, height))
+
+                return bboxes
+
+            net.setInput(blob)
+            dnn_detections = net.forward()
+            dnn_boxes = parseSSD(np.array(dnn_detections), img.shape[:2])
+
+            # OpenCV G-API
+            g_in   = cv.GMat()
+            inputs = cv.GInferInputs()
+            inputs.setInput('data', g_in)
+
+            g_sz       = cv.gapi.streaming.size(g_in)
+            outputs    = cv.gapi.infer("net", inputs)
+            detections = outputs.at("detection_out")
+            bboxes     = cv.gapi.parseSSD(detections, g_sz, 0.5, False, False)
+
+            comp = cv.GComputation(cv.GIn(g_in), cv.GOut(bboxes))
+            pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
+
+            gapi_boxes = comp.apply(cv.gin(img.astype(np.float32)),
+                                    args=cv.gapi.compile_args(cv.gapi.networks(pp)))
+
+            # Comparison
+            self.assertEqual(0.0, cv.norm(np.array(dnn_boxes).flatten(),
+                                          np.array(gapi_boxes).flatten(),
+                                          cv.NORM_INF))
+
+
+except unittest.SkipTest as e:
+
+    message = str(e)
+
+    class TestSkip(unittest.TestCase):
+        def setUp(self):
+            self.skipTest('Skip tests: ' + message)
+
+        def test_skip():
+            pass
 
-    def test_person_detection_retail_0013(self):
-        # NB: Check IE
-        if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
-            return
-
-        root_path    = '/omz_intel_models/intel/person-detection-retail-0013/FP32/person-detection-retail-0013'
-        model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        img_path     = self.find_file('gpu/lbpcascade/er.png', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        device_id    = 'CPU'
-        img          = cv.resize(cv.imread(img_path), (544, 320))
-
-        # OpenCV DNN
-        net = cv.dnn.readNetFromModelOptimizer(model_path, weights_path)
-        net.setPreferableBackend(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE)
-        net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
-
-        blob = cv.dnn.blobFromImage(img)
-
-        def parseSSD(detections, size):
-            h, w = size
-            bboxes = []
-            detections = detections.reshape(-1, 7)
-            for sample_id, class_id, confidence, xmin, ymin, xmax, ymax in detections:
-                if confidence >= 0.5:
-                    x      = int(xmin * w)
-                    y      = int(ymin * h)
-                    width  = int(xmax * w - x)
-                    height = int(ymax * h - y)
-                    bboxes.append((x, y, width, height))
-
-            return bboxes
-
-        net.setInput(blob)
-        dnn_detections = net.forward()
-        dnn_boxes = parseSSD(np.array(dnn_detections), img.shape[:2])
-
-        # OpenCV G-API
-        g_in   = cv.GMat()
-        inputs = cv.GInferInputs()
-        inputs.setInput('data', g_in)
-
-        g_sz       = cv.gapi.streaming.size(g_in)
-        outputs    = cv.gapi.infer("net", inputs)
-        detections = outputs.at("detection_out")
-        bboxes     = cv.gapi.parseSSD(detections, g_sz, 0.5, False, False)
-
-        comp = cv.GComputation(cv.GIn(g_in), cv.GOut(bboxes))
-        pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
-
-        gapi_age, gapi_gender = comp.apply(cv.gin(img), args=cv.compile_args(cv.gapi.networks(pp)))
-
-        gapi_boxes = comp.apply(cv.gin(img.astype(np.float32)),
-                                args=cv.compile_args(cv.gapi.networks(pp)))
-
-        # Comparison
-        self.assertEqual(0.0, cv.norm(np.array(dnn_boxes).flatten(),
-                                      np.array(gapi_boxes).flatten(),
-                                      cv.NORM_INF))
-
-
-    def test_person_detection_retail_0013(self):
-        # NB: Check IE
-        if not cv.dnn.DNN_TARGET_CPU in cv.dnn.getAvailableTargets(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE):
-            return
-
-        root_path    = '/omz_intel_models/intel/person-detection-retail-0013/FP32/person-detection-retail-0013'
-        model_path   = self.find_file(root_path + '.xml',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        weights_path = self.find_file(root_path + '.bin',   [os.environ.get('OPENCV_DNN_TEST_DATA_PATH')])
-        img_path     = self.find_file('gpu/lbpcascade/er.png', [os.environ.get('OPENCV_TEST_DATA_PATH')])
-        device_id    = 'CPU'
-        img          = cv.resize(cv.imread(img_path), (544, 320))
-
-        # OpenCV DNN
-        net = cv.dnn.readNetFromModelOptimizer(model_path, weights_path)
-        net.setPreferableBackend(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE)
-        net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
-
-        blob = cv.dnn.blobFromImage(img)
-
-        def parseSSD(detections, size):
-            h, w = size
-            bboxes = []
-            detections = detections.reshape(-1, 7)
-            for sample_id, class_id, confidence, xmin, ymin, xmax, ymax in detections:
-                if confidence >= 0.5:
-                    x      = int(xmin * w)
-                    y      = int(ymin * h)
-                    width  = int(xmax * w - x)
-                    height = int(ymax * h - y)
-                    bboxes.append((x, y, width, height))
-
-            return bboxes
-
-        net.setInput(blob)
-        dnn_detections = net.forward()
-        dnn_boxes = parseSSD(np.array(dnn_detections), img.shape[:2])
-
-        # OpenCV G-API
-        g_in   = cv.GMat()
-        inputs = cv.GInferInputs()
-        inputs.setInput('data', g_in)
-
-        g_sz       = cv.gapi.streaming.size(g_in)
-        outputs    = cv.gapi.infer("net", inputs)
-        detections = outputs.at("detection_out")
-        bboxes     = cv.gapi.parseSSD(detections, g_sz, 0.5, False, False)
-
-        comp = cv.GComputation(cv.GIn(g_in), cv.GOut(bboxes))
-        pp = cv.gapi.ie.params("net", model_path, weights_path, device_id)
-
-        gapi_boxes = comp.apply(cv.gin(img.astype(np.float32)),
-                                args=cv.compile_args(cv.gapi.networks(pp)))
-
-        # Comparison
-        self.assertEqual(0.0, cv.norm(np.array(dnn_boxes).flatten(),
-                                      np.array(gapi_boxes).flatten(),
-                                      cv.NORM_INF))
+    pass
 
 
 if __name__ == '__main__':
index 2f92190..a10d63f 100644 (file)
@@ -225,7 +225,7 @@ try:
             comp = cv.GComputation(cv.GIn(g_in1, g_in2), cv.GOut(g_out))
 
             pkg = cv.gapi.kernels(GAddImpl)
-            actual = comp.apply(cv.gin(in_mat1, in_mat2), args=cv.compile_args(pkg))
+            actual = comp.apply(cv.gin(in_mat1, in_mat2), args=cv.gapi.compile_args(pkg))
 
             self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
 
@@ -245,7 +245,7 @@ try:
             comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_ch1, g_ch2, g_ch3))
 
             pkg = cv.gapi.kernels(GSplit3Impl)
-            ch1, ch2, ch3 = comp.apply(cv.gin(in_mat), args=cv.compile_args(pkg))
+            ch1, ch2, ch3 = comp.apply(cv.gin(in_mat), args=cv.gapi.compile_args(pkg))
 
             self.assertEqual(0.0, cv.norm(in_ch1, ch1, cv.NORM_INF))
             self.assertEqual(0.0, cv.norm(in_ch2, ch2, cv.NORM_INF))
@@ -266,7 +266,7 @@ try:
             comp = cv.GComputation(g_in, g_out)
 
             pkg    = cv.gapi.kernels(GMeanImpl)
-            actual = comp.apply(cv.gin(in_mat), args=cv.compile_args(pkg))
+            actual = comp.apply(cv.gin(in_mat), args=cv.gapi.compile_args(pkg))
 
             # Comparison
             self.assertEqual(expected, actual)
@@ -287,7 +287,7 @@ try:
             comp  = cv.GComputation(cv.GIn(g_in, g_sc), cv.GOut(g_out))
 
             pkg = cv.gapi.kernels(GAddCImpl)
-            actual = comp.apply(cv.gin(in_mat, sc), args=cv.compile_args(pkg))
+            actual = comp.apply(cv.gin(in_mat, sc), args=cv.gapi.compile_args(pkg))
 
             self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
 
@@ -305,7 +305,7 @@ try:
             comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_sz))
 
             pkg = cv.gapi.kernels(GSizeImpl)
-            actual = comp.apply(cv.gin(in_mat), args=cv.compile_args(pkg))
+            actual = comp.apply(cv.gin(in_mat), args=cv.gapi.compile_args(pkg))
 
             self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
 
@@ -322,7 +322,7 @@ try:
             comp = cv.GComputation(cv.GIn(g_r), cv.GOut(g_sz))
 
             pkg = cv.gapi.kernels(GSizeRImpl)
-            actual = comp.apply(cv.gin(roi), args=cv.compile_args(pkg))
+            actual = comp.apply(cv.gin(roi), args=cv.gapi.compile_args(pkg))
 
             # cv.norm works with tuples ?
             self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
@@ -340,7 +340,7 @@ try:
             comp  = cv.GComputation(cv.GIn(g_pts), cv.GOut(g_br))
 
             pkg = cv.gapi.kernels(GBoundingRectImpl)
-            actual = comp.apply(cv.gin(points), args=cv.compile_args(pkg))
+            actual = comp.apply(cv.gin(points), args=cv.gapi.compile_args(pkg))
 
             # cv.norm works with tuples ?
             self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
@@ -371,7 +371,7 @@ try:
 
             comp = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
             pkg = cv.gapi.kernels(GGoodFeaturesImpl)
-            actual = comp.apply(cv.gin(in_mat), args=cv.compile_args(pkg))
+            actual = comp.apply(cv.gin(in_mat), args=cv.gapi.compile_args(pkg))
 
             # NB: OpenCV & G-API have different output types.
             # OpenCV - numpy array with shape (num_points, 1, 2)
@@ -453,10 +453,10 @@ try:
             g_in  = cv.GArray.Int()
             comp  = cv.GComputation(cv.GIn(g_in), cv.GOut(GSum.on(g_in)))
 
-            s = comp.apply(cv.gin([1, 2, 3, 4]), args=cv.compile_args(cv.gapi.kernels(GSumImpl)))
+            s = comp.apply(cv.gin([1, 2, 3, 4]), args=cv.gapi.compile_args(cv.gapi.kernels(GSumImpl)))
             self.assertEqual(10, s)
 
-            s = comp.apply(cv.gin([1, 2, 8, 7]), args=cv.compile_args(cv.gapi.kernels(GSumImpl)))
+            s = comp.apply(cv.gin([1, 2, 8, 7]), args=cv.gapi.compile_args(cv.gapi.kernels(GSumImpl)))
             self.assertEqual(18, s)
 
             self.assertEqual(18, GSumImpl.last_result)
@@ -488,13 +488,13 @@ try:
                         'tuple': (42, 42)
                     }
 
-            out = comp.apply(cv.gin(table, 'int'), args=cv.compile_args(cv.gapi.kernels(GLookUpImpl)))
+            out = comp.apply(cv.gin(table, 'int'), args=cv.gapi.compile_args(cv.gapi.kernels(GLookUpImpl)))
             self.assertEqual(42, out)
 
-            out = comp.apply(cv.gin(table, 'str'), args=cv.compile_args(cv.gapi.kernels(GLookUpImpl)))
+            out = comp.apply(cv.gin(table, 'str'), args=cv.gapi.compile_args(cv.gapi.kernels(GLookUpImpl)))
             self.assertEqual('hello, world!', out)
 
-            out = comp.apply(cv.gin(table, 'tuple'), args=cv.compile_args(cv.gapi.kernels(GLookUpImpl)))
+            out = comp.apply(cv.gin(table, 'tuple'), args=cv.gapi.compile_args(cv.gapi.kernels(GLookUpImpl)))
             self.assertEqual((42, 42), out)
 
 
@@ -521,7 +521,7 @@ try:
             arr1 = [3,    'str']
 
             out = comp.apply(cv.gin(arr0, arr1),
-                             args=cv.compile_args(cv.gapi.kernels(GConcatImpl)))
+                             args=cv.gapi.compile_args(cv.gapi.kernels(GConcatImpl)))
 
             self.assertEqual(arr0 + arr1, out)
 
@@ -550,7 +550,7 @@ try:
             img1 = np.array([1, 2, 3])
 
             with self.assertRaises(Exception): comp.apply(cv.gin(img0, img1),
-                                                          args=cv.compile_args(
+                                                          args=cv.gapi.compile_args(
                                                               cv.gapi.kernels(GAddImpl)))
 
 
@@ -577,7 +577,7 @@ try:
             img1 = np.array([1, 2, 3])
 
             with self.assertRaises(Exception): comp.apply(cv.gin(img0, img1),
-                                                          args=cv.compile_args(
+                                                          args=cv.gapi.compile_args(
                                                               cv.gapi.kernels(GAddImpl)))
 
 
@@ -607,7 +607,7 @@ try:
             # FIXME: Cause Bad variant access.
             # Need to provide more descriptive error messsage.
             with self.assertRaises(Exception): comp.apply(cv.gin(img0, img1),
-                                                          args=cv.compile_args(
+                                                          args=cv.gapi.compile_args(
                                                               cv.gapi.kernels(GAddImpl)))
 
         def test_pipeline_with_custom_kernels(self):
@@ -657,7 +657,7 @@ try:
             g_mean       = cv.gapi.mean(g_transposed)
 
             comp = cv.GComputation(cv.GIn(g_bgr), cv.GOut(g_mean))
-            actual = comp.apply(cv.gin(img), args=cv.compile_args(
+            actual = comp.apply(cv.gin(img), args=cv.gapi.compile_args(
                 cv.gapi.kernels(GResizeImpl, GTransposeImpl)))
 
             self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
index 5356abc..f1cce4f 100644 (file)
 import numpy as np
 import cv2 as cv
 import os
+import sys
+import unittest
 
 from tests_common import NewOpenCVTests
 
-class test_gapi_streaming(NewOpenCVTests):
 
-    def test_image_input(self):
-        sz = (1280, 720)
-        in_mat = np.random.randint(0, 100, sz).astype(np.uint8)
+try:
 
-        # OpenCV
-        expected = cv.medianBlur(in_mat, 3)
+    if sys.version_info[:2] < (3, 0):
+        raise unittest.SkipTest('Python 2.x is not supported')
 
-        # G-API
-        g_in = cv.GMat()
-        g_out = cv.gapi.medianBlur(g_in, 3)
-        c = cv.GComputation(g_in, g_out)
-        ccomp = c.compileStreaming(cv.descr_of(in_mat))
-        ccomp.setSource(cv.gin(in_mat))
-        ccomp.start()
 
-        _, actual = ccomp.pull()
+    class test_gapi_streaming(NewOpenCVTests):
 
-        # Assert
-        self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
+        def test_image_input(self):
+            sz = (1280, 720)
+            in_mat = np.random.randint(0, 100, sz).astype(np.uint8)
 
+            # OpenCV
+            expected = cv.medianBlur(in_mat, 3)
+
+            # G-API
+            g_in = cv.GMat()
+            g_out = cv.gapi.medianBlur(g_in, 3)
+            c = cv.GComputation(g_in, g_out)
+            ccomp = c.compileStreaming(cv.descr_of(in_mat))
+            ccomp.setSource(cv.gin(in_mat))
+            ccomp.start()
 
-    def test_video_input(self):
-        ksize = 3
-        path = self.find_file('cv/video/768x576.avi', [os.environ['OPENCV_TEST_DATA_PATH']])
+            _, actual = ccomp.pull()
 
-        # OpenCV
-        cap = cv.VideoCapture(path)
+            # Assert
+            self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
 
-        # G-API
-        g_in = cv.GMat()
-        g_out = cv.gapi.medianBlur(g_in, ksize)
-        c = cv.GComputation(g_in, g_out)
 
-        ccomp = c.compileStreaming()
-        source = cv.gapi.wip.make_capture_src(path)
-        ccomp.setSource(source)
-        ccomp.start()
+        def test_video_input(self):
+            ksize = 3
+            path = self.find_file('cv/video/768x576.avi', [os.environ['OPENCV_TEST_DATA_PATH']])
+
+            # OpenCV
+            cap = cv.VideoCapture(path)
 
-        # Assert
-        max_num_frames  = 10
-        proc_num_frames = 0
-        while cap.isOpened():
-            has_expected, expected = cap.read()
-            has_actual,   actual   = ccomp.pull()
+            # G-API
+            g_in = cv.GMat()
+            g_out = cv.gapi.medianBlur(g_in, ksize)
+            c = cv.GComputation(g_in, g_out)
 
-            self.assertEqual(has_expected, has_actual)
+            ccomp = c.compileStreaming()
+            source = cv.gapi.wip.make_capture_src(path)
+            ccomp.setSource(source)
+            ccomp.start()
 
-            if not has_actual:
-                break
+            # Assert
+            max_num_frames  = 10
+            proc_num_frames = 0
+            while cap.isOpened():
+                has_expected, expected = cap.read()
+                has_actual,   actual   = ccomp.pull()
 
-            self.assertEqual(0.0, cv.norm(cv.medianBlur(expected, ksize), actual, cv.NORM_INF))
+                self.assertEqual(has_expected, has_actual)
 
-            proc_num_frames += 1
-            if proc_num_frames == max_num_frames:
-                break;
+                if not has_actual:
+                    break
 
+                self.assertEqual(0.0, cv.norm(cv.medianBlur(expected, ksize), actual, cv.NORM_INF))
 
-    def test_video_split3(self):
-        path = self.find_file('cv/video/768x576.avi', [os.environ['OPENCV_TEST_DATA_PATH']])
+                proc_num_frames += 1
+                if proc_num_frames == max_num_frames:
+                    break
 
-        # OpenCV
-        cap = cv.VideoCapture(path)
 
-        # G-API
-        g_in = cv.GMat()
-        b, g, r = cv.gapi.split3(g_in)
-        c = cv.GComputation(cv.GIn(g_in), cv.GOut(b, g, r))
+        def test_video_split3(self):
+            path = self.find_file('cv/video/768x576.avi', [os.environ['OPENCV_TEST_DATA_PATH']])
 
-        ccomp = c.compileStreaming()
-        source = cv.gapi.wip.make_capture_src(path)
-        ccomp.setSource(source)
-        ccomp.start()
+            # OpenCV
+            cap = cv.VideoCapture(path)
 
-        # Assert
-        max_num_frames  = 10
-        proc_num_frames = 0
-        while cap.isOpened():
-            has_expected, frame = cap.read()
-            has_actual,   actual   = ccomp.pull()
+            # G-API
+            g_in = cv.GMat()
+            b, g, r = cv.gapi.split3(g_in)
+            c = cv.GComputation(cv.GIn(g_in), cv.GOut(b, g, r))
 
-            self.assertEqual(has_expected, has_actual)
+            ccomp = c.compileStreaming()
+            source = cv.gapi.wip.make_capture_src(path)
+            ccomp.setSource(source)
+            ccomp.start()
 
-            if not has_actual:
-                break
+            # Assert
+            max_num_frames  = 10
+            proc_num_frames = 0
+            while cap.isOpened():
+                has_expected, frame = cap.read()
+                has_actual,   actual   = ccomp.pull()
 
-            expected = cv.split(frame)
-            for e, a in zip(expected, actual):
-                self.assertEqual(0.0, cv.norm(e, a, cv.NORM_INF))
+                self.assertEqual(has_expected, has_actual)
 
-            proc_num_frames += 1
-            if proc_num_frames == max_num_frames:
-                break;
+                if not has_actual:
+                    break
 
+                expected = cv.split(frame)
+                for e, a in zip(expected, actual):
+                    self.assertEqual(0.0, cv.norm(e, a, cv.NORM_INF))
 
-    def test_video_add(self):
-        sz = (576, 768, 3)
-        in_mat = np.random.randint(0, 100, sz).astype(np.uint8)
+                proc_num_frames += 1
+                if proc_num_frames == max_num_frames:
+                    break
 
-        path = self.find_file('cv/video/768x576.avi', [os.environ['OPENCV_TEST_DATA_PATH']])
 
-        # OpenCV
-        cap = cv.VideoCapture(path)
+        def test_video_add(self):
+            sz = (576, 768, 3)
+            in_mat = np.random.randint(0, 100, sz).astype(np.uint8)
 
-        # G-API
-        g_in1 = cv.GMat()
-        g_in2 = cv.GMat()
-        out = cv.gapi.add(g_in1, g_in2)
-        c = cv.GComputation(cv.GIn(g_in1, g_in2), cv.GOut(out))
+            path = self.find_file('cv/video/768x576.avi', [os.environ['OPENCV_TEST_DATA_PATH']])
 
-        ccomp = c.compileStreaming()
-        source = cv.gapi.wip.make_capture_src(path)
-        ccomp.setSource(cv.gin(source, in_mat))
-        ccomp.start()
+            # OpenCV
+            cap = cv.VideoCapture(path)
 
-        # Assert
-        max_num_frames  = 10
-        proc_num_frames = 0
-        while cap.isOpened():
-            has_expected, frame  = cap.read()
-            has_actual,   actual = ccomp.pull()
+            # G-API
+            g_in1 = cv.GMat()
+            g_in2 = cv.GMat()
+            out = cv.gapi.add(g_in1, g_in2)
+            c = cv.GComputation(cv.GIn(g_in1, g_in2), cv.GOut(out))
 
-            self.assertEqual(has_expected, has_actual)
+            ccomp = c.compileStreaming()
+            source = cv.gapi.wip.make_capture_src(path)
+            ccomp.setSource(cv.gin(source, in_mat))
+            ccomp.start()
 
-            if not has_actual:
-                break
+            # Assert
+            max_num_frames  = 10
+            proc_num_frames = 0
+            while cap.isOpened():
+                has_expected, frame  = cap.read()
+                has_actual,   actual = ccomp.pull()
 
-            expected = cv.add(frame, in_mat)
-            self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
+                self.assertEqual(has_expected, has_actual)
 
-            proc_num_frames += 1
-            if proc_num_frames == max_num_frames:
-                break;
+                if not has_actual:
+                    break
 
+                expected = cv.add(frame, in_mat)
+                self.assertEqual(0.0, cv.norm(expected, actual, cv.NORM_INF))
 
-    def test_video_good_features_to_track(self):
-        path = self.find_file('cv/video/768x576.avi', [os.environ['OPENCV_TEST_DATA_PATH']])
+                proc_num_frames += 1
+                if proc_num_frames == max_num_frames:
+                    break;
 
-        # NB: goodFeaturesToTrack configuration
-        max_corners         = 50
-        quality_lvl         = 0.01
-        min_distance        = 10
-        block_sz            = 3
-        use_harris_detector = True
-        k                   = 0.04
-        mask                = None
 
-        # OpenCV
-        cap = cv.VideoCapture(path)
+        def test_video_good_features_to_track(self):
+            path = self.find_file('cv/video/768x576.avi', [os.environ['OPENCV_TEST_DATA_PATH']])
 
-        # G-API
-        g_in = cv.GMat()
-        g_gray = cv.gapi.RGB2Gray(g_in)
-        g_out = cv.gapi.goodFeaturesToTrack(g_gray, max_corners, quality_lvl,
-                                            min_distance, mask, block_sz, use_harris_detector, k)
+            # NB: goodFeaturesToTrack configuration
+            max_corners         = 50
+            quality_lvl         = 0.01
+            min_distance        = 10
+            block_sz            = 3
+            use_harris_detector = True
+            k                   = 0.04
+            mask                = None
 
-        c = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
+            # OpenCV
+            cap = cv.VideoCapture(path)
 
-        ccomp = c.compileStreaming()
-        source = cv.gapi.wip.make_capture_src(path)
-        ccomp.setSource(source)
-        ccomp.start()
+            # G-API
+            g_in = cv.GMat()
+            g_gray = cv.gapi.RGB2Gray(g_in)
+            g_out = cv.gapi.goodFeaturesToTrack(g_gray, max_corners, quality_lvl,
+                                                min_distance, mask, block_sz, use_harris_detector, k)
 
-        # Assert
-        max_num_frames  = 10
-        proc_num_frames = 0
-        while cap.isOpened():
-            has_expected, frame  = cap.read()
-            has_actual,   actual = ccomp.pull()
+            c = cv.GComputation(cv.GIn(g_in), cv.GOut(g_out))
 
-            self.assertEqual(has_expected, has_actual)
+            ccomp = c.compileStreaming()
+            source = cv.gapi.wip.make_capture_src(path)
+            ccomp.setSource(source)
+            ccomp.start()
 
-            if not has_actual:
-                break
+            # Assert
+            max_num_frames  = 10
+            proc_num_frames = 0
+            while cap.isOpened():
+                has_expected, frame  = cap.read()
+                has_actual,   actual = ccomp.pull()
+
+                self.assertEqual(has_expected, has_actual)
+
+                if not has_actual:
+                    break
+
+                # OpenCV
+                frame = cv.cvtColor(frame, cv.COLOR_RGB2GRAY)
+                expected = cv.goodFeaturesToTrack(frame, max_corners, quality_lvl,
+                                                  min_distance, mask=mask,
+                                                  blockSize=block_sz, useHarrisDetector=use_harris_detector, k=k)
+                for e, a in zip(expected, actual):
+                    # NB: OpenCV & G-API have different output shapes:
+                    # OpenCV - (num_points, 1, 2)
+                    # G-API  - (num_points, 2)
+                    self.assertEqual(0.0, cv.norm(e.flatten(),
+                                                  np.array(a, np.float32).flatten(),
+                                                  cv.NORM_INF))
+
+                proc_num_frames += 1
+                if proc_num_frames == max_num_frames:
+                    break
+
+
+except unittest.SkipTest as e:
+
+    message = str(e)
+
+    class TestSkip(unittest.TestCase):
+        def setUp(self):
+            self.skipTest('Skip tests: ' + message)
+
+        def test_skip():
+            pass
+
+    pass
 
-            # OpenCV
-            frame = cv.cvtColor(frame, cv.COLOR_RGB2GRAY)
-            expected = cv.goodFeaturesToTrack(frame, max_corners, quality_lvl,
-                                              min_distance, mask=mask,
-                                              blockSize=block_sz, useHarrisDetector=use_harris_detector, k=k)
-            for e, a in zip(expected, actual):
-                # NB: OpenCV & G-API have different output shapes:
-                # OpenCV - (num_points, 1, 2)
-                # G-API  - (num_points, 2)
-                self.assertEqual(0.0, cv.norm(e.flatten(),
-                                              np.array(a, np.float32).flatten(),
-                                              cv.NORM_INF))
-
-            proc_num_frames += 1
-            if proc_num_frames == max_num_frames:
-                break;
 
 if __name__ == '__main__':
     NewOpenCVTests.bootstrap()
index 0f3b194..dde554f 100644 (file)
@@ -3,29 +3,51 @@
 import numpy as np
 import cv2 as cv
 import os
+import sys
+import unittest
 
 from tests_common import NewOpenCVTests
 
-class gapi_types_test(NewOpenCVTests):
 
-    def test_garray_type(self):
-        types = [cv.gapi.CV_BOOL  , cv.gapi.CV_INT   , cv.gapi.CV_DOUBLE , cv.gapi.CV_FLOAT,
-                 cv.gapi.CV_STRING, cv.gapi.CV_POINT , cv.gapi.CV_POINT2F, cv.gapi.CV_SIZE ,
-                 cv.gapi.CV_RECT  , cv.gapi.CV_SCALAR, cv.gapi.CV_MAT    , cv.gapi.CV_GMAT]
+try:
 
-        for t in types:
-            g_array = cv.GArrayT(t)
-            self.assertEqual(t, g_array.type())
+    if sys.version_info[:2] < (3, 0):
+        raise unittest.SkipTest('Python 2.x is not supported')
 
+    class gapi_types_test(NewOpenCVTests):
 
-    def test_gopaque_type(self):
-        types = [cv.gapi.CV_BOOL  , cv.gapi.CV_INT   , cv.gapi.CV_DOUBLE , cv.gapi.CV_FLOAT,
-                 cv.gapi.CV_STRING, cv.gapi.CV_POINT , cv.gapi.CV_POINT2F, cv.gapi.CV_SIZE ,
-                 cv.gapi.CV_RECT]
+        def test_garray_type(self):
+            types = [cv.gapi.CV_BOOL  , cv.gapi.CV_INT   , cv.gapi.CV_DOUBLE , cv.gapi.CV_FLOAT,
+                     cv.gapi.CV_STRING, cv.gapi.CV_POINT , cv.gapi.CV_POINT2F, cv.gapi.CV_SIZE ,
+                     cv.gapi.CV_RECT  , cv.gapi.CV_SCALAR, cv.gapi.CV_MAT    , cv.gapi.CV_GMAT]
 
-        for t in types:
-            g_opaque = cv.GOpaqueT(t)
-            self.assertEqual(t, g_opaque.type())
+            for t in types:
+                g_array = cv.GArrayT(t)
+                self.assertEqual(t, g_array.type())
+
+
+        def test_gopaque_type(self):
+            types = [cv.gapi.CV_BOOL  , cv.gapi.CV_INT   , cv.gapi.CV_DOUBLE , cv.gapi.CV_FLOAT,
+                     cv.gapi.CV_STRING, cv.gapi.CV_POINT , cv.gapi.CV_POINT2F, cv.gapi.CV_SIZE ,
+                     cv.gapi.CV_RECT]
+
+            for t in types:
+                g_opaque = cv.GOpaqueT(t)
+                self.assertEqual(t, g_opaque.type())
+
+
+except unittest.SkipTest as e:
+
+    message = str(e)
+
+    class TestSkip(unittest.TestCase):
+        def setUp(self):
+            self.skipTest('Skip tests: ' + message)
+
+        def test_skip():
+            pass
+
+    pass
 
 
 if __name__ == '__main__':