From 2ed6d0f59012751cc99dd0dd29e614b17a59dcc1 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 19 Nov 2024 10:29:24 +0300 Subject: [PATCH] Merge pull request #26469 from vpisarev:move_gapi_to_contrib_part1 Removed g-api from the main repo #26469 Following #25000. CI patch: https://github.com/opencv/ci-gha-workflow/pull/196 This is migration of G-API from opencv to opencv_contrib, part 1. Here we simply remove G-API from the main repo. The next patch should bring G-API to opencv_contrib. - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake --- cmake/OpenCVPackaging.cmake | 2 +- .../vars/OPENCV_DISABLE_THREAD_SUPPORT.cmake | 1 - .../pics/massif_export_gapi.png | Bin 85388 -> 0 bytes .../pics/massif_export_gapi_fluid.png | Bin 86636 -> 0 bytes .../pics/massif_export_ocv.png | Bin 76635 -> 0 bytes .../anisotropic_segmentation/pics/result.jpg | Bin 35271 -> 0 bytes .../anisotropic_segmentation/pics/segm.gif | Bin 187780 -> 0 bytes .../pics/segm_fluid.gif | Bin 225566 -> 0 bytes .../porting_anisotropic_segmentation.markdown | 404 -- .../face_beautification.markdown | 442 --- .../gapi/face_beautification/pics/example.jpg | Bin 176525 -> 0 bytes .../interactive_face_detection.markdown | 355 -- .../gapi/oak_devices/oak_devices.markdown | 26 - doc/tutorials/gapi/oak_devices/pics/oak.jpg | Bin 163279 -> 0 bytes .../gapi/table_of_content_gapi.markdown | 53 - .../env_reference/env_reference.markdown | 20 - doc/tutorials/tutorials.markdown | 1 - modules/gapi/CMakeLists.txt | 440 --- modules/gapi/cmake/DownloadADE.cmake | 51 - modules/gapi/cmake/init.cmake | 49 - modules/gapi/cmake/standalone.cmake | 62 - modules/gapi/doc/00-root.markdown | 125 - modules/gapi/doc/01-background.markdown | 76 - modules/gapi/doc/10-hld-overview.md | 160 - modules/gapi/doc/20-kernel-api.markdown | 188 - modules/gapi/doc/30-implementation.markdown | 29 - modules/gapi/doc/pics/demo.jpg | Bin 65973 -> 0 bytes modules/gapi/doc/pics/gapi_scheme.png | Bin 76918 -> 0 bytes modules/gapi/doc/pics/render_example.png | Bin 4392 -> 0 bytes modules/gapi/doc/slides/.gitignore | 6 - modules/gapi/doc/slides/README.md | 27 - modules/gapi/doc/slides/gapi_overview.org | 961 ----- modules/gapi/doc/slides/get_sty.sh | 25 - modules/gapi/doc/slides/ocv_logo.eps | 181 - modules/gapi/include/opencv2/gapi.hpp | 42 - modules/gapi/include/opencv2/gapi/core.hpp | 1911 ---------- .../gapi/include/opencv2/gapi/cpu/core.hpp | 27 - .../include/opencv2/gapi/cpu/gcpukernel.hpp | 542 --- .../gapi/include/opencv2/gapi/cpu/imgproc.hpp | 27 - modules/gapi/include/opencv2/gapi/cpu/ot.hpp | 29 - .../gapi/include/opencv2/gapi/cpu/stereo.hpp | 48 - .../gapi/include/opencv2/gapi/cpu/video.hpp | 25 - .../gapi/include/opencv2/gapi/fluid/core.hpp | 20 - .../opencv2/gapi/fluid/gfluidbuffer.hpp | 154 - .../opencv2/gapi/fluid/gfluidkernel.hpp | 442 --- .../include/opencv2/gapi/fluid/imgproc.hpp | 20 - modules/gapi/include/opencv2/gapi/garg.hpp | 311 -- modules/gapi/include/opencv2/gapi/garray.hpp | 440 --- .../include/opencv2/gapi/gasync_context.hpp | 63 - modules/gapi/include/opencv2/gapi/gcall.hpp | 78 - modules/gapi/include/opencv2/gapi/gcommon.hpp | 309 -- .../gapi/include/opencv2/gapi/gcompiled.hpp | 232 -- .../include/opencv2/gapi/gcompiled_async.hpp | 73 - .../include/opencv2/gapi/gcompoundkernel.hpp | 139 - .../include/opencv2/gapi/gcomputation.hpp | 581 --- .../opencv2/gapi/gcomputation_async.hpp | 69 - modules/gapi/include/opencv2/gapi/gframe.hpp | 113 - modules/gapi/include/opencv2/gapi/gkernel.hpp | 757 ---- modules/gapi/include/opencv2/gapi/gmat.hpp | 292 -- .../gapi/include/opencv2/gapi/gmetaarg.hpp | 80 - modules/gapi/include/opencv2/gapi/gopaque.hpp | 369 -- modules/gapi/include/opencv2/gapi/gproto.hpp | 159 - .../gapi/include/opencv2/gapi/gpu/core.hpp | 27 - .../include/opencv2/gapi/gpu/ggpukernel.hpp | 18 - .../gapi/include/opencv2/gapi/gpu/imgproc.hpp | 28 - modules/gapi/include/opencv2/gapi/gscalar.hpp | 140 - .../gapi/include/opencv2/gapi/gstreaming.hpp | 430 --- .../gapi/include/opencv2/gapi/gtransform.hpp | 103 - .../include/opencv2/gapi/gtype_traits.hpp | 242 -- modules/gapi/include/opencv2/gapi/gtyped.hpp | 246 -- modules/gapi/include/opencv2/gapi/imgproc.hpp | 1769 --------- modules/gapi/include/opencv2/gapi/infer.hpp | 717 ---- .../opencv2/gapi/infer/bindings_ie.hpp | 70 - .../opencv2/gapi/infer/bindings_onnx.hpp | 74 - .../opencv2/gapi/infer/bindings_ov.hpp | 128 - .../gapi/include/opencv2/gapi/infer/ie.hpp | 711 ---- .../gapi/include/opencv2/gapi/infer/onnx.hpp | 759 ---- .../gapi/include/opencv2/gapi/infer/ov.hpp | 709 ---- .../include/opencv2/gapi/infer/parsers.hpp | 138 - modules/gapi/include/opencv2/gapi/media.hpp | 258 -- .../gapi/include/opencv2/gapi/oak/infer.hpp | 66 - modules/gapi/include/opencv2/gapi/oak/oak.hpp | 158 - .../gapi/include/opencv2/gapi/ocl/core.hpp | 27 - .../include/opencv2/gapi/ocl/goclkernel.hpp | 260 -- .../gapi/include/opencv2/gapi/ocl/imgproc.hpp | 27 - .../include/opencv2/gapi/opencv_includes.hpp | 42 - .../gapi/include/opencv2/gapi/operators.hpp | 70 - modules/gapi/include/opencv2/gapi/ot.hpp | 194 - .../gapi/include/opencv2/gapi/own/assert.hpp | 60 - .../gapi/include/opencv2/gapi/own/convert.hpp | 55 - .../gapi/include/opencv2/gapi/own/cvdefs.hpp | 166 - .../gapi/include/opencv2/gapi/own/exports.hpp | 42 - modules/gapi/include/opencv2/gapi/own/mat.hpp | 354 -- .../include/opencv2/gapi/own/saturate.hpp | 83 - .../gapi/include/opencv2/gapi/own/scalar.hpp | 47 - .../gapi/include/opencv2/gapi/own/types.hpp | 162 - .../include/opencv2/gapi/plaidml/core.hpp | 20 - .../opencv2/gapi/plaidml/gplaidmlkernel.hpp | 140 - .../include/opencv2/gapi/plaidml/plaidml.hpp | 53 - .../include/opencv2/gapi/python/python.hpp | 71 - modules/gapi/include/opencv2/gapi/render.hpp | 14 - .../include/opencv2/gapi/render/render.hpp | 196 - .../opencv2/gapi/render/render_types.hpp | 359 -- modules/gapi/include/opencv2/gapi/rmat.hpp | 162 - modules/gapi/include/opencv2/gapi/s11n.hpp | 513 --- .../gapi/include/opencv2/gapi/s11n/base.hpp | 80 - modules/gapi/include/opencv2/gapi/stereo.hpp | 85 - .../include/opencv2/gapi/streaming/cap.hpp | 149 - .../include/opencv2/gapi/streaming/desync.hpp | 86 - .../include/opencv2/gapi/streaming/format.hpp | 94 - .../streaming/gstreamer/gstreamerpipeline.hpp | 59 - .../streaming/gstreamer/gstreamersource.hpp | 97 - .../include/opencv2/gapi/streaming/meta.hpp | 80 - .../gapi/streaming/onevpl/accel_types.hpp | 76 - .../gapi/streaming/onevpl/cfg_params.hpp | 209 -- .../onevpl/data_provider_interface.hpp | 105 - .../opencv2/gapi/streaming/onevpl/default.hpp | 29 - .../onevpl/device_selector_interface.hpp | 61 - .../opencv2/gapi/streaming/onevpl/source.hpp | 94 - .../opencv2/gapi/streaming/queue_source.hpp | 67 - .../include/opencv2/gapi/streaming/source.hpp | 67 - .../include/opencv2/gapi/streaming/sync.hpp | 30 - .../gapi/include/opencv2/gapi/util/any.hpp | 190 - .../opencv2/gapi/util/compiler_hints.hpp | 19 - .../opencv2/gapi/util/copy_through_move.hpp | 34 - .../include/opencv2/gapi/util/optional.hpp | 178 - .../gapi/include/opencv2/gapi/util/throw.hpp | 36 - .../include/opencv2/gapi/util/type_traits.hpp | 31 - .../gapi/include/opencv2/gapi/util/util.hpp | 190 - .../include/opencv2/gapi/util/variant.hpp | 667 ---- modules/gapi/include/opencv2/gapi/video.hpp | 364 -- .../gapi/misc/python/package/gapi/__init__.py | 323 -- modules/gapi/misc/python/pyopencv_gapi.hpp | 1172 ------ modules/gapi/misc/python/python_bridge.hpp | 353 -- .../misc/python/samples/gaze_estimation.py | 462 --- modules/gapi/misc/python/shadow_gapi.hpp | 86 - .../gapi/misc/python/test/test_gapi_core.py | 239 -- .../misc/python/test/test_gapi_imgproc.py | 127 - .../gapi/misc/python/test/test_gapi_infer.py | 341 -- .../misc/python/test/test_gapi_infer_onnx.py | 68 - .../misc/python/test/test_gapi_infer_ov.py | 238 -- .../misc/python/test/test_gapi_kernels.py | 48 - modules/gapi/misc/python/test/test_gapi_ot.py | 58 - .../gapi/misc/python/test/test_gapi_render.py | 227 -- .../python/test/test_gapi_sample_pipelines.py | 722 ---- .../python/test/test_gapi_stateful_kernel.py | 216 -- .../misc/python/test/test_gapi_streaming.py | 559 --- .../gapi/misc/python/test/test_gapi_types.py | 55 - .../gapi/perf/common/gapi_core_perf_tests.cpp | 9 - .../gapi/perf/common/gapi_core_perf_tests.hpp | 87 - .../perf/common/gapi_core_perf_tests_inl.hpp | 2502 ------------- .../perf/common/gapi_imgproc_perf_tests.cpp | 9 - .../perf/common/gapi_imgproc_perf_tests.hpp | 108 - .../common/gapi_imgproc_perf_tests_inl.hpp | 1947 ---------- .../perf/common/gapi_render_perf_tests.cpp | 9 - .../perf/common/gapi_render_perf_tests.hpp | 43 - .../common/gapi_render_perf_tests_inl.hpp | 827 ----- .../perf/common/gapi_video_perf_tests.cpp | 9 - .../perf/common/gapi_video_perf_tests.hpp | 40 - .../perf/common/gapi_video_perf_tests_inl.hpp | 397 -- .../perf/cpu/gapi_core_perf_tests_cpu.cpp | 401 -- .../perf/cpu/gapi_core_perf_tests_fluid.cpp | 332 -- .../perf/cpu/gapi_imgproc_perf_tests_cpu.cpp | 438 --- .../cpu/gapi_imgproc_perf_tests_fluid.cpp | 234 -- .../perf/cpu/gapi_video_perf_tests_cpu.cpp | 132 - .../perf/gpu/gapi_core_perf_tests_gpu.cpp | 327 -- .../perf/gpu/gapi_imgproc_perf_tests_gpu.cpp | 224 -- .../internal/gapi_compiler_perf_tests.cpp | 45 - modules/gapi/perf/perf_bench.cpp | 88 - modules/gapi/perf/perf_main.cpp | 11 - modules/gapi/perf/perf_precomp.hpp | 28 - .../render/gapi_render_perf_tests_ocv.cpp | 95 - .../gapi_streaming_source_perf_tests.cpp | 337 -- modules/gapi/samples/api_example.cpp | 34 - modules/gapi/samples/data/config_template.yml | 192 - modules/gapi/samples/draw_example.cpp | 56 - modules/gapi/samples/face_detection_mtcnn.cpp | 733 ---- modules/gapi/samples/gaze_estimation.cpp | 351 -- modules/gapi/samples/infer_ie_onnx_hybrid.cpp | 201 - modules/gapi/samples/infer_single_roi.cpp | 202 - modules/gapi/samples/infer_ssd_onnx.cpp | 159 - modules/gapi/samples/oak_basic_infer.cpp | 122 - modules/gapi/samples/oak_copy.cpp | 48 - .../gapi/samples/oak_rgb_camera_encoding.cpp | 60 - .../samples/oak_small_hetero_pipeline.cpp | 58 - ...l_infer_with_advanced_device_selection.cpp | 704 ---- .../samples/onevpl_source_to_bgr_conv.cpp | 106 - .../gapi/samples/pipeline_modeling_tool.cpp | 541 --- .../pipeline_modeling_tool/dummy_source.hpp | 112 - .../pipeline_modeling_tool/pipeline.hpp | 250 -- .../pipeline_builder.hpp | 692 ---- .../test_pipeline_modeling_tool.py | 1003 ----- .../samples/pipeline_modeling_tool/utils.hpp | 144 - .../gapi/samples/privacy_masking_camera.cpp | 167 - .../gapi/samples/semantic_segmentation.cpp | 284 -- modules/gapi/samples/slides_blur_gapi.cpp | 19 - modules/gapi/samples/slides_sobel_cv.cpp | 27 - modules/gapi/samples/slides_sobel_gapi.cpp | 28 - modules/gapi/samples/text_detection.cpp | 698 ---- .../gapi/scripts/measure_privacy_masking.py | 99 - modules/gapi/src/3rdparty/vasot/LICENSE.txt | 21 - .../src/3rdparty/vasot/include/vas/common.hpp | 83 - .../src/3rdparty/vasot/include/vas/ot.hpp | 440 --- .../3rdparty/vasot/src/common/exception.hpp | 24 - .../src/3rdparty/vasot/src/common/prof.hpp | 144 - .../kalman_filter/kalman_filter_no_opencv.cpp | 292 -- .../kalman_filter/kalman_filter_no_opencv.hpp | 91 - .../src/components/ot/mtt/hungarian_wrap.cpp | 325 -- .../src/components/ot/mtt/hungarian_wrap.hpp | 71 - .../components/ot/mtt/objects_associator.cpp | 183 - .../components/ot/mtt/objects_associator.hpp | 41 - .../src/components/ot/mtt/rgb_histogram.cpp | 126 - .../src/components/ot/mtt/rgb_histogram.hpp | 42 - .../src/components/ot/object_tracker.cpp | 363 -- .../vasot/src/components/ot/prof_def.hpp | 30 - .../ot/short_term_imageless_tracker.cpp | 256 -- .../ot/short_term_imageless_tracker.hpp | 39 - .../vasot/src/components/ot/tracker.cpp | 132 - .../vasot/src/components/ot/tracker.hpp | 123 - .../vasot/src/components/ot/tracklet.cpp | 147 - .../vasot/src/components/ot/tracklet.hpp | 94 - .../ot/zero_term_imageless_tracker.cpp | 185 - .../ot/zero_term_imageless_tracker.hpp | 37 - modules/gapi/src/api/README.md | 1 - modules/gapi/src/api/garray.cpp | 55 - modules/gapi/src/api/gbackend.cpp | 421 --- modules/gapi/src/api/gbackend_priv.hpp | 98 - modules/gapi/src/api/gcall.cpp | 95 - modules/gapi/src/api/gcall_priv.hpp | 56 - modules/gapi/src/api/gcommon.cpp | 18 - modules/gapi/src/api/gcomputation.cpp | 356 -- modules/gapi/src/api/gcomputation_priv.hpp | 54 - modules/gapi/src/api/gframe.cpp | 54 - modules/gapi/src/api/ginfer.cpp | 26 - modules/gapi/src/api/gkernel.cpp | 121 - modules/gapi/src/api/gmat.cpp | 194 - modules/gapi/src/api/gnode.cpp | 89 - modules/gapi/src/api/gnode.hpp | 58 - modules/gapi/src/api/gnode_priv.hpp | 52 - modules/gapi/src/api/gopaque.cpp | 50 - modules/gapi/src/api/gorigin.cpp | 48 - modules/gapi/src/api/gorigin.hpp | 58 - modules/gapi/src/api/gproto.cpp | 347 -- modules/gapi/src/api/gproto_priv.hpp | 44 - modules/gapi/src/api/grunarg.cpp | 78 - modules/gapi/src/api/gscalar.cpp | 62 - modules/gapi/src/api/kernels_core.cpp | 432 --- modules/gapi/src/api/kernels_imgproc.cpp | 341 -- modules/gapi/src/api/kernels_nnparsers.cpp | 44 - modules/gapi/src/api/kernels_ot.cpp | 43 - modules/gapi/src/api/kernels_stereo.cpp | 18 - modules/gapi/src/api/kernels_streaming.cpp | 93 - modules/gapi/src/api/kernels_video.cpp | 119 - modules/gapi/src/api/media.cpp | 61 - modules/gapi/src/api/ocv_mask_creator.hpp | 0 modules/gapi/src/api/operators.cpp | 216 -- modules/gapi/src/api/render.cpp | 91 - modules/gapi/src/api/render_ocv.cpp | 263 -- modules/gapi/src/api/render_ocv.hpp | 26 - modules/gapi/src/api/render_priv.hpp | 31 - modules/gapi/src/api/rmat.cpp | 75 - modules/gapi/src/api/s11n.cpp | 145 - modules/gapi/src/backends/README.md | 2 - modules/gapi/src/backends/common/gbackend.hpp | 240 -- .../src/backends/common/gcompoundbackend.cpp | 20 - .../src/backends/common/gcompoundkernel.cpp | 51 - .../gapi/src/backends/common/gmetabackend.cpp | 118 - .../gapi/src/backends/common/gmetabackend.hpp | 16 - .../src/backends/common/serialization.cpp | 979 ----- .../src/backends/common/serialization.hpp | 240 -- modules/gapi/src/backends/cpu/gcpubackend.cpp | 322 -- modules/gapi/src/backends/cpu/gcpubackend.hpp | 83 - modules/gapi/src/backends/cpu/gcpucore.cpp | 780 ---- modules/gapi/src/backends/cpu/gcpuimgproc.cpp | 703 ---- modules/gapi/src/backends/cpu/gcpukernel.cpp | 56 - modules/gapi/src/backends/cpu/gcpuot.cpp | 163 - modules/gapi/src/backends/cpu/gcpustereo.cpp | 85 - modules/gapi/src/backends/cpu/gcpuvideo.cpp | 197 - modules/gapi/src/backends/cpu/gnnparsers.cpp | 333 -- modules/gapi/src/backends/cpu/gnnparsers.hpp | 31 - .../gapi/src/backends/fluid/gfluidbackend.cpp | 1641 --------- .../gapi/src/backends/fluid/gfluidbackend.hpp | 189 - .../gapi/src/backends/fluid/gfluidbuffer.cpp | 752 ---- .../src/backends/fluid/gfluidbuffer_priv.hpp | 298 -- .../gapi/src/backends/fluid/gfluidcore.cpp | 2657 -------------- .../fluid/gfluidcore_func.dispatch.cpp | 407 --- .../src/backends/fluid/gfluidcore_func.hpp | 322 -- .../backends/fluid/gfluidcore_func.simd.hpp | 3165 ---------------- .../backends/fluid/gfluidcore_simd_sse41.hpp | 561 --- .../gapi/src/backends/fluid/gfluidimgproc.cpp | 2289 ------------ .../fluid/gfluidimgproc_func.dispatch.cpp | 216 -- .../src/backends/fluid/gfluidimgproc_func.hpp | 162 - .../fluid/gfluidimgproc_func.simd.hpp | 2913 --------------- .../fluid/gfluidimgproc_simd_avx2.hpp | 181 - .../gapi/src/backends/fluid/gfluidutils.hpp | 110 - modules/gapi/src/backends/ie/bindings_ie.cpp | 57 - modules/gapi/src/backends/ie/giebackend.cpp | 2340 ------------ modules/gapi/src/backends/ie/giebackend.hpp | 81 - .../src/backends/ie/giebackend/giewrapper.cpp | 156 - .../src/backends/ie/giebackend/giewrapper.hpp | 78 - modules/gapi/src/backends/ie/util.hpp | 37 - modules/gapi/src/backends/oak/goak.cpp | 58 - .../src/backends/oak/goak_memory_adapters.cpp | 54 - modules/gapi/src/backends/oak/goakbackend.cpp | 1132 ------ .../src/backends/oak/oak_memory_adapters.hpp | 57 - modules/gapi/src/backends/ocl/goclbackend.cpp | 292 -- modules/gapi/src/backends/ocl/goclbackend.hpp | 71 - modules/gapi/src/backends/ocl/goclcore.cpp | 687 ---- modules/gapi/src/backends/ocl/goclcore.hpp | 24 - modules/gapi/src/backends/ocl/goclimgproc.cpp | 305 -- modules/gapi/src/backends/ocl/goclimgproc.hpp | 23 - modules/gapi/src/backends/ocl/goclkernel.cpp | 55 - .../gapi/src/backends/onnx/bindings_onnx.cpp | 85 - modules/gapi/src/backends/onnx/coreml_ep.cpp | 50 - modules/gapi/src/backends/onnx/coreml_ep.hpp | 23 - modules/gapi/src/backends/onnx/dml_ep.cpp | 277 -- modules/gapi/src/backends/onnx/dml_ep.hpp | 23 - .../gapi/src/backends/onnx/gonnxbackend.cpp | 1372 ------- .../gapi/src/backends/onnx/gonnxbackend.hpp | 56 - modules/gapi/src/backends/ov/bindings_ov.cpp | 168 - modules/gapi/src/backends/ov/govbackend.cpp | 1653 --------- modules/gapi/src/backends/ov/govbackend.hpp | 76 - modules/gapi/src/backends/ov/util.hpp | 41 - .../src/backends/plaidml/gplaidmlbackend.cpp | 294 -- .../src/backends/plaidml/gplaidmlbackend.hpp | 100 - .../src/backends/plaidml/gplaidmlcore.cpp | 64 - .../src/backends/plaidml/plaidml_util.hpp | 42 - .../src/backends/python/gpythonbackend.cpp | 283 -- .../gapi/src/backends/render/ft_render.cpp | 236 -- .../gapi/src/backends/render/ft_render.hpp | 44 - .../src/backends/render/ft_render_priv.hpp | 48 - .../gapi/src/backends/render/grenderocv.cpp | 200 - .../backends/streaming/gstreamingbackend.cpp | 472 --- .../backends/streaming/gstreamingbackend.hpp | 38 - .../backends/streaming/gstreamingkernel.hpp | 39 - modules/gapi/src/compiler/README.md | 1 - modules/gapi/src/compiler/gcompiled.cpp | 175 - modules/gapi/src/compiler/gcompiled_priv.hpp | 62 - modules/gapi/src/compiler/gcompiler.cpp | 569 --- modules/gapi/src/compiler/gcompiler.hpp | 67 - modules/gapi/src/compiler/gislandmodel.cpp | 451 --- modules/gapi/src/compiler/gislandmodel.hpp | 310 -- modules/gapi/src/compiler/gmodel.cpp | 289 -- modules/gapi/src/compiler/gmodel.hpp | 368 -- modules/gapi/src/compiler/gmodel_priv.hpp | 59 - modules/gapi/src/compiler/gmodelbuilder.cpp | 323 -- modules/gapi/src/compiler/gmodelbuilder.hpp | 78 - modules/gapi/src/compiler/gobjref.hpp | 59 - modules/gapi/src/compiler/gstreaming.cpp | 174 - modules/gapi/src/compiler/gstreaming_priv.hpp | 64 - modules/gapi/src/compiler/passes/dump_dot.cpp | 246 -- modules/gapi/src/compiler/passes/exec.cpp | 731 ---- modules/gapi/src/compiler/passes/helpers.cpp | 122 - modules/gapi/src/compiler/passes/helpers.hpp | 31 - modules/gapi/src/compiler/passes/intrin.cpp | 305 -- modules/gapi/src/compiler/passes/islands.cpp | 233 -- modules/gapi/src/compiler/passes/kernels.cpp | 259 -- modules/gapi/src/compiler/passes/meta.cpp | 135 - modules/gapi/src/compiler/passes/passes.hpp | 80 - .../src/compiler/passes/pattern_matching.cpp | 580 --- .../src/compiler/passes/pattern_matching.hpp | 102 - .../compiler/passes/perform_substitution.cpp | 94 - .../gapi/src/compiler/passes/streaming.cpp | 84 - .../src/compiler/passes/transformations.cpp | 140 - modules/gapi/src/compiler/transactions.hpp | 200 - modules/gapi/src/executor/conc_queue.hpp | 128 - .../gapi/src/executor/gabstractexecutor.cpp | 25 - .../gapi/src/executor/gabstractexecutor.hpp | 80 - .../executor/gabstractstreamingexecutor.cpp | 23 - .../executor/gabstractstreamingexecutor.hpp | 49 - modules/gapi/src/executor/gasync.cpp | 280 -- modules/gapi/src/executor/gexecutor.cpp | 463 --- modules/gapi/src/executor/gexecutor.hpp | 59 - .../gapi/src/executor/gstreamingexecutor.cpp | 1948 ---------- .../gapi/src/executor/gstreamingexecutor.hpp | 209 -- modules/gapi/src/executor/gtbbexecutor.cpp | 437 --- modules/gapi/src/executor/gtbbexecutor.hpp | 111 - .../gapi/src/executor/gthreadedexecutor.cpp | 515 --- .../gapi/src/executor/gthreadedexecutor.hpp | 123 - modules/gapi/src/executor/last_value.hpp | 105 - modules/gapi/src/executor/thread_pool.cpp | 67 - modules/gapi/src/executor/thread_pool.hpp | 71 - modules/gapi/src/logger.hpp | 26 - modules/gapi/src/precomp.hpp | 25 - .../gstreamer/gstreamer_buffer_utils.cpp | 27 - .../gstreamer/gstreamer_buffer_utils.hpp | 27 - .../gstreamer/gstreamer_media_adapter.cpp | 181 - .../gstreamer/gstreamer_media_adapter.hpp | 63 - .../gstreamer/gstreamer_pipeline_facade.cpp | 314 -- .../gstreamer/gstreamer_pipeline_facade.hpp | 89 - .../src/streaming/gstreamer/gstreamerenv.cpp | 90 - .../src/streaming/gstreamer/gstreamerenv.hpp | 37 - .../streaming/gstreamer/gstreamerpipeline.cpp | 112 - .../gstreamer/gstreamerpipeline_priv.hpp | 58 - .../src/streaming/gstreamer/gstreamerptr.hpp | 177 - .../streaming/gstreamer/gstreamersource.cpp | 414 --- .../gstreamer/gstreamersource_priv.hpp | 95 - .../onevpl/accelerators/accel_policy_cpu.cpp | 298 -- .../onevpl/accelerators/accel_policy_cpu.hpp | 52 - .../onevpl/accelerators/accel_policy_dx11.cpp | 490 --- .../onevpl/accelerators/accel_policy_dx11.hpp | 90 - .../accelerators/accel_policy_interface.hpp | 77 - .../accelerators/accel_policy_va_api.cpp | 138 - .../accelerators/accel_policy_va_api.hpp | 61 - .../accelerators/dx11_alloc_resource.cpp | 420 --- .../accelerators/dx11_alloc_resource.hpp | 150 - .../surface/base_frame_adapter.cpp | 77 - .../surface/base_frame_adapter.hpp | 47 - .../surface/cpu_frame_adapter.cpp | 81 - .../surface/cpu_frame_adapter.hpp | 40 - .../surface/dx11_frame_adapter.cpp | 216 -- .../surface/dx11_frame_adapter.hpp | 62 - .../onevpl/accelerators/surface/surface.cpp | 81 - .../onevpl/accelerators/surface/surface.hpp | 100 - .../accelerators/surface/surface_pool.cpp | 86 - .../accelerators/surface/surface_pool.hpp | 48 - .../accelerators/utils/elastic_barrier.hpp | 296 -- .../onevpl/accelerators/utils/shared_lock.cpp | 95 - .../onevpl/accelerators/utils/shared_lock.hpp | 47 - .../onevpl/cfg_param_device_selector.cpp | 475 --- .../onevpl/cfg_param_device_selector.hpp | 51 - .../gapi/src/streaming/onevpl/cfg_params.cpp | 260 -- .../streaming/onevpl/cfg_params_parser.cpp | 226 -- .../streaming/onevpl/cfg_params_parser.hpp | 47 - .../onevpl/data_provider_defines.hpp | 31 - .../onevpl/data_provider_dispatcher.cpp | 69 - .../onevpl/data_provider_dispatcher.hpp | 29 - .../data_provider_interface_exception.cpp | 48 - modules/gapi/src/streaming/onevpl/default.cpp | 51 - .../demux/async_mfp_demux_data_provider.cpp | 813 ---- .../demux/async_mfp_demux_data_provider.hpp | 126 - .../onevpl/device_selector_interface.cpp | 137 - .../engine/decode/decode_engine_legacy.cpp | 400 -- .../engine/decode/decode_engine_legacy.hpp | 57 - .../onevpl/engine/decode/decode_session.cpp | 75 - .../onevpl/engine/decode/decode_session.hpp | 62 - .../onevpl/engine/engine_session.cpp | 60 - .../onevpl/engine/engine_session.hpp | 64 - .../engine/preproc/preproc_dispatcher.cpp | 105 - .../engine/preproc/preproc_dispatcher.hpp | 48 - .../onevpl/engine/preproc/preproc_engine.cpp | 473 --- .../onevpl/engine/preproc/preproc_engine.hpp | 68 - .../onevpl/engine/preproc/preproc_session.cpp | 85 - .../onevpl/engine/preproc/preproc_session.hpp | 73 - .../streaming/onevpl/engine/preproc/utils.cpp | 86 - .../streaming/onevpl/engine/preproc/utils.hpp | 32 - .../engine/preproc/vpp_preproc_defines.hpp | 39 - .../onevpl/engine/preproc_defines.hpp | 88 - .../engine/preproc_engine_interface.cpp | 110 - .../engine/preproc_engine_interface.hpp | 46 - .../onevpl/engine/processing_engine_base.cpp | 110 - .../onevpl/engine/processing_engine_base.hpp | 107 - .../transcode/transcode_engine_legacy.cpp | 469 --- .../transcode/transcode_engine_legacy.hpp | 45 - .../engine/transcode/transcode_session.cpp | 55 - .../engine/transcode/transcode_session.hpp | 43 - .../streaming/onevpl/file_data_provider.cpp | 152 - .../streaming/onevpl/file_data_provider.hpp | 55 - .../src/streaming/onevpl/onevpl_export.hpp | 30 - modules/gapi/src/streaming/onevpl/source.cpp | 126 - .../gapi/src/streaming/onevpl/source_priv.cpp | 375 -- .../gapi/src/streaming/onevpl/source_priv.hpp | 83 - modules/gapi/src/streaming/onevpl/utils.cpp | 433 --- modules/gapi/src/streaming/onevpl/utils.hpp | 91 - modules/gapi/src/streaming/queue_source.cpp | 98 - modules/gapi/src/utils/itt.cpp | 17 - modules/gapi/src/utils/itt.hpp | 78 - .../test/common/gapi_compoundkernel_tests.cpp | 592 --- modules/gapi/test/common/gapi_core_tests.cpp | 9 - modules/gapi/test/common/gapi_core_tests.hpp | 165 - .../test/common/gapi_core_tests_common.hpp | 180 - .../gapi/test/common/gapi_core_tests_inl.hpp | 1774 --------- .../gapi/test/common/gapi_imgproc_tests.cpp | 9 - .../gapi/test/common/gapi_imgproc_tests.hpp | 130 - .../test/common/gapi_imgproc_tests_common.hpp | 197 - .../test/common/gapi_imgproc_tests_inl.hpp | 1145 ------ .../gapi/test/common/gapi_operators_tests.cpp | 9 - .../gapi/test/common/gapi_operators_tests.hpp | 245 -- .../test/common/gapi_operators_tests_inl.hpp | 167 - .../test/common/gapi_parsers_tests_common.hpp | 411 --- .../gapi/test/common/gapi_render_tests.cpp | 97 - .../gapi/test/common/gapi_render_tests.hpp | 147 - .../gapi/test/common/gapi_stereo_tests.cpp | 8 - .../gapi/test/common/gapi_stereo_tests.hpp | 26 - .../test/common/gapi_stereo_tests_inl.hpp | 74 - .../common/gapi_streaming_tests_common.hpp | 86 - .../gapi/test/common/gapi_tests_common.hpp | 1185 ------ .../gapi/test/common/gapi_tests_helpers.hpp | 102 - modules/gapi/test/common/gapi_video_tests.cpp | 9 - modules/gapi/test/common/gapi_video_tests.hpp | 44 - .../test/common/gapi_video_tests_common.hpp | 491 --- .../gapi/test/common/gapi_video_tests_inl.hpp | 321 -- modules/gapi/test/cpu/gapi_core_tests_cpu.cpp | 510 --- .../gapi/test/cpu/gapi_core_tests_fluid.cpp | 318 -- .../gapi/test/cpu/gapi_imgproc_tests_cpu.cpp | 563 --- .../test/cpu/gapi_imgproc_tests_fluid.cpp | 221 -- .../gapi_ocv_stateful_kernel_test_utils.hpp | 50 - .../cpu/gapi_ocv_stateful_kernel_tests.cpp | 686 ---- .../test/cpu/gapi_operators_tests_cpu.cpp | 64 - .../test/cpu/gapi_operators_tests_fluid.cpp | 70 - modules/gapi/test/cpu/gapi_ot_tests_cpu.cpp | 287 -- .../gapi/test/cpu/gapi_stereo_tests_cpu.cpp | 39 - .../gapi/test/cpu/gapi_video_tests_cpu.cpp | 138 - .../executor/gtbbexecutor_internal_tests.cpp | 178 - modules/gapi/test/gapi_array_tests.cpp | 328 -- modules/gapi/test/gapi_async_test.cpp | 525 --- modules/gapi/test/gapi_basic_hetero_tests.cpp | 312 -- modules/gapi/test/gapi_compile_args_tests.cpp | 75 - modules/gapi/test/gapi_desc_tests.cpp | 404 -- .../test/gapi_fluid_parallel_rois_test.cpp | 315 -- modules/gapi/test/gapi_fluid_resize_test.cpp | 871 ----- modules/gapi/test/gapi_fluid_roi_test.cpp | 197 - modules/gapi/test/gapi_fluid_test.cpp | 913 ----- modules/gapi/test/gapi_fluid_test_kernels.cpp | 627 ---- modules/gapi/test/gapi_fluid_test_kernels.hpp | 138 - modules/gapi/test/gapi_frame_tests.cpp | 264 -- modules/gapi/test/gapi_gcompiled_tests.cpp | 232 -- modules/gapi/test/gapi_gcomputation_tests.cpp | 196 - modules/gapi/test/gapi_gpu_test.cpp | 207 -- modules/gapi/test/gapi_graph_meta_tests.cpp | 187 - modules/gapi/test/gapi_kernel_tests.cpp | 549 --- modules/gapi/test/gapi_mat_tests.cpp | 114 - modules/gapi/test/gapi_mock_kernels.hpp | 123 - modules/gapi/test/gapi_opaque_tests.cpp | 328 -- modules/gapi/test/gapi_plaidml_pipelines.cpp | 185 - modules/gapi/test/gapi_planar_test.cpp | 205 -- modules/gapi/test/gapi_sample_pipelines.cpp | 575 --- modules/gapi/test/gapi_scalar_tests.cpp | 117 - modules/gapi/test/gapi_smoke_test.cpp | 97 - modules/gapi/test/gapi_transform_tests.cpp | 350 -- modules/gapi/test/gapi_typed_tests.cpp | 268 -- modules/gapi/test/gapi_util_tests.cpp | 75 - modules/gapi/test/gpu/gapi_core_tests_gpu.cpp | 348 -- .../gapi/test/gpu/gapi_imgproc_tests_gpu.cpp | 264 -- .../test/gpu/gapi_operators_tests_gpu.cpp | 62 - .../gapi/test/infer/gapi_infer_ie_test.cpp | 3256 ----------------- .../gapi/test/infer/gapi_infer_onnx_test.cpp | 1126 ------ .../gapi/test/infer/gapi_infer_ov_tests.cpp | 1007 ----- modules/gapi/test/infer/gapi_infer_tests.cpp | 79 - .../test/internal/gapi_int_backend_tests.cpp | 86 - .../test/internal/gapi_int_dynamic_graph.cpp | 331 -- .../test/internal/gapi_int_executor_tests.cpp | 324 -- .../gapi/test/internal/gapi_int_garg_test.cpp | 118 - .../test/internal/gapi_int_gmetaarg_test.cpp | 193 - .../internal/gapi_int_gmodel_builder_test.cpp | 380 -- .../internal/gapi_int_island_fusion_tests.cpp | 588 --- .../test/internal/gapi_int_island_tests.cpp | 654 ---- .../gapi_int_pattern_matching_test.cpp | 997 ----- .../gapi_int_perform_substitution_test.cpp | 649 ---- .../test/internal/gapi_int_proto_tests.cpp | 34 - .../internal/gapi_int_recompilation_test.cpp | 236 -- .../test/internal/gapi_int_vectorref_test.cpp | 207 -- .../test/internal/gapi_transactions_test.cpp | 369 -- modules/gapi/test/oak/gapi_tests_oak.cpp | 26 - .../gapi/test/opencl_kernels_test_gapi.hpp | 260 -- modules/gapi/test/own/conc_queue_tests.cpp | 197 - modules/gapi/test/own/gapi_types_tests.cpp | 175 - .../test/own/last_written_value_tests.cpp | 156 - modules/gapi/test/own/mat_tests.cpp | 641 ---- modules/gapi/test/own/scalar_tests.cpp | 44 - modules/gapi/test/own/thread_pool_tests.cpp | 124 - modules/gapi/test/render/ftp_render_test.cpp | 73 - .../test/render/gapi_render_tests_ocv.cpp | 874 ----- .../gapi/test/rmat/rmat_integration_tests.cpp | 170 - modules/gapi/test/rmat/rmat_test_common.hpp | 69 - modules/gapi/test/rmat/rmat_tests.cpp | 126 - modules/gapi/test/rmat/rmat_view_tests.cpp | 284 -- modules/gapi/test/s11n/gapi_s11n_tests.cpp | 949 ----- .../test/s11n/gapi_sample_pipelines_s11n.cpp | 838 ----- ...pi_gstreamer_pipeline_facade_int_tests.cpp | 188 - .../streaming/gapi_gstreamersource_tests.cpp | 563 --- .../gapi_streaming_queue_source_tests.cpp | 127 - .../streaming/gapi_streaming_sync_tests.cpp | 220 -- .../test/streaming/gapi_streaming_tests.cpp | 2686 -------------- .../streaming/gapi_streaming_utils_test.cpp | 349 -- .../gapi_streaming_vpl_core_test.cpp | 1279 ------- .../gapi_streaming_vpl_data_provider.cpp | 304 -- .../gapi_streaming_vpl_device_selector.cpp | 359 -- .../gapi_streaming_vpp_preproc_test.cpp | 736 ---- modules/gapi/test/test_main.cpp | 12 - modules/gapi/test/test_precomp.hpp | 43 - modules/gapi/test/util/any_tests.cpp | 142 - modules/gapi/test/util/optional_tests.cpp | 175 - modules/gapi/test/util/variant_tests.cpp | 739 ---- .../predefined_types.py | 58 - samples/cpp/CMakeLists.txt | 1 - .../age_gender_emotion_recognition.cpp | 410 --- .../gapi/doc_snippets/api_ref_snippets.cpp | 253 -- .../doc_snippets/dynamic_graph_snippets.cpp | 68 - .../gapi/doc_snippets/kernel_api_snippets.cpp | 157 - .../face_beautification.cpp | 905 ----- ...ng_anisotropic_image_segmentation_gapi.cpp | 107 - ...sotropic_image_segmentation_gapi_fluid.cpp | 127 - .../security_barrier_camera.cpp | 351 -- 594 files changed, 1 insertion(+), 153147 deletions(-) delete mode 100644 doc/tutorials/gapi/anisotropic_segmentation/pics/massif_export_gapi.png delete mode 100644 doc/tutorials/gapi/anisotropic_segmentation/pics/massif_export_gapi_fluid.png delete mode 100644 doc/tutorials/gapi/anisotropic_segmentation/pics/massif_export_ocv.png delete mode 100644 doc/tutorials/gapi/anisotropic_segmentation/pics/result.jpg delete mode 100644 doc/tutorials/gapi/anisotropic_segmentation/pics/segm.gif delete mode 100644 doc/tutorials/gapi/anisotropic_segmentation/pics/segm_fluid.gif delete mode 100644 doc/tutorials/gapi/anisotropic_segmentation/porting_anisotropic_segmentation.markdown delete mode 100644 doc/tutorials/gapi/face_beautification/face_beautification.markdown delete mode 100644 doc/tutorials/gapi/face_beautification/pics/example.jpg delete mode 100644 doc/tutorials/gapi/interactive_face_detection/interactive_face_detection.markdown delete mode 100644 doc/tutorials/gapi/oak_devices/oak_devices.markdown delete mode 100644 doc/tutorials/gapi/oak_devices/pics/oak.jpg delete mode 100644 doc/tutorials/gapi/table_of_content_gapi.markdown delete mode 100644 modules/gapi/CMakeLists.txt delete mode 100644 modules/gapi/cmake/DownloadADE.cmake delete mode 100644 modules/gapi/cmake/init.cmake delete mode 100644 modules/gapi/cmake/standalone.cmake delete mode 100644 modules/gapi/doc/00-root.markdown delete mode 100644 modules/gapi/doc/01-background.markdown delete mode 100644 modules/gapi/doc/10-hld-overview.md delete mode 100644 modules/gapi/doc/20-kernel-api.markdown delete mode 100644 modules/gapi/doc/30-implementation.markdown delete mode 100644 modules/gapi/doc/pics/demo.jpg delete mode 100644 modules/gapi/doc/pics/gapi_scheme.png delete mode 100644 modules/gapi/doc/pics/render_example.png delete mode 100644 modules/gapi/doc/slides/.gitignore delete mode 100644 modules/gapi/doc/slides/README.md delete mode 100644 modules/gapi/doc/slides/gapi_overview.org delete mode 100755 modules/gapi/doc/slides/get_sty.sh delete mode 100644 modules/gapi/doc/slides/ocv_logo.eps delete mode 100644 modules/gapi/include/opencv2/gapi.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/core.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/cpu/core.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/cpu/gcpukernel.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/cpu/imgproc.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/cpu/ot.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/cpu/stereo.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/cpu/video.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/fluid/core.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/fluid/gfluidbuffer.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/fluid/gfluidkernel.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/fluid/imgproc.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/garg.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/garray.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gasync_context.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gcall.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gcommon.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gcompiled.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gcompiled_async.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gcompoundkernel.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gcomputation.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gcomputation_async.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gframe.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gkernel.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gmat.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gmetaarg.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gopaque.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gproto.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gpu/core.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gpu/ggpukernel.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gpu/imgproc.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gscalar.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gstreaming.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gtransform.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gtype_traits.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/gtyped.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/imgproc.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/infer.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/infer/bindings_ie.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/infer/bindings_onnx.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/infer/bindings_ov.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/infer/ie.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/infer/onnx.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/infer/ov.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/infer/parsers.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/media.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/oak/infer.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/oak/oak.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/ocl/core.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/ocl/goclkernel.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/ocl/imgproc.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/opencv_includes.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/operators.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/ot.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/own/assert.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/own/convert.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/own/cvdefs.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/own/exports.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/own/mat.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/own/saturate.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/own/scalar.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/own/types.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/plaidml/core.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/plaidml/gplaidmlkernel.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/plaidml/plaidml.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/python/python.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/render.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/render/render.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/render/render_types.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/rmat.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/s11n.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/s11n/base.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/stereo.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/cap.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/desync.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/format.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/gstreamer/gstreamerpipeline.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/gstreamer/gstreamersource.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/meta.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/onevpl/accel_types.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/onevpl/cfg_params.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/onevpl/data_provider_interface.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/onevpl/default.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/onevpl/device_selector_interface.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/onevpl/source.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/queue_source.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/source.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/streaming/sync.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/util/any.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/util/compiler_hints.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/util/copy_through_move.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/util/optional.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/util/throw.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/util/type_traits.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/util/util.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/util/variant.hpp delete mode 100644 modules/gapi/include/opencv2/gapi/video.hpp delete mode 100644 modules/gapi/misc/python/package/gapi/__init__.py delete mode 100644 modules/gapi/misc/python/pyopencv_gapi.hpp delete mode 100644 modules/gapi/misc/python/python_bridge.hpp delete mode 100644 modules/gapi/misc/python/samples/gaze_estimation.py delete mode 100644 modules/gapi/misc/python/shadow_gapi.hpp delete mode 100644 modules/gapi/misc/python/test/test_gapi_core.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_imgproc.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_infer.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_infer_onnx.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_infer_ov.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_kernels.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_ot.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_render.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_sample_pipelines.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_stateful_kernel.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_streaming.py delete mode 100644 modules/gapi/misc/python/test/test_gapi_types.py delete mode 100644 modules/gapi/perf/common/gapi_core_perf_tests.cpp delete mode 100644 modules/gapi/perf/common/gapi_core_perf_tests.hpp delete mode 100644 modules/gapi/perf/common/gapi_core_perf_tests_inl.hpp delete mode 100644 modules/gapi/perf/common/gapi_imgproc_perf_tests.cpp delete mode 100644 modules/gapi/perf/common/gapi_imgproc_perf_tests.hpp delete mode 100644 modules/gapi/perf/common/gapi_imgproc_perf_tests_inl.hpp delete mode 100644 modules/gapi/perf/common/gapi_render_perf_tests.cpp delete mode 100644 modules/gapi/perf/common/gapi_render_perf_tests.hpp delete mode 100644 modules/gapi/perf/common/gapi_render_perf_tests_inl.hpp delete mode 100644 modules/gapi/perf/common/gapi_video_perf_tests.cpp delete mode 100644 modules/gapi/perf/common/gapi_video_perf_tests.hpp delete mode 100644 modules/gapi/perf/common/gapi_video_perf_tests_inl.hpp delete mode 100644 modules/gapi/perf/cpu/gapi_core_perf_tests_cpu.cpp delete mode 100644 modules/gapi/perf/cpu/gapi_core_perf_tests_fluid.cpp delete mode 100644 modules/gapi/perf/cpu/gapi_imgproc_perf_tests_cpu.cpp delete mode 100644 modules/gapi/perf/cpu/gapi_imgproc_perf_tests_fluid.cpp delete mode 100644 modules/gapi/perf/cpu/gapi_video_perf_tests_cpu.cpp delete mode 100644 modules/gapi/perf/gpu/gapi_core_perf_tests_gpu.cpp delete mode 100644 modules/gapi/perf/gpu/gapi_imgproc_perf_tests_gpu.cpp delete mode 100644 modules/gapi/perf/internal/gapi_compiler_perf_tests.cpp delete mode 100644 modules/gapi/perf/perf_bench.cpp delete mode 100644 modules/gapi/perf/perf_main.cpp delete mode 100644 modules/gapi/perf/perf_precomp.hpp delete mode 100644 modules/gapi/perf/render/gapi_render_perf_tests_ocv.cpp delete mode 100644 modules/gapi/perf/streaming/gapi_streaming_source_perf_tests.cpp delete mode 100644 modules/gapi/samples/api_example.cpp delete mode 100644 modules/gapi/samples/data/config_template.yml delete mode 100644 modules/gapi/samples/draw_example.cpp delete mode 100644 modules/gapi/samples/face_detection_mtcnn.cpp delete mode 100644 modules/gapi/samples/gaze_estimation.cpp delete mode 100644 modules/gapi/samples/infer_ie_onnx_hybrid.cpp delete mode 100644 modules/gapi/samples/infer_single_roi.cpp delete mode 100644 modules/gapi/samples/infer_ssd_onnx.cpp delete mode 100644 modules/gapi/samples/oak_basic_infer.cpp delete mode 100644 modules/gapi/samples/oak_copy.cpp delete mode 100644 modules/gapi/samples/oak_rgb_camera_encoding.cpp delete mode 100644 modules/gapi/samples/oak_small_hetero_pipeline.cpp delete mode 100644 modules/gapi/samples/onevpl_infer_with_advanced_device_selection.cpp delete mode 100644 modules/gapi/samples/onevpl_source_to_bgr_conv.cpp delete mode 100644 modules/gapi/samples/pipeline_modeling_tool.cpp delete mode 100644 modules/gapi/samples/pipeline_modeling_tool/dummy_source.hpp delete mode 100644 modules/gapi/samples/pipeline_modeling_tool/pipeline.hpp delete mode 100644 modules/gapi/samples/pipeline_modeling_tool/pipeline_builder.hpp delete mode 100644 modules/gapi/samples/pipeline_modeling_tool/test_pipeline_modeling_tool.py delete mode 100644 modules/gapi/samples/pipeline_modeling_tool/utils.hpp delete mode 100644 modules/gapi/samples/privacy_masking_camera.cpp delete mode 100644 modules/gapi/samples/semantic_segmentation.cpp delete mode 100644 modules/gapi/samples/slides_blur_gapi.cpp delete mode 100644 modules/gapi/samples/slides_sobel_cv.cpp delete mode 100644 modules/gapi/samples/slides_sobel_gapi.cpp delete mode 100644 modules/gapi/samples/text_detection.cpp delete mode 100755 modules/gapi/scripts/measure_privacy_masking.py delete mode 100644 modules/gapi/src/3rdparty/vasot/LICENSE.txt delete mode 100644 modules/gapi/src/3rdparty/vasot/include/vas/common.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/include/vas/ot.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/common/exception.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/common/prof.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/kalman_filter/kalman_filter_no_opencv.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/kalman_filter/kalman_filter_no_opencv.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/mtt/hungarian_wrap.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/mtt/hungarian_wrap.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/mtt/objects_associator.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/mtt/objects_associator.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/mtt/rgb_histogram.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/mtt/rgb_histogram.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/object_tracker.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/prof_def.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/short_term_imageless_tracker.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/short_term_imageless_tracker.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/tracker.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/tracker.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/tracklet.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/tracklet.hpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/zero_term_imageless_tracker.cpp delete mode 100644 modules/gapi/src/3rdparty/vasot/src/components/ot/zero_term_imageless_tracker.hpp delete mode 100644 modules/gapi/src/api/README.md delete mode 100644 modules/gapi/src/api/garray.cpp delete mode 100644 modules/gapi/src/api/gbackend.cpp delete mode 100644 modules/gapi/src/api/gbackend_priv.hpp delete mode 100644 modules/gapi/src/api/gcall.cpp delete mode 100644 modules/gapi/src/api/gcall_priv.hpp delete mode 100644 modules/gapi/src/api/gcommon.cpp delete mode 100644 modules/gapi/src/api/gcomputation.cpp delete mode 100644 modules/gapi/src/api/gcomputation_priv.hpp delete mode 100644 modules/gapi/src/api/gframe.cpp delete mode 100644 modules/gapi/src/api/ginfer.cpp delete mode 100644 modules/gapi/src/api/gkernel.cpp delete mode 100644 modules/gapi/src/api/gmat.cpp delete mode 100644 modules/gapi/src/api/gnode.cpp delete mode 100644 modules/gapi/src/api/gnode.hpp delete mode 100644 modules/gapi/src/api/gnode_priv.hpp delete mode 100644 modules/gapi/src/api/gopaque.cpp delete mode 100644 modules/gapi/src/api/gorigin.cpp delete mode 100644 modules/gapi/src/api/gorigin.hpp delete mode 100644 modules/gapi/src/api/gproto.cpp delete mode 100644 modules/gapi/src/api/gproto_priv.hpp delete mode 100644 modules/gapi/src/api/grunarg.cpp delete mode 100644 modules/gapi/src/api/gscalar.cpp delete mode 100644 modules/gapi/src/api/kernels_core.cpp delete mode 100644 modules/gapi/src/api/kernels_imgproc.cpp delete mode 100644 modules/gapi/src/api/kernels_nnparsers.cpp delete mode 100644 modules/gapi/src/api/kernels_ot.cpp delete mode 100644 modules/gapi/src/api/kernels_stereo.cpp delete mode 100644 modules/gapi/src/api/kernels_streaming.cpp delete mode 100644 modules/gapi/src/api/kernels_video.cpp delete mode 100644 modules/gapi/src/api/media.cpp delete mode 100644 modules/gapi/src/api/ocv_mask_creator.hpp delete mode 100644 modules/gapi/src/api/operators.cpp delete mode 100644 modules/gapi/src/api/render.cpp delete mode 100644 modules/gapi/src/api/render_ocv.cpp delete mode 100644 modules/gapi/src/api/render_ocv.hpp delete mode 100644 modules/gapi/src/api/render_priv.hpp delete mode 100644 modules/gapi/src/api/rmat.cpp delete mode 100644 modules/gapi/src/api/s11n.cpp delete mode 100644 modules/gapi/src/backends/README.md delete mode 100644 modules/gapi/src/backends/common/gbackend.hpp delete mode 100644 modules/gapi/src/backends/common/gcompoundbackend.cpp delete mode 100644 modules/gapi/src/backends/common/gcompoundkernel.cpp delete mode 100644 modules/gapi/src/backends/common/gmetabackend.cpp delete mode 100644 modules/gapi/src/backends/common/gmetabackend.hpp delete mode 100644 modules/gapi/src/backends/common/serialization.cpp delete mode 100644 modules/gapi/src/backends/common/serialization.hpp delete mode 100644 modules/gapi/src/backends/cpu/gcpubackend.cpp delete mode 100644 modules/gapi/src/backends/cpu/gcpubackend.hpp delete mode 100644 modules/gapi/src/backends/cpu/gcpucore.cpp delete mode 100644 modules/gapi/src/backends/cpu/gcpuimgproc.cpp delete mode 100644 modules/gapi/src/backends/cpu/gcpukernel.cpp delete mode 100644 modules/gapi/src/backends/cpu/gcpuot.cpp delete mode 100644 modules/gapi/src/backends/cpu/gcpustereo.cpp delete mode 100644 modules/gapi/src/backends/cpu/gcpuvideo.cpp delete mode 100644 modules/gapi/src/backends/cpu/gnnparsers.cpp delete mode 100644 modules/gapi/src/backends/cpu/gnnparsers.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidbackend.cpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidbackend.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidbuffer.cpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidbuffer_priv.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidcore.cpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidcore_func.dispatch.cpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidcore_func.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidcore_func.simd.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidcore_simd_sse41.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidimgproc.cpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidimgproc_func.dispatch.cpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidimgproc_func.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidimgproc_func.simd.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidimgproc_simd_avx2.hpp delete mode 100644 modules/gapi/src/backends/fluid/gfluidutils.hpp delete mode 100644 modules/gapi/src/backends/ie/bindings_ie.cpp delete mode 100644 modules/gapi/src/backends/ie/giebackend.cpp delete mode 100644 modules/gapi/src/backends/ie/giebackend.hpp delete mode 100644 modules/gapi/src/backends/ie/giebackend/giewrapper.cpp delete mode 100644 modules/gapi/src/backends/ie/giebackend/giewrapper.hpp delete mode 100644 modules/gapi/src/backends/ie/util.hpp delete mode 100644 modules/gapi/src/backends/oak/goak.cpp delete mode 100644 modules/gapi/src/backends/oak/goak_memory_adapters.cpp delete mode 100644 modules/gapi/src/backends/oak/goakbackend.cpp delete mode 100644 modules/gapi/src/backends/oak/oak_memory_adapters.hpp delete mode 100644 modules/gapi/src/backends/ocl/goclbackend.cpp delete mode 100644 modules/gapi/src/backends/ocl/goclbackend.hpp delete mode 100644 modules/gapi/src/backends/ocl/goclcore.cpp delete mode 100644 modules/gapi/src/backends/ocl/goclcore.hpp delete mode 100644 modules/gapi/src/backends/ocl/goclimgproc.cpp delete mode 100644 modules/gapi/src/backends/ocl/goclimgproc.hpp delete mode 100644 modules/gapi/src/backends/ocl/goclkernel.cpp delete mode 100644 modules/gapi/src/backends/onnx/bindings_onnx.cpp delete mode 100644 modules/gapi/src/backends/onnx/coreml_ep.cpp delete mode 100644 modules/gapi/src/backends/onnx/coreml_ep.hpp delete mode 100644 modules/gapi/src/backends/onnx/dml_ep.cpp delete mode 100644 modules/gapi/src/backends/onnx/dml_ep.hpp delete mode 100644 modules/gapi/src/backends/onnx/gonnxbackend.cpp delete mode 100644 modules/gapi/src/backends/onnx/gonnxbackend.hpp delete mode 100644 modules/gapi/src/backends/ov/bindings_ov.cpp delete mode 100644 modules/gapi/src/backends/ov/govbackend.cpp delete mode 100644 modules/gapi/src/backends/ov/govbackend.hpp delete mode 100644 modules/gapi/src/backends/ov/util.hpp delete mode 100644 modules/gapi/src/backends/plaidml/gplaidmlbackend.cpp delete mode 100644 modules/gapi/src/backends/plaidml/gplaidmlbackend.hpp delete mode 100644 modules/gapi/src/backends/plaidml/gplaidmlcore.cpp delete mode 100644 modules/gapi/src/backends/plaidml/plaidml_util.hpp delete mode 100644 modules/gapi/src/backends/python/gpythonbackend.cpp delete mode 100644 modules/gapi/src/backends/render/ft_render.cpp delete mode 100644 modules/gapi/src/backends/render/ft_render.hpp delete mode 100644 modules/gapi/src/backends/render/ft_render_priv.hpp delete mode 100644 modules/gapi/src/backends/render/grenderocv.cpp delete mode 100644 modules/gapi/src/backends/streaming/gstreamingbackend.cpp delete mode 100644 modules/gapi/src/backends/streaming/gstreamingbackend.hpp delete mode 100644 modules/gapi/src/backends/streaming/gstreamingkernel.hpp delete mode 100644 modules/gapi/src/compiler/README.md delete mode 100644 modules/gapi/src/compiler/gcompiled.cpp delete mode 100644 modules/gapi/src/compiler/gcompiled_priv.hpp delete mode 100644 modules/gapi/src/compiler/gcompiler.cpp delete mode 100644 modules/gapi/src/compiler/gcompiler.hpp delete mode 100644 modules/gapi/src/compiler/gislandmodel.cpp delete mode 100644 modules/gapi/src/compiler/gislandmodel.hpp delete mode 100644 modules/gapi/src/compiler/gmodel.cpp delete mode 100644 modules/gapi/src/compiler/gmodel.hpp delete mode 100644 modules/gapi/src/compiler/gmodel_priv.hpp delete mode 100644 modules/gapi/src/compiler/gmodelbuilder.cpp delete mode 100644 modules/gapi/src/compiler/gmodelbuilder.hpp delete mode 100644 modules/gapi/src/compiler/gobjref.hpp delete mode 100644 modules/gapi/src/compiler/gstreaming.cpp delete mode 100644 modules/gapi/src/compiler/gstreaming_priv.hpp delete mode 100644 modules/gapi/src/compiler/passes/dump_dot.cpp delete mode 100644 modules/gapi/src/compiler/passes/exec.cpp delete mode 100644 modules/gapi/src/compiler/passes/helpers.cpp delete mode 100644 modules/gapi/src/compiler/passes/helpers.hpp delete mode 100644 modules/gapi/src/compiler/passes/intrin.cpp delete mode 100644 modules/gapi/src/compiler/passes/islands.cpp delete mode 100644 modules/gapi/src/compiler/passes/kernels.cpp delete mode 100644 modules/gapi/src/compiler/passes/meta.cpp delete mode 100644 modules/gapi/src/compiler/passes/passes.hpp delete mode 100644 modules/gapi/src/compiler/passes/pattern_matching.cpp delete mode 100644 modules/gapi/src/compiler/passes/pattern_matching.hpp delete mode 100644 modules/gapi/src/compiler/passes/perform_substitution.cpp delete mode 100644 modules/gapi/src/compiler/passes/streaming.cpp delete mode 100644 modules/gapi/src/compiler/passes/transformations.cpp delete mode 100644 modules/gapi/src/compiler/transactions.hpp delete mode 100644 modules/gapi/src/executor/conc_queue.hpp delete mode 100644 modules/gapi/src/executor/gabstractexecutor.cpp delete mode 100644 modules/gapi/src/executor/gabstractexecutor.hpp delete mode 100644 modules/gapi/src/executor/gabstractstreamingexecutor.cpp delete mode 100644 modules/gapi/src/executor/gabstractstreamingexecutor.hpp delete mode 100644 modules/gapi/src/executor/gasync.cpp delete mode 100644 modules/gapi/src/executor/gexecutor.cpp delete mode 100644 modules/gapi/src/executor/gexecutor.hpp delete mode 100644 modules/gapi/src/executor/gstreamingexecutor.cpp delete mode 100644 modules/gapi/src/executor/gstreamingexecutor.hpp delete mode 100644 modules/gapi/src/executor/gtbbexecutor.cpp delete mode 100644 modules/gapi/src/executor/gtbbexecutor.hpp delete mode 100644 modules/gapi/src/executor/gthreadedexecutor.cpp delete mode 100644 modules/gapi/src/executor/gthreadedexecutor.hpp delete mode 100644 modules/gapi/src/executor/last_value.hpp delete mode 100644 modules/gapi/src/executor/thread_pool.cpp delete mode 100644 modules/gapi/src/executor/thread_pool.hpp delete mode 100644 modules/gapi/src/logger.hpp delete mode 100644 modules/gapi/src/precomp.hpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamer_buffer_utils.cpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamer_buffer_utils.hpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamer_media_adapter.cpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamer_media_adapter.hpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamer_pipeline_facade.cpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamer_pipeline_facade.hpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamerenv.cpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamerenv.hpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamerpipeline.cpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamerpipeline_priv.hpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamerptr.hpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamersource.cpp delete mode 100644 modules/gapi/src/streaming/gstreamer/gstreamersource_priv.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/accel_policy_cpu.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/accel_policy_cpu.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/accel_policy_dx11.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/accel_policy_dx11.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/accel_policy_interface.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/accel_policy_va_api.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/accel_policy_va_api.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/dx11_alloc_resource.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/dx11_alloc_resource.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/base_frame_adapter.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/base_frame_adapter.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/cpu_frame_adapter.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/cpu_frame_adapter.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/dx11_frame_adapter.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/dx11_frame_adapter.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/surface.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/surface.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/surface_pool.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/surface/surface_pool.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/utils/elastic_barrier.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/utils/shared_lock.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/accelerators/utils/shared_lock.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/cfg_param_device_selector.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/cfg_param_device_selector.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/cfg_params.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/cfg_params_parser.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/cfg_params_parser.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/data_provider_defines.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/data_provider_dispatcher.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/data_provider_dispatcher.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/data_provider_interface_exception.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/default.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/demux/async_mfp_demux_data_provider.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/demux/async_mfp_demux_data_provider.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/device_selector_interface.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/decode/decode_engine_legacy.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/decode/decode_engine_legacy.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/decode/decode_session.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/decode/decode_session.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/engine_session.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/engine_session.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/preproc_dispatcher.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/preproc_dispatcher.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/preproc_engine.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/preproc_engine.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/preproc_session.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/preproc_session.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/utils.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/utils.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc/vpp_preproc_defines.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc_defines.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc_engine_interface.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/preproc_engine_interface.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/processing_engine_base.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/processing_engine_base.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/transcode/transcode_engine_legacy.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/transcode/transcode_engine_legacy.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/transcode/transcode_session.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/engine/transcode/transcode_session.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/file_data_provider.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/file_data_provider.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/onevpl_export.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/source.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/source_priv.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/source_priv.hpp delete mode 100644 modules/gapi/src/streaming/onevpl/utils.cpp delete mode 100644 modules/gapi/src/streaming/onevpl/utils.hpp delete mode 100644 modules/gapi/src/streaming/queue_source.cpp delete mode 100644 modules/gapi/src/utils/itt.cpp delete mode 100644 modules/gapi/src/utils/itt.hpp delete mode 100644 modules/gapi/test/common/gapi_compoundkernel_tests.cpp delete mode 100644 modules/gapi/test/common/gapi_core_tests.cpp delete mode 100644 modules/gapi/test/common/gapi_core_tests.hpp delete mode 100644 modules/gapi/test/common/gapi_core_tests_common.hpp delete mode 100644 modules/gapi/test/common/gapi_core_tests_inl.hpp delete mode 100644 modules/gapi/test/common/gapi_imgproc_tests.cpp delete mode 100644 modules/gapi/test/common/gapi_imgproc_tests.hpp delete mode 100644 modules/gapi/test/common/gapi_imgproc_tests_common.hpp delete mode 100644 modules/gapi/test/common/gapi_imgproc_tests_inl.hpp delete mode 100644 modules/gapi/test/common/gapi_operators_tests.cpp delete mode 100644 modules/gapi/test/common/gapi_operators_tests.hpp delete mode 100644 modules/gapi/test/common/gapi_operators_tests_inl.hpp delete mode 100644 modules/gapi/test/common/gapi_parsers_tests_common.hpp delete mode 100644 modules/gapi/test/common/gapi_render_tests.cpp delete mode 100644 modules/gapi/test/common/gapi_render_tests.hpp delete mode 100644 modules/gapi/test/common/gapi_stereo_tests.cpp delete mode 100644 modules/gapi/test/common/gapi_stereo_tests.hpp delete mode 100644 modules/gapi/test/common/gapi_stereo_tests_inl.hpp delete mode 100644 modules/gapi/test/common/gapi_streaming_tests_common.hpp delete mode 100644 modules/gapi/test/common/gapi_tests_common.hpp delete mode 100644 modules/gapi/test/common/gapi_tests_helpers.hpp delete mode 100644 modules/gapi/test/common/gapi_video_tests.cpp delete mode 100644 modules/gapi/test/common/gapi_video_tests.hpp delete mode 100644 modules/gapi/test/common/gapi_video_tests_common.hpp delete mode 100644 modules/gapi/test/common/gapi_video_tests_inl.hpp delete mode 100644 modules/gapi/test/cpu/gapi_core_tests_cpu.cpp delete mode 100644 modules/gapi/test/cpu/gapi_core_tests_fluid.cpp delete mode 100644 modules/gapi/test/cpu/gapi_imgproc_tests_cpu.cpp delete mode 100644 modules/gapi/test/cpu/gapi_imgproc_tests_fluid.cpp delete mode 100644 modules/gapi/test/cpu/gapi_ocv_stateful_kernel_test_utils.hpp delete mode 100644 modules/gapi/test/cpu/gapi_ocv_stateful_kernel_tests.cpp delete mode 100644 modules/gapi/test/cpu/gapi_operators_tests_cpu.cpp delete mode 100644 modules/gapi/test/cpu/gapi_operators_tests_fluid.cpp delete mode 100644 modules/gapi/test/cpu/gapi_ot_tests_cpu.cpp delete mode 100644 modules/gapi/test/cpu/gapi_stereo_tests_cpu.cpp delete mode 100644 modules/gapi/test/cpu/gapi_video_tests_cpu.cpp delete mode 100644 modules/gapi/test/executor/gtbbexecutor_internal_tests.cpp delete mode 100644 modules/gapi/test/gapi_array_tests.cpp delete mode 100644 modules/gapi/test/gapi_async_test.cpp delete mode 100644 modules/gapi/test/gapi_basic_hetero_tests.cpp delete mode 100644 modules/gapi/test/gapi_compile_args_tests.cpp delete mode 100644 modules/gapi/test/gapi_desc_tests.cpp delete mode 100644 modules/gapi/test/gapi_fluid_parallel_rois_test.cpp delete mode 100644 modules/gapi/test/gapi_fluid_resize_test.cpp delete mode 100644 modules/gapi/test/gapi_fluid_roi_test.cpp delete mode 100644 modules/gapi/test/gapi_fluid_test.cpp delete mode 100644 modules/gapi/test/gapi_fluid_test_kernels.cpp delete mode 100644 modules/gapi/test/gapi_fluid_test_kernels.hpp delete mode 100644 modules/gapi/test/gapi_frame_tests.cpp delete mode 100644 modules/gapi/test/gapi_gcompiled_tests.cpp delete mode 100644 modules/gapi/test/gapi_gcomputation_tests.cpp delete mode 100644 modules/gapi/test/gapi_gpu_test.cpp delete mode 100644 modules/gapi/test/gapi_graph_meta_tests.cpp delete mode 100644 modules/gapi/test/gapi_kernel_tests.cpp delete mode 100644 modules/gapi/test/gapi_mat_tests.cpp delete mode 100644 modules/gapi/test/gapi_mock_kernels.hpp delete mode 100644 modules/gapi/test/gapi_opaque_tests.cpp delete mode 100644 modules/gapi/test/gapi_plaidml_pipelines.cpp delete mode 100644 modules/gapi/test/gapi_planar_test.cpp delete mode 100644 modules/gapi/test/gapi_sample_pipelines.cpp delete mode 100644 modules/gapi/test/gapi_scalar_tests.cpp delete mode 100644 modules/gapi/test/gapi_smoke_test.cpp delete mode 100644 modules/gapi/test/gapi_transform_tests.cpp delete mode 100644 modules/gapi/test/gapi_typed_tests.cpp delete mode 100644 modules/gapi/test/gapi_util_tests.cpp delete mode 100644 modules/gapi/test/gpu/gapi_core_tests_gpu.cpp delete mode 100644 modules/gapi/test/gpu/gapi_imgproc_tests_gpu.cpp delete mode 100644 modules/gapi/test/gpu/gapi_operators_tests_gpu.cpp delete mode 100644 modules/gapi/test/infer/gapi_infer_ie_test.cpp delete mode 100644 modules/gapi/test/infer/gapi_infer_onnx_test.cpp delete mode 100644 modules/gapi/test/infer/gapi_infer_ov_tests.cpp delete mode 100644 modules/gapi/test/infer/gapi_infer_tests.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_backend_tests.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_dynamic_graph.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_executor_tests.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_garg_test.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_gmetaarg_test.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_gmodel_builder_test.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_island_fusion_tests.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_island_tests.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_pattern_matching_test.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_perform_substitution_test.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_proto_tests.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_recompilation_test.cpp delete mode 100644 modules/gapi/test/internal/gapi_int_vectorref_test.cpp delete mode 100644 modules/gapi/test/internal/gapi_transactions_test.cpp delete mode 100644 modules/gapi/test/oak/gapi_tests_oak.cpp delete mode 100644 modules/gapi/test/opencl_kernels_test_gapi.hpp delete mode 100644 modules/gapi/test/own/conc_queue_tests.cpp delete mode 100644 modules/gapi/test/own/gapi_types_tests.cpp delete mode 100644 modules/gapi/test/own/last_written_value_tests.cpp delete mode 100644 modules/gapi/test/own/mat_tests.cpp delete mode 100644 modules/gapi/test/own/scalar_tests.cpp delete mode 100644 modules/gapi/test/own/thread_pool_tests.cpp delete mode 100644 modules/gapi/test/render/ftp_render_test.cpp delete mode 100644 modules/gapi/test/render/gapi_render_tests_ocv.cpp delete mode 100644 modules/gapi/test/rmat/rmat_integration_tests.cpp delete mode 100644 modules/gapi/test/rmat/rmat_test_common.hpp delete mode 100644 modules/gapi/test/rmat/rmat_tests.cpp delete mode 100644 modules/gapi/test/rmat/rmat_view_tests.cpp delete mode 100644 modules/gapi/test/s11n/gapi_s11n_tests.cpp delete mode 100644 modules/gapi/test/s11n/gapi_sample_pipelines_s11n.cpp delete mode 100644 modules/gapi/test/streaming/gapi_gstreamer_pipeline_facade_int_tests.cpp delete mode 100644 modules/gapi/test/streaming/gapi_gstreamersource_tests.cpp delete mode 100644 modules/gapi/test/streaming/gapi_streaming_queue_source_tests.cpp delete mode 100644 modules/gapi/test/streaming/gapi_streaming_sync_tests.cpp delete mode 100644 modules/gapi/test/streaming/gapi_streaming_tests.cpp delete mode 100644 modules/gapi/test/streaming/gapi_streaming_utils_test.cpp delete mode 100644 modules/gapi/test/streaming/gapi_streaming_vpl_core_test.cpp delete mode 100644 modules/gapi/test/streaming/gapi_streaming_vpl_data_provider.cpp delete mode 100644 modules/gapi/test/streaming/gapi_streaming_vpl_device_selector.cpp delete mode 100644 modules/gapi/test/streaming/gapi_streaming_vpp_preproc_test.cpp delete mode 100644 modules/gapi/test/test_main.cpp delete mode 100644 modules/gapi/test/test_precomp.hpp delete mode 100644 modules/gapi/test/util/any_tests.cpp delete mode 100644 modules/gapi/test/util/optional_tests.cpp delete mode 100644 modules/gapi/test/util/variant_tests.cpp delete mode 100644 samples/cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp delete mode 100644 samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp delete mode 100644 samples/cpp/tutorial_code/gapi/doc_snippets/dynamic_graph_snippets.cpp delete mode 100644 samples/cpp/tutorial_code/gapi/doc_snippets/kernel_api_snippets.cpp delete mode 100644 samples/cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp delete mode 100644 samples/cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi.cpp delete mode 100644 samples/cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi_fluid.cpp delete mode 100644 samples/cpp/tutorial_code/gapi/security_barrier_camera/security_barrier_camera.cpp diff --git a/cmake/OpenCVPackaging.cmake b/cmake/OpenCVPackaging.cmake index 96aaacc5d9..e90aabb893 100644 --- a/cmake/OpenCVPackaging.cmake +++ b/cmake/OpenCVPackaging.cmake @@ -123,7 +123,7 @@ endif() set(STD_OPENCV_LIBS opencv-data) set(STD_OPENCV_DEV libopencv-dev) -foreach(module 3d calib core dnn features flann gapi highgui +foreach(module 3d calib core dnn features flann highgui imgcodecs imgproc ml objdetect photo stereo stitching ts video videoio) if(HAVE_opencv_${module}) diff --git a/cmake/vars/OPENCV_DISABLE_THREAD_SUPPORT.cmake b/cmake/vars/OPENCV_DISABLE_THREAD_SUPPORT.cmake index 8f3a4c0048..7608375d61 100644 --- a/cmake/vars/OPENCV_DISABLE_THREAD_SUPPORT.cmake +++ b/cmake/vars/OPENCV_DISABLE_THREAD_SUPPORT.cmake @@ -21,7 +21,6 @@ ocv_update(BUILD_opencv_java OFF) # <[thread|mutex|condition_variable|future]>` and linkage into # `libpthread` to work. ocv_update(BUILD_opencv_objdetect OFF) -ocv_update(BUILD_opencv_gapi OFF) ocv_update(BUILD_opencv_dnn OFF) set(OPJ_USE_THREAD "OFF" CACHE INTERNAL "") diff --git a/doc/tutorials/gapi/anisotropic_segmentation/pics/massif_export_gapi.png b/doc/tutorials/gapi/anisotropic_segmentation/pics/massif_export_gapi.png deleted file mode 100644 index f378ea870e52d3d0110110b201576ee6a7e1798d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85388 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±ed?=?2HRgApKP;42+O`}W@nuSiY#efT{pe-D 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 ZZ&fA)Fa?|aXGB2L_KM|V_bWhE-B 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 V_o&n25CZ&@l~R(d5;qL`e*pQI;7|Yn diff --git a/doc/tutorials/gapi/anisotropic_segmentation/pics/massif_export_ocv.png b/doc/tutorials/gapi/anisotropic_segmentation/pics/massif_export_ocv.png deleted file mode 100644 index 60b5492da827b851139232dc118553c3004b8928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76635 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 F`d^vHUN-;$ diff --git a/doc/tutorials/gapi/anisotropic_segmentation/pics/result.jpg b/doc/tutorials/gapi/anisotropic_segmentation/pics/result.jpg deleted file mode 100644 index e69cd690aa26f6ffe13047b2ca06691809d00ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35271 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

mT_CDM^I}FSt6+!AF{9ja_rlJ#5C7D1 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 J*%550{)zjsmtvTqnxzbi?iOm`wxcVNS5Y_ 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 Rj?;H{R>}}}W3Y_*Et6_C2aL^go&KLKb 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 V_~D5!-uUB@PhR=unRlZA06SlHy0-uT diff --git a/doc/tutorials/gapi/anisotropic_segmentation/pics/segm_fluid.gif b/doc/tutorials/gapi/anisotropic_segmentation/pics/segm_fluid.gif deleted file mode 100644 index 2180b434d400b0b4fdf6bb16bc97fa5210b08fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225566 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 z

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 NPjMAr@dhsd06X7<89M*~ diff --git a/doc/tutorials/gapi/anisotropic_segmentation/porting_anisotropic_segmentation.markdown b/doc/tutorials/gapi/anisotropic_segmentation/porting_anisotropic_segmentation.markdown deleted file mode 100644 index 64b68e644c..0000000000 --- a/doc/tutorials/gapi/anisotropic_segmentation/porting_anisotropic_segmentation.markdown +++ /dev/null @@ -1,404 +0,0 @@ -# Porting anisotropic image segmentation on G-API {#tutorial_gapi_anisotropic_segmentation} - -@prev_tutorial{tutorial_gapi_interactive_face_detection} -@next_tutorial{tutorial_gapi_face_beautification} - -[TOC] - -# Introduction {#gapi_anisotropic_intro} - -In this tutorial you will learn: -* How an existing algorithm can be transformed into a G-API - computation (graph); -* How to inspect and profile G-API graphs; -* How to customize graph execution without changing its code. - -This tutorial is based on @ref -tutorial_anisotropic_image_segmentation_by_a_gst. - -# Quick start: using OpenCV backend {#gapi_anisotropic_start} - -Before we start, let's review the original algorithm implementation: - -@include cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp - -## Examining calcGST() {#gapi_anisotropic_calcgst} - -The function calcGST() is clearly an image processing pipeline: -* It is just a sequence of operations over a number of cv::Mat; -* No logic (conditionals) and loops involved in the code; -* All functions operate on 2D images (like cv::Sobel, cv::multiply, -cv::boxFilter, cv::sqrt, etc). - -Considering the above, calcGST() is a great candidate to start -with. In the original code, its prototype is defined like this: - -@snippet cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp calcGST_proto - -With G-API, we can define it as follows: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi.cpp calcGST_proto - -It is important to understand that the new G-API based version of -calcGST() will just produce a compute graph, in contrast to its -original version, which actually calculates the values. This is a -principal difference -- G-API based functions like this are used to -construct graphs, not to process the actual data. - -Let's start implementing calcGST() with calculation of \f$J\f$ -matrix. This is how the original code looks like: - -@snippet cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp calcJ_header - -Here we need to declare output objects for every new operation (see -img as a result for cv::Mat::convertTo, imgDiffX and others as results for -cv::Sobel and cv::multiply). - -The G-API analogue is listed below: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi.cpp calcGST_header - -This snippet demonstrates the following syntactic difference between -G-API and traditional OpenCV: -* All standard G-API functions are by default placed in "cv::gapi" -namespace; -* G-API operations _return_ its results -- there's no need to pass -extra "output" parameters to the functions. - -Note -- this code is also using `auto` -- types of intermediate objects -like `img`, `imgDiffX`, and so on are inferred automatically by the -C++ compiler. In this example, the types are determined by G-API -operation return values which all are cv::GMat. - -G-API standard kernels are trying to follow OpenCV API conventions -whenever possible -- so cv::gapi::sobel takes the same arguments as -cv::Sobel, cv::gapi::mul follows cv::multiply, and so on (except -having a return value). - -The rest of calcGST() function can be implemented the same -way trivially. Below is its full source code: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi.cpp calcGST - -## Running G-API graph {#gapi_anisotropic_running} - -After calcGST() is defined in G-API language, we can construct a graph -based on it and finally run it -- pass input image and obtain -result. Before we do it, let's have a look how original code looked -like: - -@snippet cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp main_extra - -G-API-based functions like calcGST() can't be applied to input data -directly, since it is a _construction_ code, not the _processing_ code. -In order to _run_ computations, a special object of class -cv::GComputation needs to be created. This object wraps our G-API code -(which is a composition of G-API data and operations) into a callable -object, similar to C++11 -[std::function<>](https://en.cppreference.com/w/cpp/utility/functional/function). - -cv::GComputation class has a number of constructors which can be used -to define a graph. Generally, user needs to pass graph boundaries --- _input_ and _output_ objects, on which a GComputation is -defined. Then G-API analyzes the call flow from _outputs_ to _inputs_ -and reconstructs the graph with operations in-between the specified -boundaries. This may sound complex, however in fact the code looks -like this: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi.cpp main - -Note that this code slightly changes from the original one: forming up -the resulting image is also a part of the pipeline (done with -cv::gapi::addWeighted). - -Result of this G-API pipeline bit-exact matches the original one -(given the same input image): - -![Segmentation result with G-API](pics/result.jpg) - -## G-API initial version: full listing {#gapi_anisotropic_ocv} - -Below is the full listing of the initial anisotropic image -segmentation port on G-API: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi.cpp full_sample - -# Inspecting the initial version {#gapi_anisotropic_inspect} - -After we have got the initial working version of our algorithm working -with G-API, we can use it to inspect and learn how G-API works. This -chapter covers two aspects: understanding the graph structure, and -memory profiling. - -## Understanding the graph structure {#gapi_anisotropic_inspect_graph} - -G-API stands for "Graph API", but did you mention any graphs in the -above example? It was one of the initial design goals -- G-API was -designed with expressions in mind to make adoption and porting process -more straightforward. People _usually_ don't think in terms of -_Nodes_ and _Edges_ when writing ordinary code, and so G-API, while -being a Graph API, doesn't force its users to do that. - -However, a graph is still built implicitly when a cv::GComputation -object is defined. It may be useful to inspect how the resulting graph -looks like to check if it is generated correctly and if it really -represents our algorithm. It is also useful to learn the structure of -the graph to see if it has any redundancies. - -G-API allows to dump generated graphs to `.dot` files which then -could be visualized with [Graphviz](https://www.graphviz.org/), a -popular open graph visualization software. - - - -In order to dump our graph to a `.dot` file, set `GRAPH_DUMP_PATH` to a -file name before running the application, e.g.: - - $ GRAPH_DUMP_PATH=segm.dot ./bin/example_tutorial_porting_anisotropic_image_segmentation_gapi - -Now this file can be visualized with a `dot` command like this: - - $ dot segm.dot -Tpng -o segm.png - -or viewed interactively with `xdot` (please refer to your -distribution/operating system documentation on how to install these -packages). - -![Anisotropic image segmentation graph](pics/segm.gif) - -The above diagram demonstrates a number of interesting aspects of -G-API's internal algorithm representation: -1. G-API underlying graph is a bipartite graph: it consists of - _Operation_ and _Data_ nodes such that a _Data_ node can only be - connected to an _Operation_ node, _Operation_ node can only be - connected to a _Data_ node, and nodes of a single kind are never - connected directly. -2. Graph is directed - every edge in the graph has a direction. -3. Graph "begins" and "ends" with a _Data_ kind of nodes. -4. A _Data_ node can have only a single writer and multiple readers. -5. An _Operation_ node may have multiple inputs, though every input - must have an unique _port number_ (among inputs). -6. An _Operation_ node may have multiple outputs, and every output - must have an unique _port number_ (among outputs). - -## Measuring memory footprint {#gapi_anisotropic_memory_ocv} - -Let's measure and compare memory footprint of the algorithm in its two -versions: G-API-based and OpenCV-based. At the moment, G-API version -is also OpenCV-based since it fallbacks to OpenCV functions inside. - -On GNU/Linux, application memory footprint can be profiled with -[Valgrind](http://valgrind.org/). On Debian/Ubuntu systems it can be -installed like this (assuming you have administrator privileges): - - $ sudo apt-get install valgrind massif-visualizer - -Once installed, we can collect memory profiles easily for our two -algorithm versions: - - $ valgrind --tool=massif --massif-out-file=ocv.out ./bin/example_tutorial_anisotropic_image_segmentation - ==6101== Massif, a heap profiler - ==6101== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote - ==6101== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info - ==6101== Command: ./bin/example_tutorial_anisotropic_image_segmentation - ==6101== - ==6101== - $ valgrind --tool=massif --massif-out-file=gapi.out ./bin/example_tutorial_porting_anisotropic_image_segmentation_gapi - ==6117== Massif, a heap profiler - ==6117== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote - ==6117== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info - ==6117== Command: ./bin/example_tutorial_porting_anisotropic_image_segmentation_gapi - ==6117== - ==6117== - -Once done, we can inspect the collected profiles with -[Massif Visualizer](https://github.com/KDE/massif-visualizer) -(installed in the above step). - -Below is the visualized memory profile of the original OpenCV version -of the algorithm: - -![Memory profile: original Anisotropic Image Segmentation sample](pics/massif_export_ocv.png) - -We see that memory is allocated as the application -executes, reaching its peak in the calcGST() function; then the -footprint drops as calcGST() completes its execution and all temporary -buffers are freed. Massif reports us peak memory consumption of 7.6 MiB. - -Now let's have a look on the profile of G-API version: - -![Memory profile: G-API port of Anisotropic Image Segmentation sample](pics/massif_export_gapi.png) - -Once G-API computation is created and its execution starts, G-API -allocates all required memory at once and then the memory profile -remains flat until the termination of the program. Massif reports us -peak memory consumption of 11.4 MiB. - -A reader may ask a right question at this point -- is G-API that bad? -What is the reason in using it than? - -Hopefully, it is not. The reason why we see here an increased memory -consumption is because the default naive OpenCV-based backend is used to -execute this graph. This backend serves mostly for quick prototyping -and debugging algorithms before offload/further optimization. - -This backend doesn't utilize any complex memory management strategies yet -since it is not its point at the moment. In the following chapter, -we'll learn about Fluid backend and see how the same G-API code can -run in a completely different model (and the footprint shrunk to a -number of kilobytes). - -# Backends and kernels {#gapi_anisotropic_backends} - -This chapter covers how a G-API computation can be executed in a -special way -- e.g. offloaded to another device, or scheduled with a -special intelligence. G-API is designed to make its graphs portable -- -it means that once a graph is defined in G-API terms, no changes -should be required in it if we want to run it on CPU or on GPU or on -both devices at once. [G-API High-level overview](@ref gapi_hld) and -[G-API Kernel API](@ref gapi_kernel_api) shed more light on technical -details which make it possible. In this chapter, we will utilize G-API -Fluid backend to make our graph cache-efficient on CPU. - -G-API defines _backend_ as the lower-level entity which knows how to -run kernels. Backends may have (and, in fact, do have) different -_Kernel APIs_ which are used to program and integrate kernels for that -backends. In this context, _kernel_ is an implementation of an -_operation_, which is defined on the top API level (see -G_TYPED_KERNEL() macro). - -Backend is a thing which is aware of device & platform specifics, and -which executes its kernels with keeping that specifics in mind. For -example, there may be [Halide](http://halide-lang.org/) backend which -allows to write (implement) G-API operations in Halide language and -then generate functional Halide code for portions of G-API graph which -map well there. - -## Running a graph with a Fluid backend {#gapi_anisotropic_fluid} - -OpenCV 4.0 is bundled with two G-API backends -- the default "OpenCV" -which we just used, and a special "Fluid" backend. - -Fluid backend reorganizes the execution to save memory and to achieve -near-perfect cache locality, implementing so-called "streaming" model -of execution. - -In order to start using Fluid kernels, we need first to include -appropriate header files (which are not included by default): - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi_fluid.cpp fluid_includes - -Once these headers are included, we can form up a new _kernel package_ -and specify it to G-API: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi_fluid.cpp kernel_pkg - -In G-API, kernels (or operation implementations) are objects. Kernels are -organized into collections, or _kernel packages_, represented by class -cv::GKernelPackage. The main purpose of a kernel package is to -capture which kernels we would like to use in our graph, and pass it -as a _graph compilation option_: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi_fluid.cpp kernel_pkg_use - -Traditional OpenCV is logically divided into modules, with every -module providing a set of functions. In G-API, there are also -"modules" which are represented as kernel packages provided by a -particular backend. In this example, we pass Fluid kernel packages to -G-API to utilize appropriate Fluid functions in our graph. - -Kernel packages are combinable -- in the above example, we take "Core" -and "ImgProc" Fluid kernel packages and combine it into a single -one. See documentation reference on cv::gapi::combine. - -If no kernel packages are specified in options, G-API is using -_default_ package which consists of default OpenCV implementations and -thus G-API graphs are executed via OpenCV functions by default. OpenCV -backend provides broader functional coverage than any other -backend. If a kernel package is specified, like in this example, then -it is being combined with the _default_. -It means that user-specified implementations will replace default implementations in case of -conflict. - - - - -## Troubleshooting and customization {#gapi_anisotropic_trouble} - -After the above modifications, (in OpenCV 4.0) the app should crash -with a message like this: - -``` -$ ./bin/example_tutorial_porting_anisotropic_image_segmentation_gapi_fluid -terminate called after throwing an instance of 'std::logic_error' - what(): .../modules/gapi/src/backends/fluid/gfluidimgproc.cpp:436: Assertion kernelSize.width == 3 && kernelSize.height == 3 in function run failed - -Aborted (core dumped) -``` - -Fluid backend has a number of limitations in OpenCV 4.0 (see this -[wiki page](https://github.com/opencv/opencv/wiki/Graph-API) for a -more up-to-date status). In particular, the Box filter used in this -sample supports only static 3x3 kernel size. - -We can overcome this problem easily by avoiding G-API using Fluid -version of Box filter kernel in this sample. It can be done by -removing the appropriate kernel from the kernel package we've just -created: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi_fluid.cpp kernel_hotfix - -Now this kernel package doesn't have _any_ implementation of Box -filter kernel interface (specified as a template parameter). As -described above, G-API will fall-back to OpenCV to run this kernel -now. The resulting code with this change now looks like: - -@snippet cpp/tutorial_code/gapi/porting_anisotropic_image_segmentation/porting_anisotropic_image_segmentation_gapi_fluid.cpp kernel_pkg_proper - -Let's examine the memory profile for this sample after we switched to -Fluid backend. Now it looks like this: - -![Memory profile: G-API/Fluid port of Anisotropic Image Segmentation sample](pics/massif_export_gapi_fluid.png) - -Now the tool reports 4.7MiB -- and we just changed a few lines in our -code, without modifying the graph itself! It is a ~2.4X improvement of -the previous G-API result, and ~1.6X improvement of the original OpenCV -version. - -Let's also examine how the internal representation of the graph now -looks like. Dumping the graph into `.dot` would result into a -visualization like this: - -![Anisotropic image segmentation graph with OpenCV & Fluid kernels](pics/segm_fluid.gif) - -This graph doesn't differ structurally from its previous version (in -terms of operations and data objects), though a changed layout (on the -left side of the dump) is easily noticeable. - -The visualization reflects how G-API deals with mixed graphs, also -called _heterogeneous_ graphs. The majority of operations in this -graph are implemented with Fluid backend, but Box filters are executed -by the OpenCV backend. One can easily see that the graph is partitioned -(with rectangles). G-API groups connected operations based on their -affinity, forming _subgraphs_ (or _islands_ in G-API terminology), and -our top-level graph becomes a composition of multiple smaller -subgraphs. Every backend determines how its subgraph (island) is -executed, so Fluid backend optimizes out memory where possible, and -six intermediate buffers accessed by OpenCV Box filters are allocated -fully and can't be optimized out. - - - - - -# Conclusion {#gapi_tutor_conclusion} - -This tutorial demonstrates what G-API is and what its key design -concepts are, how an algorithm can be ported to G-API, and -how to utilize graph model benefits after that. - -In OpenCV 4.0, G-API is still in its inception stage -- it is more a -foundation for all future work, though ready for use even now. - -Further, this tutorial will be extended with new chapters on custom -kernels programming, parallelism, and more. diff --git a/doc/tutorials/gapi/face_beautification/face_beautification.markdown b/doc/tutorials/gapi/face_beautification/face_beautification.markdown deleted file mode 100644 index 1ceb416c99..0000000000 --- a/doc/tutorials/gapi/face_beautification/face_beautification.markdown +++ /dev/null @@ -1,442 +0,0 @@ -# Implementing a face beautification algorithm with G-API {#tutorial_gapi_face_beautification} - -@prev_tutorial{tutorial_gapi_anisotropic_segmentation} - -[TOC] - -# Introduction {#gapi_fb_intro} - -In this tutorial you will learn: -* Basics of a sample face beautification algorithm; -* How to infer different networks inside a pipeline with G-API; -* How to run a G-API pipeline on a video stream. - -## Prerequisites {#gapi_fb_prerec} - -This sample requires: -- PC with GNU/Linux or Microsoft Windows (Apple macOS is supported but - was not tested); -- OpenCV 4.2 or later built with Intel® Distribution of [OpenVINO™ - Toolkit](https://docs.openvinotoolkit.org/) (building with [Intel® - TBB](https://www.threadingbuildingblocks.org/intel-tbb-tutorial) is - a plus); -- The following topologies from OpenVINO™ Toolkit [Open Model - Zoo](https://github.com/opencv/open_model_zoo): - - `face-detection-adas-0001`; - - `facial-landmarks-35-adas-0002`. - -## Face beautification algorithm {#gapi_fb_algorithm} - -We will implement a simple face beautification algorithm using a -combination of modern Deep Learning techniques and traditional -Computer Vision. The general idea behind the algorithm is to make -face skin smoother while preserving face features like eyes or a -mouth contrast. The algorithm identifies parts of the face using a DNN -inference, applies different filters to the parts found, and then -combines it into the final result using basic image arithmetics: - -\dot -strict digraph Pipeline { - node [shape=record fontname=Helvetica fontsize=10 style=filled color="#4c7aa4" fillcolor="#5b9bd5" fontcolor="white"]; - edge [color="#62a8e7"]; - ordering="out"; - splines=ortho; - rankdir=LR; - - input [label="Input"]; - fd [label="Face\ndetector"]; - bgMask [label="Generate\nBG mask"]; - unshMask [label="Unsharp\nmask"]; - bilFil [label="Bilateral\nfilter"]; - shMask [label="Generate\nsharp mask"]; - blMask [label="Generate\nblur mask"]; - mul_1 [label="*" fontsize=24 shape=circle labelloc=b]; - mul_2 [label="*" fontsize=24 shape=circle labelloc=b]; - mul_3 [label="*" fontsize=24 shape=circle labelloc=b]; - - subgraph cluster_0 { - style=dashed - fontsize=10 - ld [label="Landmarks\ndetector"]; - label="for each face" - } - - sum_1 [label="+" fontsize=24 shape=circle]; - out [label="Output"]; - - temp_1 [style=invis shape=point width=0]; - temp_2 [style=invis shape=point width=0]; - temp_3 [style=invis shape=point width=0]; - temp_4 [style=invis shape=point width=0]; - temp_5 [style=invis shape=point width=0]; - temp_6 [style=invis shape=point width=0]; - temp_7 [style=invis shape=point width=0]; - temp_8 [style=invis shape=point width=0]; - temp_9 [style=invis shape=point width=0]; - - input -> temp_1 [arrowhead=none] - temp_1 -> fd -> ld - ld -> temp_4 [arrowhead=none] - temp_4 -> bgMask - bgMask -> mul_1 -> sum_1 -> out - - temp_4 -> temp_5 -> temp_6 [arrowhead=none constraint=none] - ld -> temp_2 -> temp_3 [style=invis constraint=none] - - temp_1 -> {unshMask, bilFil} - fd -> unshMask [style=invis constraint=none] - unshMask -> bilFil [style=invis constraint=none] - - bgMask -> shMask [style=invis constraint=none] - shMask -> blMask [style=invis constraint=none] - mul_1 -> mul_2 [style=invis constraint=none] - temp_5 -> shMask -> mul_2 - temp_6 -> blMask -> mul_3 - - unshMask -> temp_2 -> temp_5 [style=invis] - bilFil -> temp_3 -> temp_6 [style=invis] - - mul_2 -> temp_7 [arrowhead=none] - mul_3 -> temp_8 [arrowhead=none] - - temp_8 -> temp_7 [arrowhead=none constraint=none] - temp_7 -> sum_1 [constraint=none] - - unshMask -> mul_2 [constraint=none] - bilFil -> mul_3 [constraint=none] - temp_1 -> mul_1 [constraint=none] -} -\enddot - -Briefly the algorithm is described as follows: -- Input image \f$I\f$ is passed to unsharp mask and bilateral filters - (\f$U\f$ and \f$L\f$ respectively); -- Input image \f$I\f$ is passed to an SSD-based face detector; -- SSD result (a \f$[1 \times 1 \times 200 \times 7]\f$ blob) is parsed - and converted to an array of faces; -- Every face is passed to a landmarks detector; -- Based on landmarks found for every face, three image masks are - generated: - - A background mask \f$b\f$ -- indicating which areas from the - original image to keep as-is; - - A face part mask \f$p\f$ -- identifying regions to preserve - (sharpen). - - A face skin mask \f$s\f$ -- identifying regions to blur; -- The final result \f$O\f$ is a composition of features above - calculated as \f$O = b*I + p*U + s*L\f$. - -Generating face element masks based on a limited set of features (just -35 per face, including all its parts) is not very trivial and is -described in the sections below. - -# Constructing a G-API pipeline {#gapi_fb_pipeline} - -## Declaring Deep Learning topologies {#gapi_fb_decl_nets} - -This sample is using two DNN detectors. Every network takes one input -and produces one output. In G-API, networks are defined with macro -G_API_NET(): - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp net_decl - -To get more information, see -[Declaring Deep Learning topologies](@ref gapi_ifd_declaring_nets) -described in the "Face Analytics pipeline" tutorial. - -## Describing the processing graph {#gapi_fb_ppline} - -The code below generates a graph for the algorithm above: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp ppl - -The resulting graph is a mixture of G-API's standard operations, -user-defined operations (namespace `custom::`), and DNN inference. -The generic function `cv::gapi::infer<>()` allows to trigger inference -within the pipeline; networks to infer are specified as template -parameters. The sample code is using two versions of `cv::gapi::infer<>()`: -- A frame-oriented one is used to detect faces on the input frame. -- An ROI-list oriented one is used to run landmarks inference on a - list of faces -- this version produces an array of landmarks per - every face. - -More on this in "Face Analytics pipeline" -([Building a GComputation](@ref gapi_ifd_gcomputation) section). - -## Unsharp mask in G-API {#gapi_fb_unsh} - -The unsharp mask \f$U\f$ for image \f$I\f$ is defined as: - -\f[U = I - s * L(M(I)),\f] - -where \f$M()\f$ is a median filter, \f$L()\f$ is the Laplace operator, -and \f$s\f$ is a strength coefficient. While G-API doesn't provide -this function out-of-the-box, it is expressed naturally with the -existing G-API operations: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp unsh - -Note that the code snipped above is a regular C++ function defined -with G-API types. Users can write functions like this to simplify -graph construction; when called, this function just puts the relevant -nodes to the pipeline it is used in. - -# Custom operations {#gapi_fb_proc} - -The face beautification graph is using custom operations -extensively. This chapter focuses on the most interesting kernels, -refer to [G-API Kernel API](@ref gapi_kernel_api) for general -information on defining operations and implementing kernels in G-API. - -## Face detector post-processing {#gapi_fb_face_detect} - -A face detector output is converted to an array of faces with the -following kernel: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp vec_ROI -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp fd_pp - -## Facial landmarks post-processing {#gapi_fb_landm_detect} - -The algorithm infers locations of face elements (like the eyes, the mouth -and the head contour itself) using a generic facial landmarks detector -(details) -from OpenVINO™ Open Model Zoo. However, the detected landmarks as-is are not -enough to generate masks --- this operation requires regions of interest on -the face represented by closed contours, so some interpolation is applied to -get them. This landmarks -processing and interpolation is performed by the following kernel: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp ld_pp_cnts - -The kernel takes two arrays of denormalized landmarks coordinates and -returns an array of elements' closed contours and an array of faces' -closed contours; in other words, outputs are, the first, an array of -contours of image areas to be sharpened and, the second, another one -to be smoothed. - -Here and below `Contour` is a vector of points. - -### Getting an eye contour {#gapi_fb_ld_eye} - -Eye contours are estimated with the following function: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp ld_pp_incl -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp ld_pp_eye - -Briefly, this function restores the bottom side of an eye by a -half-ellipse based on two points in left and right eye -corners. In fact, `cv::ellipse2Poly()` is used to approximate the eye region, and -the function only defines ellipse parameters based on just two points: -- The ellipse center and the \f$X\f$ half-axis calculated by two eye Points; -- The \f$Y\f$ half-axis calculated according to the assumption that an average -eye width is \f$1/3\f$ of its length; -- The start and the end angles which are 0 and 180 (refer to - `cv::ellipse()` documentation); -- The angle delta: how much points to produce in the contour; -- The inclination angle of the axes. - -The use of the `atan2()` instead of just `atan()` in function -`custom::getLineInclinationAngleDegrees()` is essential as it allows to -return a negative value depending on the `x` and the `y` signs so we -can get the right angle even in case of upside-down face arrangement -(if we put the points in the right order, of course). - -### Getting a forehead contour {#gapi_fb_ld_fhd} - -The function approximates the forehead contour: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp ld_pp_fhd - -As we have only jaw points in our detected landmarks, we have to get a -half-ellipse based on three points of a jaw: the leftmost, the -rightmost and the lowest one. The jaw width is assumed to be equal to the -forehead width and the latter is calculated using the left and the -right points. Speaking of the \f$Y\f$ axis, we have no points to get -it directly, and instead assume that the forehead height is about \f$2/3\f$ -of the jaw height, which can be figured out from the face center (the -middle between the left and right points) and the lowest jaw point. - -## Drawing masks {#gapi_fb_masks_drw} - -When we have all the contours needed, we are able to draw masks: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp msk_ppline - -The steps to get the masks are: -* the "sharp" mask calculation: - * fill the contours that should be sharpened; - * blur that to get the "sharp" mask (`mskSharpG`); -* the "bilateral" mask calculation: - * fill all the face contours fully; - * blur that; - * subtract areas which intersect with the "sharp" mask --- and get the - "bilateral" mask (`mskBlurFinal`); -* the background mask calculation: - * add two previous masks - * set all non-zero pixels of the result as 255 (by `cv::gapi::threshold()`) - * revert the output (by `cv::gapi::bitwise_not`) to get the background - mask (`mskNoFaces`). - -# Configuring and running the pipeline {#gapi_fb_comp_args} - -Once the graph is fully expressed, we can finally compile it and run -on real data. G-API graph compilation is the stage where the G-API -framework actually understands which kernels and networks to use. This -configuration happens via G-API compilation arguments. - -## DNN parameters {#gapi_fb_comp_args_net} - -This sample is using OpenVINO™ Toolkit Inference Engine backend for DL -inference, which is configured the following way: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp net_param - -Every `cv::gapi::ie::Params<>` object is related to the network -specified in its template argument. We should pass there the network -type we have defined in `G_API_NET()` in the early beginning of the -tutorial. - -Network parameters are then wrapped in `cv::gapi::NetworkPackage`: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp netw - -More details in "Face Analytics Pipeline" -([Configuring the pipeline](@ref gapi_ifd_configuration) section). - -## Kernel packages {#gapi_fb_comp_args_kernels} - -In this example we use a lot of custom kernels, in addition to that we -use Fluid backend to optimize out memory for G-API's standard kernels -where applicable. The resulting kernel package is formed like this: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp kern_pass_1 - -## Compiling the streaming pipeline {#gapi_fb_compiling} - -G-API optimizes execution for video streams when compiled in the -"Streaming" mode. - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp str_comp - -More on this in "Face Analytics Pipeline" -([Configuring the pipeline](@ref gapi_ifd_configuration) section). - -## Running the streaming pipeline {#gapi_fb_running} - -In order to run the G-API streaming pipeline, all we need is to -specify the input video source, call -`cv::GStreamingCompiled::start()`, and then fetch the pipeline -processing results: - -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp str_src -@snippet cpp/tutorial_code/gapi/face_beautification/face_beautification.cpp str_loop - -Once results are ready and can be pulled from the pipeline we display -it on the screen and handle GUI events. - -See [Running the pipeline](@ref gapi_ifd_running) section -in the "Face Analytics Pipeline" tutorial for more details. - -# Conclusion {#gapi_fb_cncl} - -The tutorial has two goals: to show the use of brand new features of -G-API introduced in OpenCV 4.2, and give a basic understanding on a -sample face beautification algorithm. - -The result of the algorithm application: - -![Face Beautification example](pics/example.jpg) - -On the test machine (Intel® Core™ i7-8700) the G-API-optimized video -pipeline outperforms its serial (non-pipelined) version by a factor of -**2.7** -- meaning that for such a non-trivial graph, the proper -pipelining can bring almost 3x increase in performance. - - diff --git a/doc/tutorials/gapi/face_beautification/pics/example.jpg b/doc/tutorials/gapi/face_beautification/pics/example.jpg deleted file mode 100644 index 99a538f78cdefc707efdde5516b6a62679853318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176525 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 z 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%0AwaVOwVw2#(=}gQ(pyjTt&1Y?TFp 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


Zu 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

Xw$8bS$cg*eXR1en2aIo>npoN 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 Kac#-sfB)I~Y`)?E diff --git a/doc/tutorials/gapi/interactive_face_detection/interactive_face_detection.markdown b/doc/tutorials/gapi/interactive_face_detection/interactive_face_detection.markdown deleted file mode 100644 index 27916b4176..0000000000 --- a/doc/tutorials/gapi/interactive_face_detection/interactive_face_detection.markdown +++ /dev/null @@ -1,355 +0,0 @@ -# Face analytics pipeline with G-API {#tutorial_gapi_interactive_face_detection} - -@next_tutorial{tutorial_gapi_anisotropic_segmentation} - -[TOC] - -# Overview {#gapi_ifd_intro} - -In this tutorial you will learn: -* How to integrate Deep Learning inference in a G-API graph; -* How to run a G-API graph on a video stream and obtain data from it. - -# Prerequisites {#gapi_ifd_prereq} - -This sample requires: -- PC with GNU/Linux or Microsoft Windows (Apple macOS is supported but - was not tested); -- OpenCV 4.2 or later built with Intel® Distribution of [OpenVINO™ - Toolkit](https://docs.openvinotoolkit.org/) (building with [Intel® - TBB](https://www.threadingbuildingblocks.org/intel-tbb-tutorial) is - a plus); -- The following topologies from OpenVINO™ Toolkit [Open Model - Zoo](https://github.com/opencv/open_model_zoo): - - `face-detection-adas-0001`; - - `age-gender-recognition-retail-0013`; - - `emotions-recognition-retail-0003`. - -# Introduction: why G-API {#gapi_ifd_why} - -Many computer vision algorithms run on a video stream rather than on -individual images. Stream processing usually consists of multiple -steps -- like decode, preprocessing, detection, tracking, -classification (on detected objects), and visualization -- forming a -*video processing pipeline*. Moreover, many these steps of such -pipeline can run in parallel -- modern platforms have different -hardware blocks on the same chip like decoders and GPUs, and extra -accelerators can be plugged in as extensions, like Intel® Movidius™ -Neural Compute Stick for deep learning offload. - -Given all this manifold of options and a variety in video analytics -algorithms, managing such pipelines effectively quickly becomes a -problem. For sure it can be done manually, but this approach doesn't -scale: if a change is required in the algorithm (e.g. a new pipeline -step is added), or if it is ported on a new platform with different -capabilities, the whole pipeline needs to be re-optimized. - -Starting with version 4.2, OpenCV offers a solution to this -problem. OpenCV G-API now can manage Deep Learning inference (a -cornerstone of any modern analytics pipeline) with a traditional -Computer Vision as well as video capturing/decoding, all in a single -pipeline. G-API takes care of pipelining itself -- so if the algorithm -or platform changes, the execution model adapts to it automatically. - -# Pipeline overview {#gapi_ifd_overview} - -Our sample application is based on ["Interactive Face Detection"] demo -from OpenVINO™ Toolkit Open Model Zoo. A simplified pipeline consists -of the following steps: -1. Image acquisition and decode; -2. Detection with preprocessing; -3. Classification with preprocessing for every detected object with - two networks; -4. Visualization. - -\dot -digraph pipeline { - node [shape=record fontname=Helvetica fontsize=10 style=filled color="#4c7aa4" fillcolor="#5b9bd5" fontcolor="white"]; - edge [color="#62a8e7"]; - splines=ortho; - - rankdir = LR; - subgraph cluster_0 { - color=invis; - capture [label="Capture\nDecode"]; - resize [label="Resize\nConvert"]; - detect [label="Detect faces"]; - capture -> resize -> detect - } - - subgraph cluster_1 { - graph[style=dashed]; - - subgraph cluster_2 { - color=invis; - temp_4 [style=invis shape=point width=0]; - postproc_1 [label="Crop\nResize\nConvert"]; - age_gender [label="Classify\nAge/gender"]; - postproc_1 -> age_gender [constraint=true] - temp_4 -> postproc_1 [constraint=none] - } - - subgraph cluster_3 { - color=invis; - postproc_2 [label="Crop\nResize\nConvert"]; - emo [label="Classify\nEmotions"]; - postproc_2 -> emo [constraint=true] - } - label="(for each face)"; - } - - temp_1 [style=invis shape=point width=0]; - temp_2 [style=invis shape=point width=0]; - detect -> temp_1 [arrowhead=none] - temp_1 -> postproc_1 - - capture -> {temp_4, temp_2} [arrowhead=none constraint=false] - temp_2 -> postproc_2 - - temp_1 -> temp_2 [arrowhead=none constraint=false] - - temp_3 [style=invis shape=point width=0]; - show [label="Visualize\nDisplay"]; - - {age_gender, emo} -> temp_3 [arrowhead=none] - temp_3 -> show -} -\enddot - -# Constructing a pipeline {#gapi_ifd_constructing} - -Constructing a G-API graph for a video streaming case does not differ -much from a [regular usage](@ref gapi_example) of G-API -- it is still -about defining graph *data* (with cv::GMat, cv::GScalar, and -cv::GArray) and *operations* over it. Inference also becomes an -operation in the graph, but is defined in a little bit different way. - -## Declaring Deep Learning topologies {#gapi_ifd_declaring_nets} - -In contrast with traditional CV functions (see [core] and [imgproc]) -where G-API declares distinct operations for every function, inference -in G-API is a single generic operation cv::gapi::infer<>. As usual, it -is just an interface and it can be implemented in a number of ways under -the hood. In OpenCV 4.2, only OpenVINO™ Inference Engine-based backend -is available, and OpenCV's own DNN module-based backend is to come. - -cv::gapi::infer<> is _parametrized_ by the details of a topology we are -going to execute. Like operations, topologies in G-API are strongly -typed and are defined with a special macro G_API_NET(): - -@snippet cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp G_API_NET - -Similar to how operations are defined with G_API_OP(), network -description requires three parameters: -1. A type name. Every defined topology is declared as a distinct C++ - type which is used further in the program -- see below; -2. A `std::function<>`-like API signature. G-API traits networks as - regular "functions" which take and return data. Here network - `Faces` (a detector) takes a cv::GMat and returns a cv::GMat, while - network `AgeGender` is known to provide two outputs (age and gender - blobs, respectively) -- so its has a `std::tuple<>` as a return - type. -3. A topology name -- can be any non-empty string, G-API is using - these names to distinguish networks inside. Names should be unique - in the scope of a single graph. - -## Building a GComputation {#gapi_ifd_gcomputation} - -Now the above pipeline is expressed in G-API like this: - -@snippet cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp GComputation - -Every pipeline starts with declaring empty data objects -- which act -as inputs to the pipeline. Then we call a generic cv::gapi::infer<> -specialized to `Faces` detection network. cv::gapi::infer<> inherits its -signature from its template parameter -- and in this case it expects -one input cv::GMat and produces one output cv::GMat. - -In this sample we use a pre-trained SSD-based network and its output -needs to be parsed to an array of detections (object regions of -interest, ROIs). It is done by a custom operation `custom::PostProc`, -which returns an array of rectangles (of type `cv::GArray`) -back to the pipeline. This operation also filters out results by a -confidence threshold -- and these details are hidden in the kernel -itself. Still, at the moment of graph construction we operate with -interfaces only and don't need actual kernels to express the pipeline --- so the implementation of this post-processing will be listed later. - -After detection result output is parsed to an array of objects, we can run -classification on any of those. G-API doesn't support syntax for -in-graph loops like `for_each()` yet, but instead cv::gapi::infer<> -comes with a special list-oriented overload. - -User can call cv::gapi::infer<> with a cv::GArray as the first -argument, so then G-API assumes it needs to run the associated network -on every rectangle from the given list of the given frame (second -argument). Result of such operation is also a list -- a cv::GArray of -cv::GMat. - -Since `AgeGender` network itself produces two outputs, it's output -type for a list-based version of cv::gapi::infer is a tuple of -arrays. We use `std::tie()` to decompose this input into two distinct -objects. - -`Emotions` network produces a single output so its list-based -inference's return type is `cv::GArray`. - -# Configuring the pipeline {#gapi_ifd_configuration} - -G-API strictly separates construction from configuration -- with the -idea to keep algorithm code itself platform-neutral. In the above -listings we only declared our operations and expressed the overall -data flow, but didn't even mention that we use OpenVINO™. We only -described *what* we do, but not *how* we do it. Keeping these two -aspects clearly separated is the design goal for G-API. - -Platform-specific details arise when the pipeline is *compiled* -- -i.e. is turned from a declarative to an executable form. The way *how* -to run stuff is specified via compilation arguments, and new -inference/streaming features are no exception from this rule. - -G-API is built on backends which implement interfaces (see -[Architecture] and [Kernels] for details) -- thus cv::gapi::infer<> is -a function which can be implemented by different backends. In OpenCV -4.2, only OpenVINO™ Inference Engine backend for inference is -available. Every inference backend in G-API has to provide a special -parameterizable structure to express *backend-specific* neural network -parameters -- and in this case, it is cv::gapi::ie::Params: - -@snippet cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp Param_Cfg - -Here we define three parameter objects: `det_net`, `age_net`, and -`emo_net`. Every object is a cv::gapi::ie::Params structure -parametrization for each particular network we use. On a compilation -stage, G-API automatically matches network parameters with their -cv::gapi::infer<> calls in graph using this information. - -Regardless of the topology, every parameter structure is constructed -with three string arguments -- specific to the OpenVINO™ Inference -Engine: -1. Path to the topology's intermediate representation (.xml file); -2. Path to the topology's model weights (.bin file); -3. Device where to run -- "CPU", "GPU", and others -- based on your -OpenVINO™ Toolkit installation. -These arguments are taken from the command-line parser. - -Once networks are defined and custom kernels are implemented, the -pipeline is compiled for streaming: - -@snippet cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp Compile - -cv::GComputation::compileStreaming() triggers a special video-oriented -form of graph compilation where G-API is trying to optimize -throughput. Result of this compilation is an object of special type -cv::GStreamingCompiled -- in contrast to a traditional callable -cv::GCompiled, these objects are closer to media players in their -semantics. - -@note There is no need to pass metadata arguments describing the -format of the input video stream in -cv::GComputation::compileStreaming() -- G-API figures automatically -what are the formats of the input vector and adjusts the pipeline to -these formats on-the-fly. User still can pass metadata there as with -regular cv::GComputation::compile() in order to fix the pipeline to -the specific input format. - -# Running the pipeline {#gapi_ifd_running} - -Pipelining optimization is based on processing multiple input video -frames simultaneously, running different steps of the pipeline in -parallel. This is why it works best when the framework takes full -control over the video stream. - -The idea behind streaming API is that user specifies an *input source* -to the pipeline and then G-API manages its execution automatically -until the source ends or user interrupts the execution. G-API pulls -new image data from the source and passes it to the pipeline for -processing. - -Streaming sources are represented by the interface -cv::gapi::wip::IStreamSource. Objects implementing this interface may -be passed to `GStreamingCompiled` as regular inputs via `cv::gin()` -helper function. In OpenCV 4.2, only one streaming source is allowed -per pipeline -- this requirement will be relaxed in the future. - -OpenCV comes with a great class cv::VideoCapture and by default G-API -ships with a stream source class based on it -- -cv::gapi::wip::GCaptureSource. Users can implement their own -streaming sources e.g. using [VAAPI] or other Media or Networking -APIs. - -Sample application specifies the input source as follows: - -@snippet cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp Source - -Please note that a GComputation may still have multiple inputs like -cv::GMat, cv::GScalar, or cv::GArray objects. User can pass their -respective host-side types (cv::Mat, cv::Scalar, std::vector<>) in the -input vector as well, but in Streaming mode these objects will create -"endless" constant streams. Mixing a real video source stream and a -const data stream is allowed. - -Running a pipeline is easy -- just call -cv::GStreamingCompiled::start() and fetch your data with blocking -cv::GStreamingCompiled::pull() or non-blocking -cv::GStreamingCompiled::try_pull(); repeat until the stream ends: - -@snippet cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp Run - -The above code may look complex but in fact it handles two modes -- -with and without graphical user interface (GUI): -- When a sample is running in a "headless" mode (`--pure` option is - set), this code simply pulls data from the pipeline with the - blocking `pull()` until it ends. This is the most performant mode of - execution. -- When results are also displayed on the screen, the Window System - needs to take some time to refresh the window contents and handle - GUI events. In this case, the demo pulls data with a non-blocking - `try_pull()` until there is no more data available (but it does not - mark end of the stream -- just means new data is not ready yet), and - only then displays the latest obtained result and refreshes the - screen. Reducing the time spent in GUI with this trick increases the - overall performance a little bit. - -# Comparison with serial mode {#gapi_ifd_comparison} - -The sample can also run in a serial mode for a reference and -benchmarking purposes. In this case, a regular -cv::GComputation::compile() is used and a regular single-frame -cv::GCompiled object is produced; the pipelining optimization is not -applied within G-API; it is the user responsibility to acquire image -frames from cv::VideoCapture object and pass those to G-API. - -@snippet cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp Run_Serial - -On a test machine (Intel® Core™ i5-6600), with OpenCV built with -[Intel® TBB] -support, detector network assigned to CPU, and classifiers to iGPU, -the pipelined sample outperformes the serial one by the factor of -1.36x (thus adding +36% in overall throughput). - -# Conclusion {#gapi_ifd_conclusion} - -G-API introduces a technological way to build and optimize hybrid -pipelines. Switching to a new execution model does not require changes -in the algorithm code expressed with G-API -- only the way how graph -is triggered differs. - -# Listing: post-processing kernel {#gapi_ifd_pp} - -G-API gives an easy way to plug custom code into the pipeline even if -it is running in a streaming mode and processing tensor -data. Inference results are represented by multi-dimensional cv::Mat -objects so accessing those is as easy as with a regular DNN module. - -The OpenCV-based SSD post-processing kernel is defined and implemented in this -sample as follows: - -@snippet cpp/tutorial_code/gapi/age_gender_emotion_recognition/age_gender_emotion_recognition.cpp Postproc - -["Interactive Face Detection"]: https://github.com/opencv/open_model_zoo/tree/master/demos/interactive_face_detection_demo -[core]: @ref gapi_core -[imgproc]: @ref gapi_imgproc -[Architecture]: @ref gapi_hld -[Kernels]: @ref gapi_kernel_api -[VAAPI]: https://01.org/vaapi diff --git a/doc/tutorials/gapi/oak_devices/oak_devices.markdown b/doc/tutorials/gapi/oak_devices/oak_devices.markdown deleted file mode 100644 index 6046cdef25..0000000000 --- a/doc/tutorials/gapi/oak_devices/oak_devices.markdown +++ /dev/null @@ -1,26 +0,0 @@ -Using DepthAI Hardware / OAK depth sensors {#tutorial_gapi_oak_devices} -======================================================================= - -@tableofcontents - -@prev_tutorial{tutorial_gapi_face_beautification} - -![Oak-D and Oak-D-Light cameras](pics/oak.jpg) - -Depth sensors compatible with Luxonis DepthAI library are supported through OpenCV Graph API (or G-API) module. RGB image and some other formats of output can be retrieved by using familiar interface of G-API module. - -In order to use DepthAI sensor with OpenCV you should do the following preliminary steps: --# Install Luxonis DepthAI library [depthai-core](https://github.com/luxonis/depthai-core). - --# Configure OpenCV with DepthAI library support by setting `WITH_OAK` flag in CMake. If DepthAI library is found in install folders OpenCV will be built with depthai-core (see a status `WITH_OAK` in CMake log). - --# Build OpenCV. - -Source code ------------ - -You can find source code how to process heterogeneous graphs in the `modules/gapi/samples/oak_basic_infer.cpp` of the OpenCV source code library. - -@add_toggle_cpp - @include modules/gapi/samples/oak_basic_infer.cpp -@end_toggle diff --git a/doc/tutorials/gapi/oak_devices/pics/oak.jpg b/doc/tutorials/gapi/oak_devices/pics/oak.jpg deleted file mode 100644 index 9ad30ce1e9bb3fedf00fb94c9d06275c5d6116b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163279 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 wD;sAc~#fB?24(wx@z}ZIJJ?0&ZXsKj^ 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

7xO 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�$#-^2GD>wV4ar{Lck!jgNDn==P2mR% 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

;e(1_m+uFsk34Lr_U7=6KCu8DS8QCc= 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 N>T-}{a0`84|JkQvJ`n%_ diff --git a/doc/tutorials/gapi/table_of_content_gapi.markdown b/doc/tutorials/gapi/table_of_content_gapi.markdown deleted file mode 100644 index 1b33172b9e..0000000000 --- a/doc/tutorials/gapi/table_of_content_gapi.markdown +++ /dev/null @@ -1,53 +0,0 @@ -# Graph API (gapi module) {#tutorial_table_of_content_gapi} - -In this section you will learn about graph-based image processing and -how G-API module can be used for that. - -- @subpage tutorial_gapi_interactive_face_detection - - *Languages:* C++ - - *Compatibility:* \> OpenCV 4.2 - - *Author:* Dmitry Matveev - - This tutorial illustrates how to build a hybrid video processing - pipeline with G-API where Deep Learning and image processing are - combined effectively to maximize the overall throughput. This - sample requires Intel® distribution of OpenVINO™ Toolkit version - 2019R2 or later. - -- @subpage tutorial_gapi_anisotropic_segmentation - - *Languages:* C++ - - *Compatibility:* \> OpenCV 4.0 - - *Author:* Dmitry Matveev - - This is an end-to-end tutorial where an existing sample algorithm - is ported on G-API, covering the basic intuition behind this - transition process, and examining benefits which a graph model - brings there. - -- @subpage tutorial_gapi_face_beautification - - *Languages:* C++ - - *Compatibility:* \> OpenCV 4.2 - - *Author:* Orest Chura - - In this tutorial we build a complex hybrid Computer Vision/Deep - Learning video processing pipeline with G-API. - - -- @subpage tutorial_gapi_oak_devices - - *Languages:* C++ - - *Compatibility:* \> OpenCV 4.6 - - *Author:* Alessandro de Oliveira Faria (A.K.A. CABELO) - - In this tutorial we showed how to use the Luxonis DepthAI library with G-API. diff --git a/doc/tutorials/introduction/env_reference/env_reference.markdown b/doc/tutorials/introduction/env_reference/env_reference.markdown index ee725f8542..c902a95c46 100644 --- a/doc/tutorials/introduction/env_reference/env_reference.markdown +++ b/doc/tutorials/introduction/env_reference/env_reference.markdown @@ -301,26 +301,6 @@ Some external dependencies can be detached into a dynamic library, which will be | OPENCV_TEST_CAMERA_%d_FPS | num | | fps to set for N-th camera (0-based index) (waitAny_V4L test) | -## gapi -| name | type | default | description | -|------|------|---------|-------------| -| ⭐ GRAPH_DUMP_PATH | file path | | dump graph (dot format) | -| PIPELINE_MODELS_PATH | dir path | | pipeline_modeling_tool sample application uses this var | -| OPENCV_GAPI_INFERENCE_ENGINE_CORE_LIFETIME_WORKAROUND | bool | true (Windows, Apple), false (others) | similar to OPENCV_DNN_INFERENCE_ENGINE_CORE_LIFETIME_WORKAROUND | - -### gapi tests/samples -| name | type | default | description | -|------|------|---------|-------------| -| PLAIDML_DEVICE | string | | specific to PlaidML backend test | -| PLAIDML_TARGET | string | | specific to PlaidML backend test | -| OPENCV_GAPI_ONNX_MODEL_PATH | dir path | | search location for ONNX models test | -| OPENCV_TEST_FREETYPE_FONT_PATH | file path | | location of TrueType font for one of tests | - -### Links: -* https://github.com/opencv/opencv/wiki/Using-G-API-with-OpenVINO-Toolkit -* https://github.com/opencv/opencv/wiki/Using-G-API-with-MS-ONNX-Runtime - - ## highgui | name | type | default | description | diff --git a/doc/tutorials/tutorials.markdown b/doc/tutorials/tutorials.markdown index ffa5d5d3c6..48f1292971 100644 --- a/doc/tutorials/tutorials.markdown +++ b/doc/tutorials/tutorials.markdown @@ -9,7 +9,6 @@ OpenCV Tutorials {#tutorial_root} - @subpage tutorial_table_of_content_objdetect - INSERT OBJDETECT MODULE INFO - @subpage tutorial_table_of_content_features - feature detectors, descriptors and matching framework - @subpage tutorial_table_of_content_dnn - infer neural networks using built-in _dnn_ module -- @subpage tutorial_table_of_content_gapi - graph-based approach to computer vision algorithms building - @subpage tutorial_table_of_content_other - other modules (stitching, video, photo) - @subpage tutorial_table_of_content_ios - running OpenCV on an iDevice - @subpage tutorial_table_of_content_3d - 3d objects processing and visualisation diff --git a/modules/gapi/CMakeLists.txt b/modules/gapi/CMakeLists.txt deleted file mode 100644 index 6757c853bd..0000000000 --- a/modules/gapi/CMakeLists.txt +++ /dev/null @@ -1,440 +0,0 @@ -# FIXME: Rework standalone build in more generic maner -# (Restructure directories, add common pass, etc) -if(NOT DEFINED OPENCV_INITIAL_PASS) - cmake_minimum_required(VERSION 3.13) - project(gapi_standalone) - include("cmake/standalone.cmake") - return() -endif() - -if(NOT TARGET ade) - # can't build G-API because of the above reasons - ocv_module_disable(gapi) - return() -endif() - -if(TARGET ocv.3rdparty.openvino) - # TODO: remove OPENCV_GAPI_INF_ENGINE option - set(initial_value ON) - if(DEFINED OPENCV_GAPI_INF_ENGINE) - set(initial_value ${OPENCV_GAPI_INF_ENGINE}) - message(WARNING "OPENCV_GAPI_INF_ENGINE option is deprecated. Use OPENCV_GAPI_WITH_OPENVINO option instead.") - endif() - ocv_option(OPENCV_GAPI_WITH_OPENVINO "G-API: Enable OpenVINO Toolkit support" ${initial_value}) -endif() - -set(the_description "OpenCV G-API Core Module") - -ocv_add_module(gapi - REQUIRED - opencv_imgproc - OPTIONAL - opencv_video opencv_stereo - WRAP - python -) - -if(MSVC) - if(MSVC_VERSION LESS 1910) - # Disable obsolete warning C4503 popping up on MSVC << 15 2017 - # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4503?view=vs-2019 - # and IE deprecated code warning C4996 - ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4503 /wd4996) - endif() - if((MSVC_VERSION LESS 1920) OR ARM OR AARCH64) # MSVS 2015/2017 on x86 and ARM - ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4702) # 'unreachable code' - endif() -endif() - -file(GLOB gapi_ext_hdrs - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/*.h" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cpu/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/fluid/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/gpu/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/infer/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/oak/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/ocl/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/own/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/plaidml/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/python/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/render/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/s11n/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/streaming/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/streaming/gstreamer/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/streaming/onevpl/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/plaidml/*.hpp" - "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/util/*.hpp" - ) - -set(gapi_srcs - # Front-end part - src/api/grunarg.cpp - src/api/gorigin.cpp - src/api/gmat.cpp - src/api/garray.cpp - src/api/gopaque.cpp - src/api/gscalar.cpp - src/api/gframe.cpp - src/api/gkernel.cpp - src/api/gbackend.cpp - src/api/gcommon.cpp - src/api/gproto.cpp - src/api/gnode.cpp - src/api/gcall.cpp - src/api/gcomputation.cpp - src/api/operators.cpp - src/api/kernels_core.cpp - src/api/kernels_imgproc.cpp - src/api/kernels_video.cpp - src/api/kernels_nnparsers.cpp - src/api/kernels_ot.cpp - src/api/kernels_streaming.cpp - src/api/kernels_stereo.cpp - src/api/render.cpp - src/api/render_ocv.cpp - src/api/ginfer.cpp - src/api/media.cpp - src/api/rmat.cpp - - # Compiler part - src/compiler/gmodel.cpp - src/compiler/gmodelbuilder.cpp - src/compiler/gislandmodel.cpp - src/compiler/gcompiler.cpp - src/compiler/gcompiled.cpp - src/compiler/gstreaming.cpp - src/compiler/passes/helpers.cpp - src/compiler/passes/dump_dot.cpp - src/compiler/passes/islands.cpp - src/compiler/passes/meta.cpp - src/compiler/passes/kernels.cpp - src/compiler/passes/exec.cpp - src/compiler/passes/transformations.cpp - src/compiler/passes/pattern_matching.cpp - src/compiler/passes/perform_substitution.cpp - src/compiler/passes/streaming.cpp - src/compiler/passes/intrin.cpp - - # Executor - src/executor/gabstractexecutor.cpp - src/executor/gabstractstreamingexecutor.cpp - src/executor/gexecutor.cpp - src/executor/gtbbexecutor.cpp - src/executor/gthreadedexecutor.cpp - src/executor/gstreamingexecutor.cpp - src/executor/gasync.cpp - src/executor/thread_pool.cpp - - # CPU Backend (currently built-in) - src/backends/cpu/gcpubackend.cpp - src/backends/cpu/gcpukernel.cpp - src/backends/cpu/gcpuimgproc.cpp - src/backends/cpu/gcpustereo.cpp - src/backends/cpu/gcpuvideo.cpp - src/backends/cpu/gcpucore.cpp - src/backends/cpu/gcpuot.cpp - src/backends/cpu/gnnparsers.cpp - - # Fluid Backend (also built-in, FIXME:move away) - src/backends/fluid/gfluidbuffer.cpp - src/backends/fluid/gfluidbackend.cpp - src/backends/fluid/gfluidimgproc.cpp - src/backends/fluid/gfluidimgproc_func.dispatch.cpp - src/backends/fluid/gfluidcore.cpp - src/backends/fluid/gfluidcore_func.dispatch.cpp - - # OAK Backend (optional) - src/backends/oak/goak.cpp - src/backends/oak/goakbackend.cpp - src/backends/oak/goak_memory_adapters.cpp - - # OCL Backend (currently built-in) - src/backends/ocl/goclbackend.cpp - src/backends/ocl/goclkernel.cpp - src/backends/ocl/goclimgproc.cpp - src/backends/ocl/goclcore.cpp - - # IE Backend. FIXME: should be included by CMake - # if and only if IE support is enabled - src/backends/ie/giebackend.cpp - src/backends/ie/giebackend/giewrapper.cpp - - # OV Backend. FIXME: should be included by CMake - # if and only if OV support is enabled - src/backends/ov/govbackend.cpp - - # ONNX backend - src/backends/onnx/gonnxbackend.cpp - src/backends/onnx/dml_ep.cpp - src/backends/onnx/coreml_ep.cpp - - # Render backend - src/backends/render/grenderocv.cpp - src/backends/render/ft_render.cpp - - # PlaidML Backend - src/backends/plaidml/gplaidmlcore.cpp - src/backends/plaidml/gplaidmlbackend.cpp - - # Common backend code - src/backends/common/gmetabackend.cpp - src/backends/common/gcompoundbackend.cpp - src/backends/common/gcompoundkernel.cpp - - # Serialization API and routines - src/api/s11n.cpp - src/backends/common/serialization.cpp - - # Streaming backend - src/backends/streaming/gstreamingbackend.cpp - - # Python bridge - src/backends/ie/bindings_ie.cpp - src/backends/onnx/bindings_onnx.cpp - src/backends/ov/bindings_ov.cpp - src/backends/python/gpythonbackend.cpp - - # Queue Streaming source - src/streaming/queue_source.cpp - - # OpenVPL Streaming source - src/streaming/onevpl/source.cpp - src/streaming/onevpl/source_priv.cpp - src/streaming/onevpl/file_data_provider.cpp - src/streaming/onevpl/cfg_params.cpp - src/streaming/onevpl/cfg_params_parser.cpp - src/streaming/onevpl/utils.cpp - src/streaming/onevpl/default.cpp - src/streaming/onevpl/data_provider_interface_exception.cpp - src/streaming/onevpl/accelerators/surface/base_frame_adapter.cpp - src/streaming/onevpl/accelerators/surface/cpu_frame_adapter.cpp - src/streaming/onevpl/accelerators/surface/dx11_frame_adapter.cpp - src/streaming/onevpl/accelerators/surface/surface.cpp - src/streaming/onevpl/accelerators/surface/surface_pool.cpp - src/streaming/onevpl/accelerators/utils/shared_lock.cpp - src/streaming/onevpl/accelerators/accel_policy_cpu.cpp - src/streaming/onevpl/accelerators/accel_policy_dx11.cpp - src/streaming/onevpl/accelerators/accel_policy_va_api.cpp - src/streaming/onevpl/accelerators/dx11_alloc_resource.cpp - src/streaming/onevpl/engine/engine_session.cpp - src/streaming/onevpl/engine/processing_engine_base.cpp - src/streaming/onevpl/engine/decode/decode_engine_legacy.cpp - src/streaming/onevpl/engine/decode/decode_session.cpp - src/streaming/onevpl/engine/transcode/transcode_engine_legacy.cpp - src/streaming/onevpl/engine/transcode/transcode_session.cpp - src/streaming/onevpl/engine/preproc/preproc_engine.cpp - src/streaming/onevpl/engine/preproc/preproc_session.cpp - src/streaming/onevpl/engine/preproc/preproc_dispatcher.cpp - src/streaming/onevpl/engine/preproc_engine_interface.cpp - src/streaming/onevpl/demux/async_mfp_demux_data_provider.cpp - src/streaming/onevpl/data_provider_dispatcher.cpp - - src/streaming/onevpl/cfg_param_device_selector.cpp - src/streaming/onevpl/device_selector_interface.cpp - - # GStreamer Streaming source - src/streaming/gstreamer/gstreamer_pipeline_facade.cpp - src/streaming/gstreamer/gstreamerpipeline.cpp - src/streaming/gstreamer/gstreamersource.cpp - src/streaming/gstreamer/gstreamer_buffer_utils.cpp - src/streaming/gstreamer/gstreamer_media_adapter.cpp - src/streaming/gstreamer/gstreamerenv.cpp - - # Utils (ITT tracing) - src/utils/itt.cpp - ) - -file(GLOB_RECURSE gapi_3rdparty_srcs - "${CMAKE_CURRENT_LIST_DIR}/src/3rdparty/vasot/src/*.cpp" -) - -ocv_add_dispatched_file(backends/fluid/gfluidimgproc_func SSE4_1 AVX2) -ocv_add_dispatched_file(backends/fluid/gfluidcore_func SSE4_1 AVX2) - -ocv_list_add_prefix(gapi_srcs "${CMAKE_CURRENT_LIST_DIR}/") - -# For IDE users -ocv_source_group("Src" FILES ${gapi_srcs} ${gapi_3rdparty_srcs}) -ocv_source_group("Include" FILES ${gapi_ext_hdrs}) - -ocv_set_module_sources(HEADERS ${gapi_ext_hdrs} SOURCES ${gapi_srcs} ${gapi_3rdparty_srcs}) -ocv_module_include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - -# VAS Object Tracking includes -ocv_module_include_directories(${CMAKE_CURRENT_LIST_DIR}/src/3rdparty/vasot/include) - -ocv_create_module() - -ocv_target_link_libraries(${the_module} PRIVATE ade) - -if(TARGET ocv.3rdparty.openvino AND OPENCV_GAPI_WITH_OPENVINO) - ocv_target_link_libraries(${the_module} PRIVATE ocv.3rdparty.openvino) - ocv_install_used_external_targets(ocv.3rdparty.openvino) -endif() - -if(HAVE_TBB) - ocv_target_link_libraries(${the_module} PRIVATE tbb) -endif() - -# TODO: Consider support of ITT in G-API standalone mode. -if(CV_TRACE AND HAVE_ITT) - ocv_target_compile_definitions(${the_module} PRIVATE -DOPENCV_WITH_ITT=1) - ocv_module_include_directories(${ITT_INCLUDE_DIRS}) - ocv_target_link_libraries(${the_module} PRIVATE ${ITT_LIBRARIES}) -endif() - -set(__test_extra_deps "") -if(TARGET ocv.3rdparty.openvino AND OPENCV_GAPI_WITH_OPENVINO) - list(APPEND __test_extra_deps ocv.3rdparty.openvino) -endif() -ocv_add_accuracy_tests(${__test_extra_deps}) - -# FIXME: test binary is linked with ADE directly since ADE symbols -# are not exported from libopencv_gapi.so in any form - thus -# there're two copies of ADE code in memory when tests run (!) -# src/ is specified to include dirs for INTERNAL tests only. -if(TARGET opencv_test_gapi) - target_include_directories(opencv_test_gapi PRIVATE "${CMAKE_CURRENT_LIST_DIR}/src") - target_link_libraries(opencv_test_gapi PRIVATE ade) -endif() - -if(HAVE_TBB AND TARGET opencv_test_gapi) - ocv_target_link_libraries(opencv_test_gapi PRIVATE tbb) -endif() - -if(HAVE_FREETYPE) - ocv_target_compile_definitions(${the_module} PRIVATE -DHAVE_FREETYPE) - if(TARGET opencv_test_gapi) - ocv_target_compile_definitions(opencv_test_gapi PRIVATE -DHAVE_FREETYPE) - endif() - ocv_target_link_libraries(${the_module} PRIVATE ${FREETYPE_LIBRARIES}) - ocv_target_include_directories(${the_module} PRIVATE ${FREETYPE_INCLUDE_DIRS}) -endif() - -if(HAVE_OAK) - ocv_target_compile_definitions(${the_module} PRIVATE -DHAVE_OAK) - if(TARGET opencv_test_gapi) - ocv_target_compile_definitions(opencv_test_gapi PRIVATE -DHAVE_OAK) - endif() - ocv_target_link_libraries(${the_module} PRIVATE depthai::core) -endif() - -if(HAVE_PLAIDML) - ocv_target_compile_definitions(${the_module} PRIVATE -DHAVE_PLAIDML) - if(TARGET opencv_test_gapi) - ocv_target_compile_definitions(opencv_test_gapi PRIVATE -DHAVE_PLAIDML) - endif() - ocv_target_link_libraries(${the_module} PRIVATE ${PLAIDML_LIBRARIES}) - ocv_target_include_directories(${the_module} SYSTEM PRIVATE ${PLAIDML_INCLUDE_DIRS}) -endif() - -if(HAVE_GAPI_ONEVPL) - if(TARGET opencv_test_gapi) - ocv_target_compile_definitions(opencv_test_gapi PRIVATE -DHAVE_ONEVPL) - ocv_target_link_libraries(opencv_test_gapi PRIVATE ${VPL_IMPORTED_TARGETS}) - if(MSVC) - target_compile_options(opencv_test_gapi PUBLIC "/wd4201") - endif() - if(HAVE_D3D11 AND HAVE_OPENCL) - ocv_target_include_directories(opencv_test_gapi SYSTEM PRIVATE ${OPENCL_INCLUDE_DIRS}) - endif() - endif() - - ocv_target_compile_definitions(${the_module} PRIVATE -DHAVE_ONEVPL) - ocv_target_link_libraries(${the_module} PRIVATE ${VPL_IMPORTED_TARGETS}) - - if(HAVE_DIRECTX AND HAVE_D3D11) - ocv_target_link_libraries(${the_module} PRIVATE d3d11 dxgi) - endif() - if(WIN32) - ocv_target_link_libraries(${the_module} PRIVATE mf mfuuid mfplat shlwapi mfreadwrite) - endif() - if(HAVE_D3D11 AND HAVE_OPENCL) - ocv_target_include_directories(${the_module} SYSTEM PRIVATE ${OPENCL_INCLUDE_DIRS}) - endif() - - if(UNIX AND HAVE_VA) - ocv_target_include_directories(${the_module} SYSTEM PRIVATE ${VA_INCLUDE_DIR}) - ocv_target_link_libraries(${the_module} PRIVATE ${VA_LIBRARIES}) - if(TARGET opencv_test_gapi) - ocv_target_include_directories(opencv_test_gapi SYSTEM PRIVATE ${VA_INCLUDE_DIR}) - ocv_target_link_libraries(opencv_test_gapi PRIVATE ${VA_LIBRARIES}) - endif() - endif() -endif() - -ocv_option(OPENCV_GAPI_GSTREAMER "Build G-API with GStreamer support" HAVE_GSTREAMER) -if(HAVE_GSTREAMER AND OPENCV_GAPI_GSTREAMER) - if(TARGET opencv_test_gapi) - ocv_target_compile_definitions(opencv_test_gapi PRIVATE -DHAVE_GSTREAMER) - ocv_target_link_libraries(opencv_test_gapi PRIVATE ocv.3rdparty.gstreamer) - endif() - ocv_target_compile_definitions(${the_module} PRIVATE -DHAVE_GSTREAMER) - ocv_target_link_libraries(${the_module} PRIVATE ocv.3rdparty.gstreamer) -endif() - -if(WIN32) - # Required for htonl/ntohl on Windows - ocv_target_link_libraries(${the_module} PRIVATE wsock32 ws2_32) -endif() - -if(HAVE_DIRECTML) - ocv_target_compile_definitions(${the_module} PRIVATE HAVE_DIRECTML=1) -endif() - -if(HAVE_ONNX) - ocv_target_link_libraries(${the_module} PRIVATE ${ONNX_LIBRARY}) - ocv_target_compile_definitions(${the_module} PRIVATE HAVE_ONNX=1) - if(HAVE_ONNX_DML) - ocv_target_compile_definitions(${the_module} PRIVATE HAVE_ONNX_DML=1) - endif() - if(TARGET opencv_test_gapi) - ocv_target_compile_definitions(opencv_test_gapi PRIVATE HAVE_ONNX=1) - ocv_target_link_libraries(opencv_test_gapi PRIVATE ${ONNX_LIBRARY}) - endif() -endif() - -ocv_install_3rdparty_licenses(vasot "${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/vasot/LICENSE.txt") - -ocv_add_perf_tests() -ocv_add_samples() - -# Required for sample with inference on host -if(TARGET example_gapi_onevpl_infer_with_advanced_device_selection) - if(TARGET ocv.3rdparty.openvino AND OPENCV_GAPI_WITH_OPENVINO) - ocv_target_link_libraries(example_gapi_onevpl_infer_with_advanced_device_selection PRIVATE ocv.3rdparty.openvino) - endif() - if(HAVE_DIRECTX AND HAVE_D3D11) - ocv_target_link_libraries(example_gapi_onevpl_infer_with_advanced_device_selection PRIVATE d3d11 dxgi) - endif() - if(HAVE_D3D11 AND HAVE_OPENCL) - ocv_target_include_directories(example_gapi_onevpl_infer_with_advanced_device_selection SYSTEM PRIVATE ${OPENCL_INCLUDE_DIRS}) - endif() - if(UNIX AND HAVE_VA) - message(STATUS "GAPI VPL samples with VAAPI") - ocv_target_include_directories(example_gapi_onevpl_infer_with_advanced_device_selection SYSTEM PRIVATE ${VA_INCLUDE_DIR}) - ocv_target_link_libraries(example_gapi_onevpl_infer_with_advanced_device_selection PRIVATE ${VA_LIBRARIES}) - endif() -endif() - -if(TARGET example_gapi_pipeline_modeling_tool) - if(WIN32) - ocv_target_link_libraries(example_gapi_pipeline_modeling_tool winmm.lib) - endif() -endif() - -# perf test dependencies postprocessing -if(HAVE_GAPI_ONEVPL) - # NB: TARGET opencv_perf_gapi doesn't exist before `ocv_add_perf_tests` - # src/ is specified to include dirs for INTERNAL tests only. - if(TARGET opencv_perf_gapi) - target_include_directories(opencv_perf_gapi PRIVATE "${CMAKE_CURRENT_LIST_DIR}/src") - ocv_target_compile_definitions(opencv_perf_gapi PRIVATE -DHAVE_ONEVPL) - ocv_target_link_libraries(opencv_perf_gapi PRIVATE ${VPL_IMPORTED_TARGETS}) - if(HAVE_D3D11 AND HAVE_OPENCL) - ocv_target_include_directories(opencv_perf_gapi SYSTEM PRIVATE ${OPENCL_INCLUDE_DIRS}) - endif() - endif() -endif() diff --git a/modules/gapi/cmake/DownloadADE.cmake b/modules/gapi/cmake/DownloadADE.cmake deleted file mode 100644 index 8ddaadb511..0000000000 --- a/modules/gapi/cmake/DownloadADE.cmake +++ /dev/null @@ -1,51 +0,0 @@ -set(ade_src_dir "${OpenCV_BINARY_DIR}/3rdparty/ade") -set(ade_filename "v0.1.2e.zip") -set(ade_subdir "ade-0.1.2e") -set(ade_md5 "962ce79e0b95591f226431f7b5f152cd") -ocv_download(FILENAME ${ade_filename} - HASH ${ade_md5} - URL - "${OPENCV_ADE_URL}" - "$ENV{OPENCV_ADE_URL}" - "https://github.com/opencv/ade/archive/" - DESTINATION_DIR ${ade_src_dir} - ID ADE - STATUS res - UNPACK RELATIVE_URL) - -if (NOT res) - return() -endif() - -set(ADE_root "${ade_src_dir}/${ade_subdir}/sources/ade") -file(GLOB_RECURSE ADE_sources "${ADE_root}/source/*.cpp") -file(GLOB_RECURSE ADE_include "${ADE_root}/include/ade/*.hpp") -add_library(ade STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} - ${ADE_include} - ${ADE_sources} -) - -# https://github.com/opencv/ade/issues/32 -if(CV_CLANG AND CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.1) - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wdeprecated-copy) -endif() - -target_include_directories(ade PUBLIC $) -set_target_properties(ade PROPERTIES - POSITION_INDEPENDENT_CODE True - OUTPUT_NAME ade - DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" - COMPILE_PDB_NAME ade - COMPILE_PDB_NAME_DEBUG "ade${OPENCV_DEBUG_POSTFIX}" - ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} -) - -if(ENABLE_SOLUTION_FOLDERS) - set_target_properties(ade PROPERTIES FOLDER "3rdparty") -endif() - -if(NOT BUILD_SHARED_LIBS) - ocv_install_target(ade EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL) -endif() - -ocv_install_3rdparty_licenses(ade "${ade_src_dir}/${ade_subdir}/LICENSE") diff --git a/modules/gapi/cmake/init.cmake b/modules/gapi/cmake/init.cmake deleted file mode 100644 index dd4b0bccfa..0000000000 --- a/modules/gapi/cmake/init.cmake +++ /dev/null @@ -1,49 +0,0 @@ -OCV_OPTION(WITH_ADE "Enable ADE framework (required for Graph API module)" ON) - -OCV_OPTION(WITH_FREETYPE "Enable FreeType framework" OFF) -OCV_OPTION(WITH_PLAIDML "Include PlaidML2 support" OFF) -OCV_OPTION(WITH_OAK "Include OpenCV AI Kit support" OFF) - -if(NOT WITH_ADE) - return() -endif() - -if(ade_DIR) - # if ade_DIR is set, use ADE-supplied CMake script - # to set up variables to the prebuilt ADE - find_package(ade 0.1.0) -endif() - -if(NOT TARGET ade) - # if ade_DIR is not set, try to use automatically - # downloaded one (if there any) - include("${CMAKE_CURRENT_LIST_DIR}/DownloadADE.cmake") -endif() - -if(WITH_FREETYPE) - ocv_check_modules(FREETYPE freetype2) - if (FREETYPE_FOUND) - set(HAVE_FREETYPE TRUE) - endif() -endif() - -if(WITH_PLAIDML) - find_package(PlaidML2 CONFIG QUIET) - if (PLAIDML_FOUND) - set(HAVE_PLAIDML TRUE) - endif() -endif() - -if(WITH_GAPI_ONEVPL) - find_package(VPL) - if(VPL_FOUND) - set(HAVE_GAPI_ONEVPL TRUE) - endif() -endif() - -if(WITH_OAK) - find_package(depthai QUIET) - if(depthai_FOUND) - set(HAVE_OAK TRUE) - endif() -endif() diff --git a/modules/gapi/cmake/standalone.cmake b/modules/gapi/cmake/standalone.cmake deleted file mode 100644 index f81c1c8a85..0000000000 --- a/modules/gapi/cmake/standalone.cmake +++ /dev/null @@ -1,62 +0,0 @@ -if("${CMAKE_BUILD_TYPE}" STREQUAL "") - set(CMAKE_BUILD_TYPE "Release") -endif() - -if (NOT TARGET ade ) - find_package(ade 0.1.0 REQUIRED) -endif() - -if (WITH_GAPI_ONEVPL) - find_package(VPL) - if(VPL_FOUND) - set(HAVE_GAPI_ONEVPL TRUE) - endif() -endif() - -set(FLUID_TARGET fluid) -set(FLUID_ROOT "${CMAKE_CURRENT_LIST_DIR}/../") - -file(GLOB FLUID_includes "${FLUID_ROOT}/include/opencv2/*.hpp" - "${FLUID_ROOT}/include/opencv2/gapi/g*.hpp" - "${FLUID_ROOT}/include/opencv2/gapi/util/*.hpp" - "${FLUID_ROOT}/include/opencv2/gapi/own/*.hpp" - "${FLUID_ROOT}/include/opencv2/gapi/fluid/*.hpp") -file(GLOB FLUID_sources "${FLUID_ROOT}/src/api/g*.cpp" - "${FLUID_ROOT}/src/api/rmat.cpp" - "${FLUID_ROOT}/src/api/media.cpp" - "${FLUID_ROOT}/src/compiler/*.cpp" - "${FLUID_ROOT}/src/compiler/passes/*.cpp" - "${FLUID_ROOT}/src/executor/*.cpp" - "${FLUID_ROOT}/src/backends/fluid/*.cpp" - "${FLUID_ROOT}/src/backends/streaming/*.cpp" - "${FLUID_ROOT}/src/backends/common/*.cpp") - -add_library(${FLUID_TARGET} STATIC ${FLUID_includes} ${FLUID_sources}) - -target_include_directories(${FLUID_TARGET} - PUBLIC $ - PRIVATE ${FLUID_ROOT}/src) - -target_compile_definitions(${FLUID_TARGET} PUBLIC GAPI_STANDALONE -# This preprocessor definition resolves symbol clash when -# standalone fluid meets gapi ocv module in one application - PUBLIC cv=fluidcv) - -set_target_properties(${FLUID_TARGET} PROPERTIES POSITION_INDEPENDENT_CODE True) -set_property(TARGET ${FLUID_TARGET} PROPERTY CXX_STANDARD 11) - -if(MSVC) - target_compile_options(${FLUID_TARGET} PUBLIC "/wd4251") - target_compile_options(${FLUID_TARGET} PUBLIC "/wd4275") - target_compile_definitions(${FLUID_TARGET} PRIVATE _CRT_SECURE_NO_DEPRECATE) - # Disable obsollete warning C4503 popping up on MSVC <<2017 - # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4503?view=vs-2019 - set_target_properties(${FLUID_TARGET} PROPERTIES COMPILE_FLAGS "/wd4503") -endif() - -target_link_libraries(${FLUID_TARGET} PRIVATE ade) - -if(WIN32) - # Required for htonl/ntohl on Windows - target_link_libraries(${FLUID_TARGET} PRIVATE wsock32 ws2_32) -endif() diff --git a/modules/gapi/doc/00-root.markdown b/modules/gapi/doc/00-root.markdown deleted file mode 100644 index cb99495c1b..0000000000 --- a/modules/gapi/doc/00-root.markdown +++ /dev/null @@ -1,125 +0,0 @@ -# Graph API {#gapi} - -# Introduction {#gapi_root_intro} - -OpenCV Graph API (or G-API) is a new OpenCV module targeted to make -regular image processing fast and portable. These two goals are -achieved by introducing a new graph-based model of execution. - -G-API is a special module in OpenCV -- in contrast with the majority -of other main modules, this one acts as a framework rather than some -specific CV algorithm. G-API provides means to define CV operations, -construct graphs (in form of expressions) using it, and finally -implement and run the operations for a particular backend. - -@note G-API is a new module and now is in active development. It's API -is volatile at the moment and there may be minor but -compatibility-breaking changes in the future. - -# Contents - -G-API documentation is organized into the following chapters: - -- @subpage gapi_purposes - - The motivation behind G-API and its goals. - -- @subpage gapi_hld - - General overview of G-API architecture and its major internal - components. - -- @subpage gapi_kernel_api - - Learn how to introduce new operations in G-API and implement it for - various backends. - -- @subpage gapi_impl - - Low-level implementation details of G-API, for those who want to - contribute. - -- API Reference: functions and classes - - - @subpage gapi_ref - - Core G-API classes, data types, backends, etc. - - - @subpage gapi_core - - Core G-API operations - arithmetic, boolean, and other matrix - operations; - - - @subpage gapi_imgproc - - Image processing functions: color space conversions, various - filters, etc. - - - @subpage gapi_video - - Video processing functionality. - - - @subpage gapi_draw - - Drawing and composition functionality - -# API Example {#gapi_example} - -A very basic example of G-API pipeline is shown below: - -@include modules/gapi/samples/api_example.cpp - - - -G-API is a separate OpenCV module so its header files have to be -included explicitly. The first four lines of `main()` create and -initialize OpenCV's standard video capture object, which fetches -video frames from either an attached camera or a specified file. - -G-API pipeline is constructed next. In fact, it is a series of G-API -operation calls on cv::GMat data. The important aspect of G-API is -that this code block is just a declaration of actions, but not the -actions themselves. No processing happens at this point, G-API only -tracks which operations form pipeline and how it is connected. G-API -_Data objects_ (here it is cv::GMat) are used to connect operations -each other. `in` is an _empty_ cv::GMat signalling that it is a -beginning of computation. - -After G-API code is written, it is captured into a call graph with -instantiation of cv::GComputation object. This object takes -input/output data references (in this example, `in` and `out` -cv::GMat objects, respectively) as parameters and reconstructs the -call graph based on all the data flow between `in` and `out`. - -cv::GComputation is a thin object in sense that it just captures which -operations form up a computation. However, it can be used to execute -computations -- in the following processing loop, every captured frame (a -cv::Mat `input_frame`) is passed to cv::GComputation::apply(). - -![Example pipeline running on sample video 'vtest.avi'](pics/demo.jpg) - -cv::GComputation::apply() is a polimorphic method which accepts a -variadic number of arguments. Since this computation is defined on one -input, one output, a special overload of cv::GComputation::apply() is -used to pass input data and get output data. - -Internally, cv::GComputation::apply() compiles the captured graph for -the given input parameters and executes the compiled graph on data -immediately. - -There is a number important concepts can be outlines with this example: -* Graph declaration and graph execution are distinct steps; -* Graph is built implicitly from a sequence of G-API expressions; -* G-API supports function-like calls -- e.g. cv::gapi::resize(), and - operators, e.g operator|() which is used to compute bitwise OR; -* G-API syntax aims to look pure: every operation call within a graph - yields a new result, thus forming a directed acyclic graph (DAG); -* Graph declaration is not bound to any data -- real data objects - (cv::Mat) come into picture after the graph is already declared. - - - -See [tutorials and porting examples](@ref tutorial_table_of_content_gapi) -to learn more on various G-API features and concepts. - - diff --git a/modules/gapi/doc/01-background.markdown b/modules/gapi/doc/01-background.markdown deleted file mode 100644 index 08014d1f67..0000000000 --- a/modules/gapi/doc/01-background.markdown +++ /dev/null @@ -1,76 +0,0 @@ -# Why Graph API? {#gapi_purposes} - -# Motivation behind G-API {#gapi_intro_why} - -G-API module brings graph-based model of execution to OpenCV. This -chapter briefly describes how this new model can help software -developers in two aspects: optimizing and porting image processing -algorithms. - -## Optimizing with Graph API {#gapi_intro_opt} - -Traditionally OpenCV provided a lot of stand-alone image processing -functions (see modules `core` and `imgproc`). Many of that functions -are well-optimized (e.g. vectorized for specific CPUs, parallel, etc) -but still the out-of-box optimization scope has been limited to a -single function only -- optimizing the whole algorithm built atop of that -functions was a responsibility of a programmer. - -OpenCV 3.0 introduced _Transparent API_ (or _T-API_) which allowed to -offload OpenCV function calls transparently to OpenCL devices and save -on Host/Device data transfers with cv::UMat -- and it was a great step -forward. However, T-API is a dynamic API -- user code still remains -unconstrained and OpenCL kernels are enqueued in arbitrary order, thus -eliminating further pipeline-level optimization potential. - -G-API brings implicit graph model to OpenCV 4.0. Graph model captures -all operations and its data dependencies in a pipeline and so provides -G-API framework with extra information to do pipeline-level -optimizations. - -The cornerstone of graph-based optimizations is _Tiling_. Tiling -allows to break the processing into smaller parts and reorganize -operations to enable data parallelism, improve data locality, and save -memory footprint. Data locality is an especially important aspect of -software optimization due to diffent costs of memory access on modern -computer architectures -- the more data is reused in the first level -cache, the more efficient pipeline is. - -Definitely the aforementioned techniques can be applied manually -- -but it requires extra skills and knowledge of the target platform and -the algorithm implementation changes irrevocably -- becoming more -specific, less flexible, and harder to extend and maintain. - -G-API takes this responsibility and complexity from user and does the -majority of the work by itself, keeping the algorithm code clean from -device or optimization details. This approach has its own limitations, -though, as graph model is a _constrained_ model and not every -algorithm can be represented as a graph, so the G-API scope is limited -only to regular image processing -- various filters, arithmetic, -binary operations, and well-defined geometrical transformations. - -## Porting with Graph API {#gapi_intro_port} - -The essence of G-API is declaring a sequence of operations to run, and -then executing that sequence. G-API is a constrained API, so it puts a -number of limitations on which operations can form a pipeline and -which data these operations may exchange each other. - -This formalization in fact helps to make an algorithm portable. G-API -clearly separates operation _interfaces_ from its _implementations_. - -One operation (_kernel_) may have multiple implementations even for a -single device (e.g., OpenCV-based "reference" implementation and a -tiled optimized implementation, both running on CPU). Graphs (or -_Computations_ in G-API terms) are built only using operation -interfaces, not implementations -- thus the same graph can be executed -on different devices (and, of course, using different optimization -techniques) with little-to-no changes in the graph itself. - -G-API supports plugins (_Backends_) which aggregate logic and -intelligence on what is the best way to execute on a particular -platform. Once a pipeline is built with G-API, it can be parametrized -to use either of the backends (or a combination of it) and so a graph -can be ported easily to a new platform. - -@sa @ref gapi_hld diff --git a/modules/gapi/doc/10-hld-overview.md b/modules/gapi/doc/10-hld-overview.md deleted file mode 100644 index 6de6efa921..0000000000 --- a/modules/gapi/doc/10-hld-overview.md +++ /dev/null @@ -1,160 +0,0 @@ -# High-level design overview {#gapi_hld} - -[TOC] - -# G-API High-level design overview - -G-API is a heterogeneous framework and provides an unified API to -program image processing pipelines with a number of supported -backends. - -The key design idea is to keep pipeline code itself platform-neutral -while specifying which kernels to use and which devices to utilize -using extra parameters at graph compile (configuration) time. This -requirement has led to the following architecture: - - - -![G-API framework architecture](pics/gapi_scheme.png) - -There are three layers in this architecture: -* **API Layer** -- this is the top layer, which implements G-API - public interface, its building blocks and semantics. - When user constructs a pipeline with G-API, he interacts with this - layer directly, and the entities the user operates on (like cv::GMat - or cv::GComputation) are provided by this layer. -* **Graph Compiler Layer** -- this is the intermediate layer which - unrolls user computation into a graph and then applies a number of - transformations to it (e.g. optimizations). This layer is built atop - of [ADE Framework](@ref gapi_detail_ade). -* **Backends Layer** -- this is the lowest level layer, which lists a - number of _Backends_. In contrast with the above two layers, - backends are highly coupled with low-level platform details, with - every backend standing for every platform. A backend operates on a - processed graph (coming from the graph compiler) and executes this - graph optimally for a specific platform or device. - -# API layer {#gapi_api_layer} - -API layer is what user interacts with when defining and using a -pipeline (a Computation in G-API terms). API layer defines a set of -G-API _dynamic_ objects which can be used as inputs, outputs, and -intermediate data objects within a graph: -* cv::GMat -* cv::GScalar -* cv::GArray (template class) - -API layer specifies a list of Operations which are defined on these -data objects -- so called kernels. See G-API [core](@ref gapi_core) -and [imgproc](@ref gapi_imgproc) namespaces for details on which -operations G-API provides by default. - -G-API is not limited to these operations only -- users can define -their own kernels easily using a special macro G_TYPED_KERNEL(). - -API layer is also responsible for marshalling and storing operation -parameters on pipeline creation. In addition to the aforementioned -G-API dynamic objects, operations may also accept arbitrary -parameters (more on this [here](@ref gapi_detail_params)), so API -layer captures its values and stores internally upon the moment of -execution. - -Finally, cv::GComputation and cv::GCompiled are the remaining -important components of API layer. The former wraps a series of G-API -expressions into an object (graph), and the latter is a product of -graph _compilation_ (see [this chapter](@ref gapi_detail_compiler) for -details). - -# Graph compiler layer {#gapi_compiler} - -Every G-API computation is compiled before it executes. Compilation -process is triggered in two ways: -* _implicitly_, when cv::GComputation::apply() is used. In this case, - graph compilation is then immediately followed by execution. -* _explicitly_, when cv::GComputation::compile() is used. In this case, - a cv::GCompiled object is returned which then can be invoked as a - C++ functor. - -The first way is recommended for cases when input data format is not -known in advance -- e.g. when it comes from an arbitrary input file. -The second way is recommended for deployment (production) scenarios -where input data characteristics are usually predefined. - -Graph compilation process is built atop of ADE Framework. Initially, a -bipartite graph is generated from expressions captured by API layer. -This graph contains nodes of two types: _Data_ and _Operations_. Graph -always starts and ends with a Data node(s), with Operations nodes -in-between. Every Operation node has inputs and outputs, both are Data -nodes. - -After the initial graph is generated, it is actually processed by a -number of graph transformations, called _passes_. ADE Framework acts -as a compiler pass management engine, and passes are written -specifically for G-API. - -There are different passes which check graph validity, refine details -on operations and data, organize nodes into clusters ("Islands") based -on affinity or user-specified regioning[TBD], and more. Backends also -are able to inject backend-specific passes into the compilation -process, see more on this in the [dedicated chapter](@ref gapi_detail_meta). - -Result of graph compilation is a compiled object, represented by class -cv::GCompiled. A new cv::GCompiled object is always created regardless -if there was an explicit or implicit compilation request (see -above). Actual graph execution happens within cv::GCompiled and is -determined by backends which participated in the graph compilation. - -@sa cv::GComputation::apply(), cv::GComputation::compile(), cv::GCompiled - -# Backends layer {#gapi_backends} - -The above diagram lists two backends, _OpenCV_ and _Fluid_. _OpenCV_ -is so-called "reference backend", which implements G-API operations -using plain old OpenCV functions. This backend is useful for -prototyping on a familiar development system. _Fluid_ is a plugin for -cache-efficient execution on CPU -- it implements a different -execution policy and operates with its own, special kernels. Fluid -backend allows to achieve less memory footprint and better memory -locality when running on CPU. - -There may be more backends available, e.g. Halide, OpenCL, etc. -- -G-API provides an uniform internal API to develop backends so any -enthusiast or a company are free to scale G-API on a new platform or -accelerator. In terms of OpenCV infrastructure, every new backend is a -new distinct OpenCV module, which extends G-API when build as a part -of OpenCV. - -# Graph execution {#gapi_compiled} - -The way graph executed is defined by backends selected for -compilation. In fact, every backend builds its own execution script as -the final stage of graph compilation process, when an executable -(compiled) object is being generated. For example, in OpenCV backend, -this script is just a topologically-sorted sequence of OpenCV -functions to call; for Fluid backend, it is a similar thing -- a -topologically sorted list of _Agents_ processing lines of input on -every iteration. - -Graph execution is triggered in two ways: -* via cv::GComputation::apply(), with graph compiled in-place exactly - for the given input data; -* via cv::GCompiled::operator()(), when the graph has been precompiled. - -Both methods are polimorphic and take a variadic number of arguments, -with validity checks performed in runtime. If a number, shapes, and -formats of passed data objects differ from expected, a runtime -exception is thrown. G-API also provides _typed_ wrappers to move -these checks to the compile time -- see `cv::GComputationT<>`. - -G-API graph execution is declared stateless -- it means that a -compiled functor (cv::GCompiled) acts like a pure C++ function and -provides the same result for the same set of input arguments. - -Both execution methods take \f$N+M\f$ parameters, where \f$N\f$ is a -number of inputs, and \f$M\f$ is a number of outputs on which a -cv::GComputation is defined. Note that while G-API types (cv::GMat, -etc) are used in definition, the execution methods accept OpenCV's -traditional data types (like cv::Mat) which hold actual data -- see -table in [parameter marshalling](@ref gapi_detail_params). - -@sa @ref gapi_impl, @ref gapi_kernel_api diff --git a/modules/gapi/doc/20-kernel-api.markdown b/modules/gapi/doc/20-kernel-api.markdown deleted file mode 100644 index 9a7cf39f67..0000000000 --- a/modules/gapi/doc/20-kernel-api.markdown +++ /dev/null @@ -1,188 +0,0 @@ -# Kernel API {#gapi_kernel_api} - -[TOC] - -# G-API Kernel API - -The core idea behind G-API is portability -- a pipeline built with -G-API must be portable (or at least able to be portable). It means -that either it works out-of-the box when compiled for new platform, -_or_ G-API provides necessary tools to make it running there, with -little-to-no changes in the algorithm itself. - -This idea can be achieved by separating kernel interface from its -implementation. Once a pipeline is built using kernel interfaces, it -becomes implementation-neutral -- the implementation details -(i.e. which kernels to use) are passed on a separate stage (graph -compilation). - -Kernel-implementation hierarchy may look like: - -@dot Kernel API/implementation hierarchy example -digraph { - rankdir=BT; - node [shape=record]; - - ki_a [label="{ interface\nA}"]; - ki_b [label="{ interface\nB}"]; - - {rank=same; ki_a ki_b}; - - "CPU::A" -> ki_a [dir="forward"]; - "OpenCL::A" -> ki_a [dir="forward"]; - "Halide::A" -> ki_a [dir="forward"]; - - "CPU::B" -> ki_b [dir="forward"]; - "OpenCL::B" -> ki_b [dir="forward"]; - "Halide::B" -> ki_b [dir="forward"]; -} -@enddot - -A pipeline itself then can be expressed only in terms of `A`, `B`, and -so on, and choosing which implementation to use in execution becomes -an external parameter. - -# Defining a kernel {#gapi_defining_kernel} - -G-API provides a macro to define a new kernel interface -- -G_TYPED_KERNEL(): - -@snippet samples/cpp/tutorial_code/gapi/doc_snippets/kernel_api_snippets.cpp filter2d_api - -This macro is a shortcut to a new type definition. It takes three -arguments to register a new type, and requires type body to be present -(see [below](@ref gapi_kernel_supp_info)). The macro arguments are: -1. Kernel interface name -- also serves as a name of new type defined - with this macro; -2. Kernel signature -- an `std::function<>`-like signature which defines - API of the kernel; -3. Kernel's unique name -- used to identify kernel when its type - informattion is stripped within the system. - -Kernel declaration may be seen as function declaration -- in both cases -a new entity must be used then according to the way it was defined. - -Kernel signature defines kernel's usage syntax -- which parameters -it takes during graph construction. Implementations can also use this -signature to derive it into backend-specific callback signatures (see -next chapter). - -Kernel may accept values of any type, and G-API _dynamic_ types are -handled in a special way. All other types are opaque to G-API and -passed to kernel in `outMeta()` or in execution callbacks as-is. - -Kernel's return value can _only_ be of G-API dynamic type -- cv::GMat, -cv::GScalar, or `cv::GArray`. If an operation has more than one -output, it should be wrapped into an `std::tuple<>` (which can contain -only mentioned G-API types). Arbitrary-output-number operations are -not supported. - -Once a kernel is defined, it can be used in pipelines with special, -G-API-supplied method "::on()". This method has the same signature as -defined in kernel, so this code: - -@snippet samples/cpp/tutorial_code/gapi/doc_snippets/kernel_api_snippets.cpp filter2d_on - -is a perfectly legal construction. This example has some verbosity, -though, so usually a kernel declaration comes with a C++ function -wrapper ("factory method") which enables optional parameters, more -compact syntax, Doxygen comments, etc: - -@snippet samples/cpp/tutorial_code/gapi/doc_snippets/kernel_api_snippets.cpp filter2d_wrap - -so now it can be used like: - -@snippet samples/cpp/tutorial_code/gapi/doc_snippets/kernel_api_snippets.cpp filter2d_wrap_call - -# Extra information {#gapi_kernel_supp_info} - -In the current version, kernel declaration body (everything within the -curly braces) must contain a static function `outMeta()`. This function -establishes a functional dependency between operation's input and -output metadata. - -_Metadata_ is an information about data kernel operates on. Since -non-G-API types are opaque to G-API, G-API cares only about `G*` data -descriptors (i.e. dimensions and format of cv::GMat, etc). - -`outMeta()` is also an example of how kernel's signature can be -transformed into a derived callback -- note that in this example, -`outMeta()` signature exactly follows the kernel signature (defined -within the macro) but is different -- where kernel expects cv::GMat, -`outMeta()` takes and returns cv::GMatDesc (a G-API structure metadata -for cv::GMat). - -The point of `outMeta()` is to propagate metadata information within -computation from inputs to outputs and infer metadata of internal -(intermediate, temporary) data objects. This information is required -for further pipeline optimizations, memory allocation, and other -operations done by G-API framework during graph compilation. - - - -# Implementing a kernel {#gapi_kernel_implementing} - -Once a kernel is declared, its interface can be used to implement -versions of this kernel in different backends. This concept is -naturally projected from object-oriented programming -"Interface/Implementation" idiom: an interface can be implemented -multiple times, and different implementations of a kernel should be -substitutable with each other without breaking the algorithm -(pipeline) logic (Liskov Substitution Principle). - -Every backend defines its own way to implement a kernel interface. -This way is regular, though -- whatever plugin is, its kernel -implementation must be "derived" from a kernel interface type. - -Kernel implementation are then organized into _kernel -packages_. Kernel packages are passed to cv::GComputation::compile() -as compile arguments, with some hints to G-API on how to select proper -kernels (see more on this in "Heterogeneity"[TBD]). - -For example, the aforementioned `Filter2D` is implemented in -"reference" CPU (OpenCV) plugin this way (*NOTE* -- this is a -simplified form with improper border handling): - -@snippet samples/cpp/tutorial_code/gapi/doc_snippets/kernel_api_snippets.cpp filter2d_ocv - -Note how CPU (OpenCV) plugin has transformed the original kernel -signature: -- Input cv::GMat has been substituted with cv::Mat, holding actual input - data for the underlying OpenCV function call; -- Output cv::GMat has been transformed into extra output parameter, thus - `GCPUFilter2D::run()` takes one argument more than the original - kernel signature. - -The basic intuition for kernel developer here is _not to care_ where -that cv::Mat objects come from instead of the original cv::GMat -- and -just follow the signature conventions defined by the plugin. G-API -will call this method during execution and supply all the necessary -information (and forward the original opaque data as-is). - -# Compound kernels {#gapi_kernel_compound} - -Sometimes kernel is a single thing only on API level. It is convenient -for users, but on a particular implementation side it would be better to -have multiple kernels (a subgraph) doing the thing instead. An example -is goodFeaturesToTrack() -- while in OpenCV backend it may remain a -single kernel, with Fluid it becomes compound -- Fluid can handle Harris -response calculation but can't do sparse non-maxima suppression and -point extraction to an STL vector: - - - -A compound kernel _implementation_ can be defined using a generic -macro GAPI_COMPOUND_KERNEL(): - -@snippet samples/cpp/tutorial_code/gapi/doc_snippets/kernel_api_snippets.cpp compound - - - - -It is important to distinguish a compound kernel from G-API high-order -function, i.e. a C++ function which looks like a kernel but in fact -generates a subgraph. The core difference is that a compound kernel is -an _implementation detail_ and a kernel implementation may be either -compound or not (depending on backend capabilities), while a -high-order function is a "macro" in terms of G-API and so cannot act as -an interface which then needs to be implemented by a backend. diff --git a/modules/gapi/doc/30-implementation.markdown b/modules/gapi/doc/30-implementation.markdown deleted file mode 100644 index cdb5df413b..0000000000 --- a/modules/gapi/doc/30-implementation.markdown +++ /dev/null @@ -1,29 +0,0 @@ -# Implementation details {#gapi_impl} - -[TOC] - -# G-API Implementation details - -@note this section is still in progress. - -# API layer {#gapi_detail_api} - -## Expression unrolling {#gapi_detail_expr} - -## Parameter marshalling {#gapi_detail_params} - -## Operations representation {#gapi_detail_operations} - -# Graph compiler {#gapi_detail_compiler} - -## ADE basics {#gapi_detail_ade} - -## Graph model representation {#gapi_detail_gmodel} - -## G-API metadata and passes {#gapi_detail_meta} - -# Backends {#gapi_detail_backends} - -## Backend scope of work {#gapi_backend_scope} - -## Graph transformation {#gapi_backend_pass} diff --git a/modules/gapi/doc/pics/demo.jpg b/modules/gapi/doc/pics/demo.jpg deleted file mode 100644 index 742d135f7a89e051cf505daa0b8ed265965bb821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65973 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

0af`4+vUW6$eSFHDg&n>>$ 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 KT$!wC(Ek94r|^~l diff --git a/modules/gapi/doc/pics/render_example.png b/modules/gapi/doc/pics/render_example.png deleted file mode 100644 index b2675988b3da13bf447fd30c1aced7721ff9c98f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4392 zcmeHLYfw{X8m8;4m?G7NU1^cR3WOxcZABJQFiYf?K)D1hP*^NQxrl&(Q>C;p?!-&R z1&V|KE_Y1Z-L)#P6=K=J24>MffyHsXfKV=}WweGyT49ZGpD*Wxg~Fem*&o}P{y3bI z^L^j@KJWWH@B4iRNkmwX`HNOBnwXfF3xfScCMGX@iRbz?Kf~X+Dvp(j$$E{z-*5NP z7ry!2FVo_8!|(j#{Y|HaS_14R>&td}Z0_~^eBYW=uih4J&V0yonzfz(v?e0JW@dac zVY8E5D*Bg2xk$);CJ}PwQoTQ32n!qWLe7iCi=n!Y@nSlBH(t!Lf8^7(Ubjmo54Y8#XsXTIvWWdQkg$u?*-!*i`}@5{)B;?K{vY3trJUsc$N@KxmxdrHTWG57^Z zOyNj@^}PKXU027r$cHxNo1Ri$Dh7`?w)n5X3$NQnar(}i?lWx?)xk|zK9=N_>D^+r zT5l6s$#Ftrs^SCgrdV6MCmF!krZ zyOh|nu`M1(u2`1e;a8r5S)ZrbQv+|V+vxaNb}#EMiS_vlOAw2`om$fIw&&Ve7pK3>ctN@%kUx{%^~uo7YN5X_Zd7$I-| ze)8I$PfnVb-D}@}0!!)^mNa9@0cwfI`4h+V{xqjl<|%Tz3Vu(jR7Xp4pL@BXvv z#P!UPEdxLtYD8QCw$kIMy!aq59>%=Hx4=mT<>WD(^e;F`<`o})iyCM}jJ5yY1KQ5- zCxdON&|A6@dZ01%6bzWsIT^-)z%VdWC$>}#GZQ$^%kiKPTMBv1f(TW!I7#(O7AM!C z!!K`_(oEfmLA$5f=T=diR-qbZ9Sq8u4&^s>I5tF%x-~==v$m>kvZ^D5%3&$bdE8W; z!SLX+nO16lep4Ta-%iWx&Kq674X5PY@32*sjv3Ez#qgWrqm|xj+Y0xSS~g2p-{F$D zlf11CPLHmNTHsXO`l86JVvR0(AMvyAK z1qe?ut63bVXcPx>c@EZCWoUi=p&$5c*+L`bhzLPezfp z0JEGMA}??nB30|~?Aj1X10hxd)BdYeMDm-YmN0r&95{cE+0VTQtf!e)a@;H!MJ?A> z6#rpRkx(|s$wJCVUXb6)i z@QbqGymG}E8Ig$VM1(s8;9WWsrOJmCy=8b<2M5)`a~C-p0IWfn6k=E59L5JZklX%J zbe{}bsVSao4?EIIRf=HF+rTAQDrWVa>j+W?AcQuM-gnMA|7!Gc&Qy_p%xDpUz zNl{vY+y}9gmIu)CT&eC|BZv{Ep>T)__N_uY9zUstD~@GF)SzFbflPI7`O-wJ!sd`A@Jagp4A;0Xblk$_04 zg+b$Xc!cAEFHjL@=&dacxpP|5pw5ctr6>--6QVvW!NCq(gn~ty2Wj_dh7{slRn{5z zlf?7}s^+xmh^3s4<#m*Q^pf%)GHA#^%@AM_(-6NQCO9UU!>u1q6)4IQs&VOFVmyX? zpjkrJ3_q^~0x+ipkarJlI)-Y~be}Wi2>lr8A|jy89-&AfEr@s{lRymdln)%Fy&egs zBz79VHRRN={0Lxdntjo=WqMr77SaAvm!%+Y2&?rHYi&jcBZb{nVk$mR1H+JIjM?2nS8V*Xc?D6B6PxgOm2gt=P z&<5k04Jg*?RwCh+vW@gNky{T-QkI$v< zwsm8%6OVeMWplde;)SD9dj3x{f6CJTN+DCFh1V^@owEmgLq>8!=yRk<^{KD+TIZC6 zEo;AD%gR*9>7yA}eb**$YOl82B4i|YfY~-OR7QVTG<71z z7vAL{oB0Z#Z@ZaKMq0aF+US!mR~|oXU!n`CJ^HpJ|55COEY46z9QonNW2SmmxKDGp z?-S?jUKd~L+wRJ@S64kh!>)~)sLhwPt7Rw$$$BC8{i9zVTN(hq`gSY>&z0+HmI0TF z^kK_D // G-API framework header -#include // cv::gapi::blur() -#include // cv::imread/imwrite - -int main(int argc, char *argv[]) { - if (argc < 3) return 1; - - cv::GMat in; // Express the graph: - cv::GMat out = cv::gapi::blur(in, cv::Size(3,3)); // `out` is a result of `blur` of `in` - - cv::Mat in_mat = cv::imread(argv[1]); // Get the real data - cv::Mat out_mat; // Output buffer (may be empty) - - cv::GComputation(cv::GIn(in), cv::GOut(out)) // Declare a graph from `in` to `out` - .apply(cv::gin(in_mat), cv::gout(out_mat)); // ...and run it immediately - - cv::imwrite(argv[2], out_mat); // Save the result - return 0; -} -#+END_SRC - -** The code is worth a thousand words - :PROPERTIES: - :BEAMER_opt: shrink=42 - :END: - -*** Traditional OpenCV :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.45 - :END: -#+BEGIN_SRC C++ -#include -#include - -#include - -int main(int argc, char *argv[]) { - using namespace cv; - if (argc != 3) return 1; - - Mat in_mat = imread(argv[1]); - Mat gx, gy; - - Sobel(in_mat, gx, CV_32F, 1, 0); - Sobel(in_mat, gy, CV_32F, 0, 1); - - Mat mag, out_mat; - sqrt(gx.mul(gx) + gy.mul(gy), mag); - mag.convertTo(out_mat, CV_8U); - - imwrite(argv[2], out_mat); - return 0; -} -#+END_SRC - -*** OpenCV G-API :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.5 - :END: -#+BEGIN_SRC C++ -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - using namespace cv; - if (argc != 3) return 1; - - GMat in; - GMat gx = gapi::Sobel(in, CV_32F, 1, 0); - GMat gy = gapi::Sobel(in, CV_32F, 0, 1); - GMat mag = gapi::sqrt( gapi::mul(gx, gx) - + gapi::mul(gy, gy)); - GMat out = gapi::convertTo(mag, CV_8U); - GComputation sobel(GIn(in), GOut(out)); - - Mat in_mat = imread(argv[1]), out_mat; - sobel.apply(in_mat, out_mat); - imwrite(argv[2], out_mat); - return 0; -} -#+END_SRC - -** The code is worth a thousand words (cont'd) -# FIXME: sections!!! - -*** What we have just learned? - -- G-API functions mimic their traditional OpenCV ancestors; -- No real data is required to construct a graph; -- Graph construction and graph execution are separate steps. - -*** What else? - -- Graph is first /expressed/ and then /captured/ in an object; -- Graph constructor defines /protocol/; user can pass vectors of - inputs/outputs like - #+BEGIN_SRC C++ -cv::GComputation(cv::GIn(...), cv::GOut(...)) - #+END_SRC -- Calls to ~.apply()~ must conform to graph's protocol - -** On data objects - -Graph *protocol* defines what arguments a computation was defined on -(both inputs and outputs), and what are the *shapes* (or types) of -those arguments: - - | *Shape* | *Argument* | Size | - |--------------+------------------+-----------------------------| - | ~GMat~ | ~Mat~ | Static; defined during | - | | | graph compilation | - |--------------+------------------+-----------------------------| - | ~GScalar~ | ~Scalar~ | 4 x ~double~ | - |--------------+------------------+-----------------------------| - | ~GArray~ | ~std::vector~ | Dynamic; defined in runtime | - |--------------+------------------+-----------------------------| - | ~GOpaque~ | ~T~ | Static, ~sizeof(T)~ | - -~GScalar~ may be value-initialized at construction time to allow - expressions like ~GMat a = 2*(b + 1)~. - -** On operations and kernels - :PROPERTIES: - :BEAMER_opt: shrink=22 - :END: - -*** :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.45 - :END: - -- Graphs are built with *Operations* over virtual *Data*; -- *Operations* define interfaces (literally); -- *Kernels* are implementations to *Operations* (like in OOP); -- An *Operation* is platform-agnostic, a *kernel* is not; -- *Kernels* are implemented for *Backends*, the latter provide - APIs to write kernels; -- Users can /add/ their *own* operations and kernels, - and also /redefine/ "standard" kernels their *own* way. - -*** :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.45 - :END: - -#+BEGIN_SRC dot :file "000-ops-kernels.eps" :cmdline "-Kdot -Teps" -digraph G { -node [shape=box]; -rankdir=BT; - -Gr [label="Graph"]; -Op [label="Operation\nA"]; -{rank=same -Impl1 [label="Kernel\nA:2"]; -Impl2 [label="Kernel\nA:1"]; -} - -Op -> Gr [dir=back, label="'consists of'"]; -Impl1 -> Op []; -Impl2 -> Op [label="'is implemented by'"]; - -node [shape=note,style=dashed]; -{rank=same -Op; -CommentOp [label="Abstract:\ndeclared via\nG_API_OP()"]; -} -{rank=same -Comment1 [label="Platform:\ndefined with\nOpenCL backend"]; -Comment2 [label="Platform:\ndefined with\nOpenCV backend"]; -} - -CommentOp -> Op [constraint=false, style=dashed, arrowhead=none]; -Comment1 -> Impl1 [style=dashed, arrowhead=none]; -Comment2 -> Impl2 [style=dashed, arrowhead=none]; -} -#+END_SRC - -** On operations and kernels (cont'd) - -*** Defining an operation - -- A type name (every operation is a C++ type); -- Operation signature (similar to ~std::function<>~); -- Operation identifier (a string); -- Metadata callback -- describe what is the output value format(s), - given the input and arguments. -- Use ~OpType::on(...)~ to use a new kernel ~OpType~ to construct graphs. - -#+LaTeX: {\footnotesize -#+BEGIN_SRC C++ -G_API_OP(GSqrt,,"org.opencv.core.math.sqrt") { - static GMatDesc outMeta(GMatDesc in) { return in; } -}; -#+END_SRC -#+LaTeX: } - -** On operations and kernels (cont'd) - -*** ~GSqrt~ vs. ~cv::gapi::sqrt()~ - -- How a *type* relates to a *functions* from the example? -- These functions are just wrappers over ~::on~: - #+LaTeX: {\scriptsize - #+BEGIN_SRC C++ - G_API_OP(GSqrt,,"org.opencv.core.math.sqrt") { - static GMatDesc outMeta(GMatDesc in) { return in; } - }; - GMat gapi::sqrt(const GMat& src) { return GSqrt::on(src); } - #+END_SRC - #+LaTeX: } -- Why -- Doxygen, default parameters, 1:n mapping: - #+LaTeX: {\scriptsize - #+BEGIN_SRC C++ - cv::GMat custom::unsharpMask(const cv::GMat &src, - const int sigma, - const float strength) { - cv::GMat blurred = cv::gapi::medianBlur(src, sigma); - cv::GMat laplacian = cv::gapi::Laplacian(blurred, CV_8U); - return (src - (laplacian * strength)); - } - #+END_SRC - #+LaTeX: } - -** On operations and kernels (cont'd) - -*** Implementing an operation - -- Depends on the backend and its API; -- Common part for all backends: refer to operation being implemented - using its /type/. - -*** OpenCV backend -- OpenCV backend is the default one: OpenCV kernel is a wrapped OpenCV - function: - #+LaTeX: {\footnotesize - #+BEGIN_SRC C++ - GAPI_OCV_KERNEL(GCPUSqrt, cv::gapi::core::GSqrt) { - static void run(const cv::Mat& in, cv::Mat &out) { - cv::sqrt(in, out); - } - }; - #+END_SRC - #+LaTeX: } - -** Operations and Kernels (cont'd) -# FIXME!!! - -*** Fluid backend - -- Fluid backend operates with row-by-row kernels and schedules its - execution to optimize data locality: - #+LaTeX: {\footnotesize - #+BEGIN_SRC C++ - GAPI_FLUID_KERNEL(GFluidSqrt, cv::gapi::core::GSqrt, false) { - static const int Window = 1; - static void run(const View &in, Buffer &out) { - hal::sqrt32f(in .InLine (0) - out.OutLine(0), - out.length()); - } - }; - #+END_SRC - #+LaTeX: } -- Note ~run~ changes signature but still is derived from the operation - signature. - -** Operations and Kernels (cont'd) - -*** Specifying which kernels to use - -- Graph execution model is defined by kernels which are available/used; -- Kernels can be specified via the graph compilation arguments: - #+LaTeX: {\footnotesize - #+BEGIN_SRC C++ - #include - #include - ... - auto pkg = cv::gapi::combine(cv::gapi::core::fluid::kernels(), - cv::gapi::imgproc::fluid::kernels()); - sobel.apply(in_mat, out_mat, cv::compile_args(pkg)); - #+END_SRC - #+LaTeX: } -- Users can combine kernels of different backends and G-API will partition - the execution among those automatically. - -** Heterogeneity in G-API - :PROPERTIES: - :BEAMER_opt: shrink=35 - :END: -*** Automatic subgraph partitioning in G-API -*** :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.18 - :END: - -#+BEGIN_SRC dot :file "010-hetero-init.eps" :cmdline "-Kdot -Teps" -digraph G { -rankdir=TB; -ranksep=0.3; - -node [shape=box margin=0 height=0.25]; -A; B; C; - -node [shape=ellipse]; -GMat0; -GMat1; -GMat2; -GMat3; - -GMat0 -> A -> GMat1 -> B -> GMat2; -GMat2 -> C; -GMat0 -> C -> GMat3 - -subgraph cluster {style=invis; A; GMat1; B; GMat2; C}; -} -#+END_SRC - -The initial graph: operations are not resolved yet. - -*** :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.18 - :END: - -#+BEGIN_SRC dot :file "011-hetero-homo.eps" :cmdline "-Kdot -Teps" -digraph G { -rankdir=TB; -ranksep=0.3; - -node [shape=box margin=0 height=0.25]; -A; B; C; - -node [shape=ellipse]; -GMat0; -GMat1; -GMat2; -GMat3; - -GMat0 -> A -> GMat1 -> B -> GMat2; -GMat2 -> C; -GMat0 -> C -> GMat3 - -subgraph cluster {style=filled;color=azure2; A; GMat1; B; GMat2; C}; -} -#+END_SRC - -All operations are handled by the same backend. - -*** :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.18 - :END: - -#+BEGIN_SRC dot :file "012-hetero-a.eps" :cmdline "-Kdot -Teps" -digraph G { -rankdir=TB; -ranksep=0.3; - -node [shape=box margin=0 height=0.25]; -A; B; C; - -node [shape=ellipse]; -GMat0; -GMat1; -GMat2; -GMat3; - -GMat0 -> A -> GMat1 -> B -> GMat2; -GMat2 -> C; -GMat0 -> C -> GMat3 - -subgraph cluster_1 {style=filled;color=azure2; A; GMat1; B; } -subgraph cluster_2 {style=filled;color=ivory2; C}; -} -#+END_SRC - -~A~ & ~B~ are of backend ~1~, ~C~ is of backend ~2~. - -*** :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.18 - :END: - -#+BEGIN_SRC dot :file "013-hetero-b.eps" :cmdline "-Kdot -Teps" -digraph G { -rankdir=TB; -ranksep=0.3; - -node [shape=box margin=0 height=0.25]; -A; B; C; - -node [shape=ellipse]; -GMat0; -GMat1; -GMat2; -GMat3; - -GMat0 -> A -> GMat1 -> B -> GMat2; -GMat2 -> C; -GMat0 -> C -> GMat3 - -subgraph cluster_1 {style=filled;color=azure2; A}; -subgraph cluster_2 {style=filled;color=ivory2; B}; -subgraph cluster_3 {style=filled;color=azure2; C}; -} -#+END_SRC - -~A~ & ~C~ are of backend ~1~, ~B~ is of backend ~2~. - -** Heterogeneity in G-API - -*** Heterogeneity summary - -- G-API automatically partitions its graph in subgraphs (called "islands") - based on the available kernels; -- Adjacent kernels taken from the same backend are "fused" into the same - "island"; -- G-API implements a two-level execution model: - - Islands are executed at the top level by a G-API's *Executor*; - - Island internals are run at the bottom level by its *Backend*; -- G-API fully delegates the low-level execution and memory management to backends. - -* Inference and Streaming - -** Inference with G-API - -*** In-graph inference example - -- Starting with OpencV 4.2 (2019), G-API allows to integrate ~infer~ - operations into the graph: - #+LaTeX: {\scriptsize - #+BEGIN_SRC C++ - G_API_NET(ObjDetect, , "pdf.example.od"); - - cv::GMat in; - cv::GMat blob = cv::gapi::infer(bgr); - cv::GOpaque size = cv::gapi::streaming::size(bgr); - cv::GArray objs = cv::gapi::streaming::parseSSD(blob, size); - cv::GComputation pipelne(cv::GIn(in), cv::GOut(objs)); - #+END_SRC - #+LaTeX: } -- Starting with OpenCV 4.5 (2020), G-API will provide more streaming- - and NN-oriented operations out of the box. - -** Inference with G-API - -*** What is the difference? - -- ~ObjDetect~ is not an operation, ~cv::gapi::infer~ is; -- ~cv::gapi::infer~ is a *generic* operation, where ~T=ObjDetect~ describes - the calling convention: - - How many inputs the network consumes, - - How many outputs the network produces. -- Inference data types are ~GMat~ only: - - Representing an image, then preprocessed automatically; - - Representing a blob (n-dimensional ~Mat~), then passed as-is. -- Inference *backends* only need to implement a single generic operation ~infer~. - -** Inference with G-API - -*** But how does it run? - -- Since ~infer~ is an *Operation*, backends may provide *Kernels* implementing it; -- The only publicly available inference backend now is *OpenVINO™*: - - Brings its ~infer~ kernel atop of the Inference Engine; -- NN model data is passed through G-API compile arguments (like kernels); -- Every NN backend provides its own structure to configure the network (like - a kernel API). - -** Inference with G-API - -*** Passing OpenVINO™ parameters to G-API - -- ~ObjDetect~ example: - #+LaTeX: {\footnotesize - #+BEGIN_SRC C++ - auto face_net = cv::gapi::ie::Params { - face_xml_path, // path to the topology IR - face_bin_path, // path to the topology weights - face_device_string, // OpenVINO plugin (device) string - }; - auto networks = cv::gapi::networks(face_net); - pipeline.compile(.., cv::compile_args(..., networks)); - #+END_SRC - #+LaTeX: } -- ~AgeGender~ requires binding Op's outputs to NN layers: - #+LaTeX: {\footnotesize - #+BEGIN_SRC C++ - auto age_net = cv::gapi::ie::Params { - ... - }.cfgOutputLayers({"age_conv3", "prob"}); // array ! - #+END_SRC - #+LaTeX: } - -** Streaming with G-API - -#+BEGIN_SRC dot :file 020-fd-demo.eps :cmdline "-Kdot -Teps" -digraph { - rankdir=LR; - node [shape=box]; - - cap [label=Capture]; - dec [label=Decode]; - res [label=Resize]; - cnn [label=Infer]; - vis [label=Visualize]; - - cap -> dec; - dec -> res; - res -> cnn; - cnn -> vis; -} -#+END_SRC -Anatomy of a regular video analytics application - -** Streaming with G-API - -#+BEGIN_SRC dot :file 021-fd-serial.eps :cmdline "-Kdot -Teps" -digraph { - node [shape=box margin=0 width=0.3 height=0.4] - nodesep=0.2; - rankdir=LR; - - subgraph cluster0 { - colorscheme=blues9 - pp [label="..." shape=plaintext]; - v0 [label=V]; - label="Frame N-1"; - color=7; - } - - subgraph cluster1 { - colorscheme=blues9 - c1 [label=C]; - d1 [label=D]; - r1 [label=R]; - i1 [label=I]; - v1 [label=V]; - label="Frame N"; - color=6; - } - - subgraph cluster2 { - colorscheme=blues9 - c2 [label=C]; - nn [label="..." shape=plaintext]; - label="Frame N+1"; - color=5; - } - - c1 -> d1 -> r1 -> i1 -> v1; - - pp-> v0; - v0 -> c1 [style=invis]; - v1 -> c2 [style=invis]; - c2 -> nn; -} -#+END_SRC -Serial execution of the sample video analytics application - -** Streaming with G-API - :PROPERTIES: - :BEAMER_opt: shrink - :END: - -#+BEGIN_SRC dot :file 022-fd-pipelined.eps :cmdline "-Kdot -Teps" -digraph { - nodesep=0.2; - ranksep=0.2; - node [margin=0 width=0.4 height=0.2]; - node [shape=plaintext] - Camera [label="Camera:"]; - GPU [label="GPU:"]; - FPGA [label="FPGA:"]; - CPU [label="CPU:"]; - Time [label="Time:"]; - t6 [label="T6"]; - t7 [label="T7"]; - t8 [label="T8"]; - t9 [label="T9"]; - t10 [label="T10"]; - tnn [label="..."]; - - node [shape=box margin=0 width=0.4 height=0.4 colorscheme=blues9] - node [color=9] V3; - node [color=8] F4; V4; - node [color=7] DR5; F5; V5; - node [color=6] C6; DR6; F6; V6; - node [color=5] C7; DR7; F7; V7; - node [color=4] C8; DR8; F8; - node [color=3] C9; DR9; - node [color=2] C10; - - {rank=same; rankdir=LR; Camera C6 C7 C8 C9 C10} - Camera -> C6 -> C7 -> C8 -> C9 -> C10 [style=invis]; - - {rank=same; rankdir=LR; GPU DR5 DR6 DR7 DR8 DR9} - GPU -> DR5 -> DR6 -> DR7 -> DR8 -> DR9 [style=invis]; - - C6 -> DR5 [style=invis]; - C6 -> DR6 [constraint=false]; - C7 -> DR7 [constraint=false]; - C8 -> DR8 [constraint=false]; - C9 -> DR9 [constraint=false]; - - {rank=same; rankdir=LR; FPGA F4 F5 F6 F7 F8} - FPGA -> F4 -> F5 -> F6 -> F7 -> F8 [style=invis]; - - DR5 -> F4 [style=invis]; - DR5 -> F5 [constraint=false]; - DR6 -> F6 [constraint=false]; - DR7 -> F7 [constraint=false]; - DR8 -> F8 [constraint=false]; - - {rank=same; rankdir=LR; CPU V3 V4 V5 V6 V7} - CPU -> V3 -> V4 -> V5 -> V6 -> V7 [style=invis]; - - F4 -> V3 [style=invis]; - F4 -> V4 [constraint=false]; - F5 -> V5 [constraint=false]; - F6 -> V6 [constraint=false]; - F7 -> V7 [constraint=false]; - - {rank=same; rankdir=LR; Time t6 t7 t8 t9 t10 tnn} - Time -> t6 -> t7 -> t8 -> t9 -> t10 -> tnn [style=invis]; - - CPU -> Time [style=invis]; - V3 -> t6 [style=invis]; - V4 -> t7 [style=invis]; - V5 -> t8 [style=invis]; - V6 -> t9 [style=invis]; - V7 -> t10 [style=invis]; -} -#+END_SRC -Pipelined execution for the video analytics application - -** Streaming with G-API: Example - -**** Serial mode (4.0) :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.45 - :END: -#+LaTeX: {\tiny -#+BEGIN_SRC C++ -pipeline = cv::GComputation(...); - -cv::VideoCapture cap(input); -cv::Mat in_frame; -std::vector out_faces; - -while (cap.read(in_frame)) { - pipeline.apply(cv::gin(in_frame), - cv::gout(out_faces), - cv::compile_args(kernels, - networks)); - // Process results - ... -} -#+END_SRC -#+LaTeX: } - -**** Streaming mode (since 4.2) :B_block:BMCOL: - :PROPERTIES: - :BEAMER_env: block - :BEAMER_col: 0.45 - :END: -#+LaTeX: {\tiny -#+BEGIN_SRC C++ -pipeline = cv::GComputation(...); - -auto in_src = cv::gapi::wip::make_src - (input) -auto cc = pipeline.compileStreaming - (cv::compile_args(kernels, networks)) -cc.setSource(cv::gin(in_src)); -cc.start(); - -std::vector out_faces; -while (cc.pull(cv::gout(out_faces))) { - // Process results - ... -} -#+END_SRC -#+LaTeX: } - -**** More information - -#+LaTeX: {\footnotesize -https://opencv.org/hybrid-cv-dl-pipelines-with-opencv-4-4-g-api/ -#+LaTeX: } - -* Latest features -** Latest features -*** Python API - -- Initial Python3 binding is available now in ~master~ (future 4.5); -- Only basic CV functionality is supported (~core~ & ~imgproc~ namespaces, - selecting backends); -- Adding more programmability, inference, and streaming is next. - -** Latest features -*** Python API - -#+LaTeX: {\footnotesize -#+BEGIN_SRC Python -import numpy as np -import cv2 as cv - -sz = (1280, 720) -in1 = np.random.randint(0, 100, sz).astype(np.uint8) -in2 = np.random.randint(0, 100, sz).astype(np.uint8) - -g_in1 = cv.GMat() -g_in2 = cv.GMat() -g_out = cv.gapi.add(g_in1, g_in2) -gr = cv.GComputation(g_in1, g_in2, g_out) - -pkg = cv.gapi.core.fluid.kernels() -out = gr.apply(in1, in2, args=cv.compile_args(pkg)) -#+END_SRC -#+LaTeX: } - -* Understanding the "G-Effect" - -** Understanding the "G-Effect" - -*** What is "G-Effect"? - -- G-API is not only an API, but also an /implementation/; - - i.e. it does some work already! -- We call "G-Effect" any measurable improvement which G-API demonstrates - against traditional methods; -- So far the list is: - - Memory consumption; - - Performance; - - Programmer efforts. - -Note: in the following slides, all measurements are taken on -Intel\textregistered{} Core\texttrademark-i5 6600 CPU. - -** Understanding the "G-Effect" -# FIXME - -*** Memory consumption: Sobel Edge Detector - -- G-API/Fluid backend is designed to minimize footprint: -#+LaTeX: {\footnotesize -| Input | OpenCV | G-API/Fluid | Factor | -| | MiB | MiB | Times | -|-------------+--------+-------------+--------| -| 512 x 512 | 17.33 | 0.59 | 28.9x | -| 640 x 480 | 20.29 | 0.62 | 32.8x | -| 1280 x 720 | 60.73 | 0.72 | 83.9x | -| 1920 x 1080 | 136.53 | 0.83 | 164.7x | -| 3840 x 2160 | 545.88 | 1.22 | 447.4x | -#+LaTeX: } -- The detector itself can be written manually in two ~for~ - loops, but G-API covers cases more complex than that; -- OpenCV code requires changes to shrink footprint. - -** Understanding the "G-Effect" - -*** Performance: Sobel Edge Detector - -- G-API/Fluid backend also optimizes cache reuse: - -#+LaTeX: {\footnotesize -| Input | OpenCV | G-API/Fluid | Factor | -| | ms | ms | Times | -|-------------+--------+-------------+--------| -| 320 x 240 | 1.16 | 0.53 | 2.17x | -| 640 x 480 | 5.66 | 1.89 | 2.99x | -| 1280 x 720 | 17.24 | 5.26 | 3.28x | -| 1920 x 1080 | 39.04 | 12.29 | 3.18x | -| 3840 x 2160 | 219.57 | 51.22 | 4.29x | -#+LaTeX: } - -- The more data is processed, the bigger "G-Effect" is. - -** Understanding the "G-Effect" - -*** Relative speed-up based on cache efficiency - -#+BEGIN_LATEX -\begin{figure} - \begin{tikzpicture} - \begin{axis}[ - xlabel={Image size}, - ylabel={Relative speed-up}, - nodes near coords, - width=0.8\textwidth, - xtick=data, - xticklabels={QVGA, VGA, HD, FHD, UHD}, - height=4.5cm, - ] - - \addplot plot coordinates {(1, 1.0) (2, 1.38) (3, 1.51) (4, 1.46) (5, 1.97)}; - - \end{axis} - \end{tikzpicture} -\end{figure} -#+END_LATEX - -The higher resolution is, the higher relative speed-up is (with -speed-up on QVGA taken as 1.0). - -* Resources on G-API - -** Resources on G-API - :PROPERTIES: - :BEAMER_opt: shrink - :END: -*** Repository - -- https://github.com/opencv/opencv (see ~modules/gapi~) - -*** Article - -- https://opencv.org/hybrid-cv-dl-pipelines-with-opencv-4-4-g-api/ - -*** Documentation - -- https://docs.opencv.org/4.4.0/d0/d1e/gapi.html - -*** Tutorials -- https://docs.opencv.org/4.4.0/df/d7e/tutorial_table_of_content_gapi.html - -* Thank you! diff --git a/modules/gapi/doc/slides/get_sty.sh b/modules/gapi/doc/slides/get_sty.sh deleted file mode 100755 index 0b97cf3ece..0000000000 --- a/modules/gapi/doc/slides/get_sty.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -set -e - -MTHEME_VER=2fa6084b9d34fec9d2d5470eb9a17d0bf712b6c8 -MTHEME_DIR=mtheme.sty - -function make_sty { - if [ -d "$MTHEME_DIR" ]; then rm -rf "$MTHEME_DIR"; fi - mkdir "$MTHEME_DIR" - - # Download template from Github - tmp_dir=$(mktemp -d) - wget -P "$tmp_dir" -c https://github.com/matze/mtheme/archive/${MTHEME_VER}.tar.gz - pushd "$tmp_dir" - tar -xzvf "$MTHEME_VER.tar.gz" - popd - make -C "$tmp_dir"/mtheme-"$MTHEME_VER" - cp -v "$tmp_dir"/mtheme-"$MTHEME_VER"/*.sty "$MTHEME_DIR" - rm -r "$tmp_dir" - # Put our own .gitignore to ignore this directory completely - echo "*" > "$MTHEME_DIR/.gitignore" -} - -make_sty diff --git a/modules/gapi/doc/slides/ocv_logo.eps b/modules/gapi/doc/slides/ocv_logo.eps deleted file mode 100644 index 67005bd3d0..0000000000 --- a/modules/gapi/doc/slides/ocv_logo.eps +++ /dev/null @@ -1,181 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: cairo 1.14.6 (http://cairographics.org) -%%CreationDate: Wed Dec 12 17:03:17 2018 -%%Pages: 1 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%BoundingBox: 0 -1 598 739 -%%EndComments -%%BeginProlog -save -50 dict begin -/q { gsave } bind def -/Q { grestore } bind def -/cm { 6 array astore concat } bind def -/w { setlinewidth } bind def -/J { setlinecap } bind def -/j { setlinejoin } bind def -/M { setmiterlimit } bind def -/d { setdash } bind def -/m { moveto } bind def -/l { lineto } bind def -/c { curveto } bind def -/h { closepath } bind def -/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto - 0 exch rlineto 0 rlineto closepath } bind def -/S { stroke } bind def -/f { fill } bind def -/f* { eofill } bind def -/n { newpath } bind def -/W { clip } bind def -/W* { eoclip } bind def -/BT { } bind def -/ET { } bind def -/pdfmark where { pop globaldict /?pdfmark /exec load put } - { globaldict begin /?pdfmark /pop load def /pdfmark - /cleartomark load def end } ifelse -/BDC { mark 3 1 roll /BDC pdfmark } bind def -/EMC { mark /EMC pdfmark } bind def -/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def -/Tj { show currentpoint cairo_store_point } bind def -/TJ { - { - dup - type /stringtype eq - { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse - } forall - currentpoint cairo_store_point -} bind def -/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore - cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def -/Tf { pop /cairo_font exch def /cairo_font_matrix where - { pop cairo_selectfont } if } bind def -/Td { matrix translate cairo_font_matrix matrix concatmatrix dup - /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point - /cairo_font where { pop cairo_selectfont } if } bind def -/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def - cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def -/g { setgray } bind def -/rg { setrgbcolor } bind def -/d1 { setcachedevice } bind def -%%EndProlog -%%BeginSetup -%%EndSetup -%%Page: 1 1 -%%BeginPageSetup -%%PageBoundingBox: 0 -1 598 739 -%%EndPageSetup -q 0 -1 598 740 rectclip q -1 0.00392157 0.00392157 rg -225.648 478.363 m 171.051 509.887 144.43 574.156 160.746 635.051 c 177.066 - 695.945 232.254 738.277 295.301 738.277 c 358.348 738.277 413.535 695.945 - 429.855 635.051 c 446.172 574.156 419.551 509.887 364.949 478.363 c 323.008 - 551.008 l 344.73 563.547 355.324 589.117 348.832 613.34 c 342.34 637.566 - 320.383 654.41 295.301 654.41 c 270.219 654.41 248.262 637.566 241.77 613.34 - c 235.277 589.117 245.871 563.547 267.59 551.008 c h -225.648 478.363 m f -0.00392157 0.00392157 1 rg -523.949 444.637 m 578.551 413.113 605.172 348.844 588.855 287.949 c 572.535 - 227.055 517.348 184.723 454.301 184.723 c 391.254 184.723 336.066 227.055 - 319.746 287.949 c 303.43 348.844 330.051 413.113 384.648 444.637 c 426.59 - 371.992 l 404.871 359.453 394.277 333.883 400.77 309.66 c 407.262 285.434 - 429.219 268.59 454.301 268.59 c 479.383 268.59 501.34 285.434 507.832 309.66 - c 514.324 333.883 503.73 359.453 482.008 371.992 c h -523.949 444.637 m f -0.00392157 1 0.00392157 rg -278.602 324 m 278.602 260.953 236.254 205.762 175.359 189.449 c 114.461 - 173.133 50.207 199.762 18.684 254.363 c -12.84 308.961 -3.773 377.922 40.805 - 422.504 c 85.383 467.082 154.352 476.164 208.949 444.637 c 167.008 371.992 - l 145.289 384.535 117.852 380.922 100.117 363.188 c 82.383 345.453 78.773 - 318.016 91.316 296.297 c 103.855 274.574 129.418 263.98 153.645 270.473 - c 177.871 276.961 194.719 298.918 194.719 324 c h -278.602 324 m f -0.0196078 g -39.781 151.301 m 51.57 152.359 63.492 152.352 75.223 150.672 c 82.449 149.391 - 90.121 147.52 95.551 142.25 c 101.242 135.898 102.641 127.078 103.891 118.949 - c 105.941 102.078 105.699 84.969 103.891 68.09 c 102.68 59.852 101.492 -50.949 96.09 44.25 c 90.199 38.27 81.5 36.57 73.52 35.309 c 61.742 33.84 - 49.789 33.5 37.961 34.68 c 29.949 35.5 21.59 36.91 14.77 41.48 c 10.359 - 44.281 7.992 49.219 6.379 54.012 c 3.152 63.988 2.742 74.59 2.301 84.988 - c 2.25 98.73 2.512 112.609 5.191 126.129 c 6.641 132.441 8.402 139.379 -13.73 143.59 c 21.242 149.039 30.789 150.359 39.781 151.301 c h -41.73 132.469 m 51.723 133.27 61.922 133.512 71.801 131.57 c 75.629 130.801 - 80.152 128.941 80.871 124.578 c 83.871 112.309 83.172 99.531 83.289 86.988 - c 82.922 78.07 83.129 68.852 80.141 60.309 c 77.531 54.699 70.422 54.238 - 65.062 53.422 c 54.312 52.809 43.152 52.27 32.723 55.461 c 27.91 56.73 -26.391 61.891 25.652 66.219 c 23.652 79.051 24.301 92.102 24.551 105.031 - c 25.082 112.281 24.992 119.801 27.602 126.691 c 30.59 131.309 36.77 131.719 - 41.73 132.469 c h -41.73 132.469 m f* -147.07 112.219 m 154.23 116.77 163.121 117.512 171.379 116.762 c 179.09 - 116.102 187.652 113.48 191.781 106.379 c 196.711 97.469 196.992 86.941 -197.332 77 c 197.109 66.781 196.922 56.109 192.699 46.609 c 190.289 40.84 - 184.75 37.059 178.82 35.57 c 169.742 33.34 159.762 33.102 151.012 36.719 - c 146.281 38.57 143.012 42.59 140.301 46.711 c 140.301 0 l 120.301 0 l -120.312 38.66 120.281 77.328 120.312 115.988 c 126.781 116.02 133.25 116.02 - 139.711 115.988 c 139.492 112.012 139.27 108.039 139.16 104.051 c 141.562 - 106.98 143.789 110.199 147.07 112.219 c h -153.582 101.781 m 159.18 102.211 165.102 102.328 170.34 100.02 c 173.66 - 98.59 175.41 95.078 176 91.68 c 177.742 82.91 177.52 73.852 176.902 64.969 - c 176.281 59.609 175.422 52.672 169.52 50.59 c 162.699 48.359 154.922 48.219 - 148.18 50.828 c 141.91 53.469 141.18 61.059 140.562 66.949 c 140.191 75.988 - 139.742 85.289 142.289 94.07 c 143.641 99.051 148.82 101.41 153.582 101.781 - c h -153.582 101.781 m f* -221.262 112.07 m 231.09 117.121 242.602 117.301 253.391 116.789 c 262.371 - 116.039 273.27 114.539 278.223 105.949 c 283.801 95.578 282.891 83.379 -283.672 72 c 228.961 72 l 229.602 66.129 228.84 59.801 231.801 54.422 c -234.332 50.172 239.699 49.301 244.242 49.051 c 249.852 49.012 255.891 48.551 - 261.062 51.16 c 264.02 53.48 264.039 57.602 264.422 61 c 270.82 61.012 -277.223 61.012 283.621 61 c 283.379 54.32 282.52 46.84 277.16 42.141 c 269.109 - 34.922 257.59 34.172 247.289 33.969 c 238.199 34.238 228.602 34.699 220.461 - 39.18 c 213.871 43.07 211.77 51.059 210.609 58.102 c 209.141 68.559 208.77 - 79.219 210.02 89.719 c 211.039 98.012 213.27 107.762 221.262 112.07 c h -232.949 99.34 m 238.41 102.66 245.172 101.988 251.301 101.898 c 255.102 - 101.488 259.73 101.27 262.199 97.91 c 264.723 93.762 264.27 88.68 264.289 - 84.02 c 252.52 84 240.762 83.969 229 84.031 c 229.18 89.211 228.77 95.531 - 232.949 99.34 c h -232.949 99.34 m f* -326.262 112.121 m 333.18 116.922 342.121 117.59 350.262 116.648 c 357.191 - 115.922 364.531 113.281 368.621 107.301 c 372.25 102.34 373.262 96.02 373.312 - 90.012 c 373.281 71.672 373.32 53.34 373.301 35 c 366.961 34.988 360.629 - 34.988 354.312 35 c 354.281 52.352 354.332 69.691 354.281 87.031 c 354.09 - 90.82 354.242 95.199 351.391 98.121 c 348.352 101.41 343.582 102.051 339.332 - 102.02 c 334.191 102.051 328.629 101.172 324.672 97.621 c 320.801 94.32 - 319.332 89 319.312 84.078 c 319.281 67.719 319.32 51.359 319.289 35.012 - c 312.961 34.988 306.629 34.988 300.312 35 c 300.301 62 300.301 89 300.312 - 116 c 306.531 116.02 312.762 116.012 318.98 116 c 318.949 111.262 318.48 - 106.551 318.34 101.809 c 320.379 105.641 322.52 109.68 326.262 112.121 -c h -326.262 112.121 m f* -407.691 147.602 m 418.172 151.121 429.34 151.621 440.301 152.012 c 450.922 - 151.961 462.02 151.859 471.941 147.578 c 476.98 145.48 480.473 140.879 -482.172 135.801 c 484.941 128.211 485.02 119.988 485.082 112 c 477.77 112 - 470.461 111.98 463.16 112.012 c 463.039 117.629 463.473 123.93 459.992 -128.711 c 456.473 132.309 450.973 132.301 446.301 132.852 c 436.801 133.031 - 426.91 133.641 417.812 130.359 c 414.531 129.32 412.832 126.039 412.172 - 122.879 c 410.301 114.398 410.289 105.648 410.301 97 c 410.41 85.441 410.23 - 73.711 412.699 62.34 c 413.352 58.18 417.18 55.621 421.02 54.699 c 429.902 - 52.488 439.172 52.809 448.242 53.352 c 452.973 53.969 458.73 54.281 461.699 - 58.621 c 464.871 63.801 464.34 70.172 464.172 75.988 c 471.551 76.02 478.922 - 76.012 486.301 75.988 c 486.211 66.801 486.051 57.309 482.711 48.609 c -480.992 44.059 477.441 40.199 472.84 38.461 c 463.812 34.84 453.91 34.609 - 444.332 34.031 c 433.223 33.84 421.973 34.109 411.109 36.699 c 404.742 -38.359 397.781 41.281 394.832 47.609 c 391.062 55.98 390.371 65.289 389.402 - 74.301 c 388.59 86.199 388.07 98.121 388.359 110.039 c 388.93 119.691 389.812 - 129.859 395.02 138.27 c 397.789 142.949 402.652 145.879 407.691 147.602 - c h -407.691 147.602 m f* -489.902 150.969 m 497.52 150.961 505.141 151.18 512.75 150.859 c 520.16 - 127.352 528.301 104.078 535.781 80.602 c 538.691 71.578 540.75 62.301 543.762 - 53.309 c 547.129 63.012 549.289 73.09 552.59 82.809 c 559.902 105.52 567.41 - 128.16 574.711 150.871 c 582.23 151.191 589.77 150.91 597.301 151.012 c - 597.301 148.52 l 584.922 110.789 572.832 72.961 560.699 35.141 c 549.379 - 34.91 538.039 34.879 526.723 35.16 c 514.66 73.828 502.02 112.32 489.902 - 150.969 c h -489.902 150.969 m f* -Q Q -showpage -%%Trailer -end restore -%%EOF diff --git a/modules/gapi/include/opencv2/gapi.hpp b/modules/gapi/include/opencv2/gapi.hpp deleted file mode 100644 index 2087641023..0000000000 --- a/modules/gapi/include/opencv2/gapi.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2021 Intel Corporation - - -#ifndef OPENCV_GAPI_HPP -#define OPENCV_GAPI_HPP - -#include - -/** \defgroup gapi_ref G-API framework -@{ - @defgroup gapi_main_classes G-API Main Classes - @defgroup gapi_data_objects G-API Data Types - @{ - @defgroup gapi_meta_args G-API Metadata Descriptors - @} - @defgroup gapi_std_backends G-API Standard Backends - @defgroup gapi_compile_args G-API Graph Compilation Arguments - @defgroup gapi_serialization G-API Serialization functionality -@} - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Include these files here to avoid cyclic dependency between -// Desync & GKernel & GComputation & GStreamingCompiled. -#include -#include - -#endif // OPENCV_GAPI_HPP diff --git a/modules/gapi/include/opencv2/gapi/core.hpp b/modules/gapi/include/opencv2/gapi/core.hpp deleted file mode 100644 index 60bb2c5074..0000000000 --- a/modules/gapi/include/opencv2/gapi/core.hpp +++ /dev/null @@ -1,1911 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_CORE_HPP -#define OPENCV_GAPI_CORE_HPP - -#include -#include // std::tuple - -#include -#include - -#include -#include -#include -#include - -/** \defgroup gapi_core G-API Core functionality -@{ - @defgroup gapi_math Graph API: Math operations - @defgroup gapi_pixelwise Graph API: Pixelwise operations - @defgroup gapi_matrixop Graph API: Operations on matrices - @defgroup gapi_transform Graph API: Image and channel composition functions -@} - */ - -namespace cv { namespace gapi { -/** - * @brief This namespace contains G-API Operation Types for OpenCV - * Core module functionality. - */ -namespace core { - using GResize = cv::gapi::imgproc::GResize; - using GResizeP = cv::gapi::imgproc::GResizeP; - - using GMat2 = std::tuple; - using GMat3 = std::tuple; // FIXME: how to avoid this? - using GMat4 = std::tuple; - using GMatScalar = std::tuple; - - G_TYPED_KERNEL(GAdd, , "org.opencv.core.math.add") { - static GMatDesc outMeta(GMatDesc a, GMatDesc b, int ddepth) { - if (ddepth == -1) - { - // OpenCV: When the input arrays in add/subtract/multiply/divide - // functions have different depths, the output array depth must be - // explicitly specified! - // See artim_op() @ arithm.cpp - GAPI_Assert(a.chan == b.chan); - GAPI_Assert(a.depth == b.depth); - return a; - } - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GAddC, , "org.opencv.core.math.addC") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc, int ddepth) { - GAPI_Assert(a.chan <= 4); - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GSub, , "org.opencv.core.math.sub") { - static GMatDesc outMeta(GMatDesc a, GMatDesc b, int ddepth) { - if (ddepth == -1) - { - // This macro should select a larger data depth from a and b - // considering the number of channels in the same - // FIXME!!! Clarify if it is valid for sub() - GAPI_Assert(a.chan == b.chan); - ddepth = std::max(a.depth, b.depth); - } - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GSubC, , "org.opencv.core.math.subC") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc, int ddepth) { - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GSubRC,, "org.opencv.core.math.subRC") { - static GMatDesc outMeta(GScalarDesc, GMatDesc b, int ddepth) { - return b.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GMul, , "org.opencv.core.math.mul") { - static GMatDesc outMeta(GMatDesc a, GMatDesc, double, int ddepth) { - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GMulCOld, , "org.opencv.core.math.mulCOld") { - static GMatDesc outMeta(GMatDesc a, double, int ddepth) { - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GMulC, , "org.opencv.core.math.mulC") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc, int ddepth) { - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GMulS, , "org.opencv.core.math.muls") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a; - } - }; // FIXME: Merge with MulC - - G_TYPED_KERNEL(GDiv, , "org.opencv.core.math.div") { - static GMatDesc outMeta(GMatDesc a, GMatDesc b, double, int ddepth) { - if (ddepth == -1) - { - GAPI_Assert(a.depth == b.depth); - return b; - } - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GDivC, , "org.opencv.core.math.divC") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc, double, int ddepth) { - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GDivRC, , "org.opencv.core.math.divRC") { - static GMatDesc outMeta(GScalarDesc, GMatDesc b, double, int ddepth) { - return b.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GMean, , "org.opencv.core.math.mean") { - static GScalarDesc outMeta(GMatDesc) { - return empty_scalar_desc(); - } - }; - - G_TYPED_KERNEL_M(GPolarToCart, , "org.opencv.core.math.polarToCart") { - static std::tuple outMeta(GMatDesc, GMatDesc a, bool) { - return std::make_tuple(a, a); - } - }; - - G_TYPED_KERNEL_M(GCartToPolar, , "org.opencv.core.math.cartToPolar") { - static std::tuple outMeta(GMatDesc x, GMatDesc, bool) { - return std::make_tuple(x, x); - } - }; - - G_TYPED_KERNEL(GPhase, , "org.opencv.core.math.phase") { - static GMatDesc outMeta(const GMatDesc &inx, const GMatDesc &, bool) { - return inx; - } - }; - - G_TYPED_KERNEL(GMask, , "org.opencv.core.pixelwise.mask") { - static GMatDesc outMeta(GMatDesc in, GMatDesc) { - return in; - } - }; - - G_TYPED_KERNEL(GCmpGT, , "org.opencv.core.pixelwise.compare.cmpGT") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpGE, , "org.opencv.core.pixelwise.compare.cmpGE") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpLE, , "org.opencv.core.pixelwise.compare.cmpLE") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpLT, , "org.opencv.core.pixelwise.compare.cmpLT") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpEQ, , "org.opencv.core.pixelwise.compare.cmpEQ") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpNE, , "org.opencv.core.pixelwise.compare.cmpNE") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpGTScalar, , "org.opencv.core.pixelwise.compare.cmpGTScalar") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpGEScalar, , "org.opencv.core.pixelwise.compare.cmpGEScalar") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpLEScalar, , "org.opencv.core.pixelwise.compare.cmpLEScalar") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpLTScalar, , "org.opencv.core.pixelwise.compare.cmpLTScalar") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpEQScalar, , "org.opencv.core.pixelwise.compare.cmpEQScalar") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GCmpNEScalar, , "org.opencv.core.pixelwise.compare.cmpNEScalar") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a.withDepth(CV_8U); - } - }; - - G_TYPED_KERNEL(GAnd, , "org.opencv.core.pixelwise.bitwise_and") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GAndS, , "org.opencv.core.pixelwise.bitwise_andS") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GOr, , "org.opencv.core.pixelwise.bitwise_or") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GOrS, , "org.opencv.core.pixelwise.bitwise_orS") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GXor, , "org.opencv.core.pixelwise.bitwise_xor") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GXorS, , "org.opencv.core.pixelwise.bitwise_xorS") { - static GMatDesc outMeta(GMatDesc a, GScalarDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GNot, , "org.opencv.core.pixelwise.bitwise_not") { - static GMatDesc outMeta(GMatDesc a) { - return a; - } - }; - - G_TYPED_KERNEL(GSelect, , "org.opencv.core.pixelwise.select") { - static GMatDesc outMeta(GMatDesc a, GMatDesc, GMatDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GMin, , "org.opencv.core.matrixop.min") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GMax, , "org.opencv.core.matrixop.max") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GAbsDiff, , "org.opencv.core.matrixop.absdiff") { - static GMatDesc outMeta(GMatDesc a, GMatDesc) { - return a; - } - }; - - G_TYPED_KERNEL(GAbsDiffC, , "org.opencv.core.matrixop.absdiffC") { - static GMatDesc outMeta(const GMatDesc& a, const GScalarDesc&) { - return a; - } - }; - - G_TYPED_KERNEL(GSum, , "org.opencv.core.matrixop.sum") { - static GScalarDesc outMeta(GMatDesc) { - return empty_scalar_desc(); - } - }; - - G_TYPED_KERNEL(GCountNonZero, (GMat)>, "org.opencv.core.matrixop.countNonZero") { - static GOpaqueDesc outMeta(GMatDesc in) { - GAPI_Assert(in.chan == 1); - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GAddW, , "org.opencv.core.matrixop.addweighted") { - static GMatDesc outMeta(GMatDesc a, double, GMatDesc b, double, double, int ddepth) { - if (ddepth == -1) - { - // OpenCV: When the input arrays in add/subtract/multiply/divide - // functions have different depths, the output array depth must be - // explicitly specified! - // See artim_op() @ arithm.cpp - GAPI_Assert(a.chan == b.chan); - GAPI_Assert(a.depth == b.depth); - return a; - } - return a.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GNormL1, , "org.opencv.core.matrixop.norml1") { - static GScalarDesc outMeta(GMatDesc) { - return empty_scalar_desc(); - } - }; - - G_TYPED_KERNEL(GNormL2, , "org.opencv.core.matrixop.norml2") { - static GScalarDesc outMeta(GMatDesc) { - return empty_scalar_desc(); - } - }; - - G_TYPED_KERNEL(GNormInf, , "org.opencv.core.matrixop.norminf") { - static GScalarDesc outMeta(GMatDesc) { - return empty_scalar_desc(); - } - }; - - G_TYPED_KERNEL_M(GIntegral, , "org.opencv.core.matrixop.integral") { - static std::tuple outMeta(GMatDesc in, int sd, int sqd) { - return std::make_tuple(in.withSizeDelta(1,1).withDepth(sd), - in.withSizeDelta(1,1).withDepth(sqd)); - } - }; - - G_TYPED_KERNEL(GThreshold, , "org.opencv.core.matrixop.threshold") { - static GMatDesc outMeta(GMatDesc in, GScalarDesc, GScalarDesc, int) { - return in; - } - }; - - - G_TYPED_KERNEL_M(GThresholdOT, , "org.opencv.core.matrixop.thresholdOT") { - static std::tuple outMeta(GMatDesc in, GScalarDesc, int) { - return std::make_tuple(in, empty_scalar_desc()); - } - }; - - G_TYPED_KERNEL(GInRange, , "org.opencv.core.matrixop.inrange") { - static GMatDesc outMeta(GMatDesc in, GScalarDesc, GScalarDesc) { - return in.withType(CV_8U, 1); - } - }; - - G_TYPED_KERNEL_M(GSplit3, , "org.opencv.core.transform.split3") { - static std::tuple outMeta(GMatDesc in) { - const auto out_depth = in.depth; - const auto out_desc = in.withType(out_depth, 1); - return std::make_tuple(out_desc, out_desc, out_desc); - } - }; - - G_TYPED_KERNEL_M(GSplit4, ,"org.opencv.core.transform.split4") { - static std::tuple outMeta(GMatDesc in) { - const auto out_depth = in.depth; - const auto out_desc = in.withType(out_depth, 1); - return std::make_tuple(out_desc, out_desc, out_desc, out_desc); - } - }; - - G_TYPED_KERNEL(GMerge3, , "org.opencv.core.transform.merge3") { - static GMatDesc outMeta(GMatDesc in, GMatDesc, GMatDesc) { - // Preserve depth and add channel component - return in.withType(in.depth, 3); - } - }; - - G_TYPED_KERNEL(GMerge4, , "org.opencv.core.transform.merge4") { - static GMatDesc outMeta(GMatDesc in, GMatDesc, GMatDesc, GMatDesc) { - // Preserve depth and add channel component - return in.withType(in.depth, 4); - } - }; - - G_TYPED_KERNEL(GRemap, , "org.opencv.core.transform.remap") { - static GMatDesc outMeta(GMatDesc in, Mat m1, Mat, int, int, Scalar) { - return in.withSize(m1.size()); - } - }; - - G_TYPED_KERNEL(GFlip, , "org.opencv.core.transform.flip") { - static GMatDesc outMeta(GMatDesc in, int) { - return in; - } - }; - - // TODO: eliminate the need in this kernel (streaming) - G_TYPED_KERNEL(GCrop, , "org.opencv.core.transform.crop") { - static GMatDesc outMeta(GMatDesc in, Rect rc) { - return in.withSize(Size(rc.width, rc.height)); - } - }; - - G_TYPED_KERNEL(GConcatHor, , "org.opencv.imgproc.transform.concatHor") { - static GMatDesc outMeta(GMatDesc l, GMatDesc r) { - return l.withSizeDelta(+r.size.width, 0); - } - }; - - G_TYPED_KERNEL(GConcatVert, , "org.opencv.imgproc.transform.concatVert") { - static GMatDesc outMeta(GMatDesc t, GMatDesc b) { - return t.withSizeDelta(0, +b.size.height); - } - }; - - G_TYPED_KERNEL(GLUT, , "org.opencv.core.transform.LUT") { - static GMatDesc outMeta(GMatDesc in, Mat) { - return in; - } - }; - - G_TYPED_KERNEL(GConvertTo, , "org.opencv.core.transform.convertTo") { - static GMatDesc outMeta(GMatDesc in, int rdepth, double, double) { - return rdepth < 0 ? in : in.withDepth(rdepth); - } - }; - - G_TYPED_KERNEL(GSqrt, , "org.opencv.core.math.sqrt") { - static GMatDesc outMeta(GMatDesc in) { - return in; - } - }; - - G_TYPED_KERNEL(GNormalize, , "org.opencv.core.normalize") { - static GMatDesc outMeta(GMatDesc in, double, double, int, int ddepth) { - // unlike opencv doesn't have a mask as a parameter - return (ddepth < 0 ? in : in.withDepth(ddepth)); - } - }; - - G_TYPED_KERNEL(GWarpPerspective, , "org.opencv.core.warpPerspective") { - static GMatDesc outMeta(GMatDesc in, const Mat&, Size dsize, int, int borderMode, const cv::Scalar&) { - GAPI_Assert((borderMode == cv::BORDER_CONSTANT || borderMode == cv::BORDER_REPLICATE) && - "cv::gapi::warpPerspective supports only cv::BORDER_CONSTANT and cv::BORDER_REPLICATE border modes"); - return in.withType(in.depth, in.chan).withSize(dsize); - } - }; - - G_TYPED_KERNEL(GWarpAffine, , "org.opencv.core.warpAffine") { - static GMatDesc outMeta(GMatDesc in, const Mat&, Size dsize, int, int border_mode, const cv::Scalar&) { - GAPI_Assert(border_mode != cv::BORDER_TRANSPARENT && - "cv::BORDER_TRANSPARENT mode is not supported in cv::gapi::warpAffine"); - return in.withType(in.depth, in.chan).withSize(dsize); - } - }; - - G_TYPED_KERNEL( - GKMeansND, - ,GMat,GMat>(GMat,int,GMat,TermCriteria,int,KmeansFlags)>, - "org.opencv.core.kmeansND") { - - static std::tuple - outMeta(const GMatDesc& in, int K, const GMatDesc& bestLabels, const TermCriteria&, int, - KmeansFlags flags) { - GAPI_Assert(in.depth == CV_32F); - std::vector amount_n_dim = detail::checkVector(in); - int amount = amount_n_dim[0], dim = amount_n_dim[1]; - if (amount == -1) // Mat with height != 1, width != 1, channels != 1 given - { // which means that kmeans will consider the following: - amount = in.size.height; - dim = in.size.width * in.chan; - } - // kmeans sets these labels' sizes when no bestLabels given: - GMatDesc out_labels(CV_32S, 1, Size{1, amount}); - // kmeans always sets these centers' sizes: - GMatDesc centers (CV_32F, 1, Size{dim, K}); - if (flags & KMEANS_USE_INITIAL_LABELS) - { - GAPI_Assert(bestLabels.depth == CV_32S); - int labels_amount = detail::checkVector(bestLabels, 1u); - GAPI_Assert(labels_amount == amount); - out_labels = bestLabels; // kmeans preserves bestLabels' sizes if given - } - return std::make_tuple(empty_gopaque_desc(), out_labels, centers); - } - }; - - G_TYPED_KERNEL( - GKMeansNDNoInit, - ,GMat,GMat>(GMat,int,TermCriteria,int,KmeansFlags)>, - "org.opencv.core.kmeansNDNoInit") { - - static std::tuple - outMeta(const GMatDesc& in, int K, const TermCriteria&, int, KmeansFlags flags) { - GAPI_Assert( !(flags & KMEANS_USE_INITIAL_LABELS) ); - GAPI_Assert(in.depth == CV_32F); - std::vector amount_n_dim = detail::checkVector(in); - int amount = amount_n_dim[0], dim = amount_n_dim[1]; - if (amount == -1) // Mat with height != 1, width != 1, channels != 1 given - { // which means that kmeans will consider the following: - amount = in.size.height; - dim = in.size.width * in.chan; - } - GMatDesc out_labels(CV_32S, 1, Size{1, amount}); - GMatDesc centers (CV_32F, 1, Size{dim, K}); - return std::make_tuple(empty_gopaque_desc(), out_labels, centers); - } - }; - - G_TYPED_KERNEL(GKMeans2D, ,GArray,GArray> - (GArray,int,GArray,TermCriteria,int,KmeansFlags)>, - "org.opencv.core.kmeans2D") { - static std::tuple - outMeta(const GArrayDesc&,int,const GArrayDesc&,const TermCriteria&,int,KmeansFlags) { - return std::make_tuple(empty_gopaque_desc(), empty_array_desc(), empty_array_desc()); - } - }; - - G_TYPED_KERNEL(GKMeans3D, ,GArray,GArray> - (GArray,int,GArray,TermCriteria,int,KmeansFlags)>, - "org.opencv.core.kmeans3D") { - static std::tuple - outMeta(const GArrayDesc&,int,const GArrayDesc&,const TermCriteria&,int,KmeansFlags) { - return std::make_tuple(empty_gopaque_desc(), empty_array_desc(), empty_array_desc()); - } - }; - - G_TYPED_KERNEL(GTranspose, , "org.opencv.core.transpose") { - static GMatDesc outMeta(GMatDesc in) { - return in.withSize({in.size.height, in.size.width}); - } - }; -} // namespace core - -namespace streaming { - -// Operations for Streaming (declared in this header for convenience) -G_TYPED_KERNEL(GSize, (GMat)>, "org.opencv.streaming.size") { - static GOpaqueDesc outMeta(const GMatDesc&) { - return empty_gopaque_desc(); - } -}; - -G_TYPED_KERNEL(GSizeR, (GOpaque)>, "org.opencv.streaming.sizeR") { - static GOpaqueDesc outMeta(const GOpaqueDesc&) { - return empty_gopaque_desc(); - } -}; - -G_TYPED_KERNEL(GSizeMF, (GFrame)>, "org.opencv.streaming.sizeMF") { - static GOpaqueDesc outMeta(const GFrameDesc&) { - return empty_gopaque_desc(); - } -}; -} // namespace streaming - -//! @addtogroup gapi_math -//! @{ - -/** @brief Calculates the per-element sum of two matrices. - -The function add calculates sum of two matrices of the same size and the same number of channels: -\f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) + \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0\f] - -The function can be replaced with matrix expressions: - \f[\texttt{dst} = \texttt{src1} + \texttt{src2}\f] - -The input matrices and the output matrix can all have the same or different depths. For example, you -can add a 16-bit unsigned matrix to a 8-bit signed matrix and store the sum as a 32-bit -floating-point matrix. Depth of the output matrix is determined by the ddepth parameter. -If src1.depth() == src2.depth(), ddepth can be set to the default -1. In this case, the output matrix will have -the same depth as the input matrices. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.add" -@param src1 first input matrix. -@param src2 second input matrix. -@param ddepth optional depth of the output matrix. -@sa sub, addWeighted -*/ -GAPI_EXPORTS_W GMat add(const GMat& src1, const GMat& src2, int ddepth = -1); - -/** @brief Calculates the per-element sum of matrix and given scalar. - -The function addC adds a given scalar value to each element of given matrix. -The function can be replaced with matrix expressions: - - \f[\texttt{dst} = \texttt{src1} + \texttt{c}\f] - -Depth of the output matrix is determined by the ddepth parameter. -If ddepth is set to default -1, the depth of output matrix will be the same as the depth of input matrix. -The matrices can be single or multi channel. Output matrix must have the same size and number of channels as the input matrix. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.addC" -@param src1 first input matrix. -@param c scalar value to be added. -@param ddepth optional depth of the output matrix. -@sa sub, addWeighted -*/ -GAPI_EXPORTS_W GMat addC(const GMat& src1, const GScalar& c, int ddepth = -1); -//! @overload -GAPI_EXPORTS_W GMat addC(const GScalar& c, const GMat& src1, int ddepth = -1); - -/** @brief Calculates the per-element difference between two matrices. - -The function sub calculates difference between two matrices, when both matrices have the same size and the same number of -channels: - \f[\texttt{dst}(I) = \texttt{src1}(I) - \texttt{src2}(I)\f] - -The function can be replaced with matrix expressions: -\f[\texttt{dst} = \texttt{src1} - \texttt{src2}\f] - -The input matrices and the output matrix can all have the same or different depths. For example, you -can subtract two 8-bit unsigned matrices store the result as a 16-bit signed matrix. -Depth of the output matrix is determined by the ddepth parameter. -If src1.depth() == src2.depth(), ddepth can be set to the default -1. In this case, the output matrix will have -the same depth as the input matrices. The matrices can be single or multi channel. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.sub" -@param src1 first input matrix. -@param src2 second input matrix. -@param ddepth optional depth of the output matrix. -@sa add, addC - */ -GAPI_EXPORTS_W GMat sub(const GMat& src1, const GMat& src2, int ddepth = -1); - -/** @brief Calculates the per-element difference between matrix and given scalar. - -The function can be replaced with matrix expressions: - \f[\texttt{dst} = \texttt{src} - \texttt{c}\f] - -Depth of the output matrix is determined by the ddepth parameter. -If ddepth is set to default -1, the depth of output matrix will be the same as the depth of input matrix. -The matrices can be single or multi channel. Output matrix must have the same size as src. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.subC" -@param src first input matrix. -@param c scalar value to subtracted. -@param ddepth optional depth of the output matrix. -@sa add, addC, subRC - */ -GAPI_EXPORTS_W GMat subC(const GMat& src, const GScalar& c, int ddepth = -1); - -/** @brief Calculates the per-element difference between given scalar and the matrix. - -The function can be replaced with matrix expressions: - \f[\texttt{dst} = \texttt{c} - \texttt{src}\f] - -Depth of the output matrix is determined by the ddepth parameter. -If ddepth is set to default -1, the depth of output matrix will be the same as the depth of input matrix. -The matrices can be single or multi channel. Output matrix must have the same size as src. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.subRC" -@param c scalar value to subtract from. -@param src input matrix to be subtracted. -@param ddepth optional depth of the output matrix. -@sa add, addC, subC - */ -GAPI_EXPORTS_W GMat subRC(const GScalar& c, const GMat& src, int ddepth = -1); - -/** @brief Calculates the per-element scaled product of two matrices. - -The function mul calculates the per-element product of two matrices: - -\f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{scale} \cdot \texttt{src1} (I) \cdot \texttt{src2} (I))\f] - -If src1.depth() == src2.depth(), ddepth can be set to the default -1. In this case, the output matrix will have -the same depth as the input matrices. The matrices can be single or multi channel. -Output matrix must have the same size as input matrices. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.mul" -@param src1 first input matrix. -@param src2 second input matrix of the same size and the same depth as src1. -@param scale optional scale factor. -@param ddepth optional depth of the output matrix. -@sa add, sub, div, addWeighted -*/ -GAPI_EXPORTS_W GMat mul(const GMat& src1, const GMat& src2, double scale = 1.0, int ddepth = -1); - -/** @brief Multiplies matrix by scalar. - -The function mulC multiplies each element of matrix src by given scalar value: - -\f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I) \cdot \texttt{multiplier} )\f] - -The matrices can be single or multi channel. Output matrix must have the same size as src. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.mulC" -@param src input matrix. -@param multiplier factor to be multiplied. -@param ddepth optional depth of the output matrix. If -1, the depth of output matrix will be the same as input matrix depth. -@sa add, sub, div, addWeighted -*/ -GAPI_EXPORTS_W GMat mulC(const GMat& src, double multiplier, int ddepth = -1); -//! @overload -GAPI_EXPORTS_W GMat mulC(const GMat& src, const GScalar& multiplier, int ddepth = -1); // FIXME: merge with mulc -//! @overload -GAPI_EXPORTS_W GMat mulC(const GScalar& multiplier, const GMat& src, int ddepth = -1); // FIXME: merge with mulc - -/** @brief Performs per-element division of two matrices. - -The function divides one matrix by another: -\f[\texttt{dst(I) = saturate(src1(I)*scale/src2(I))}\f] - -For integer types when src2(I) is zero, dst(I) will also be zero. -Floating point case returns Inf/NaN (according to IEEE). - -Different channels of -multi-channel matrices are processed independently. -The matrices can be single or multi channel. Output matrix must have the same size and depth as src. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.div" -@param src1 first input matrix. -@param src2 second input matrix of the same size and depth as src1. -@param scale scalar factor. -@param ddepth optional depth of the output matrix; you can only pass -1 when src1.depth() == src2.depth(). -@sa mul, add, sub -*/ -GAPI_EXPORTS_W GMat div(const GMat& src1, const GMat& src2, double scale, int ddepth = -1); - -/** @brief Divides matrix by scalar. - -The function divC divides each element of matrix src by given scalar value: - -\f[\texttt{dst(I) = saturate(src(I)*scale/divisor)}\f] - -When divisor is zero, dst(I) will also be zero. Different channels of -multi-channel matrices are processed independently. -The matrices can be single or multi channel. Output matrix must have the same size and depth as src. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.divC" -@param src input matrix. -@param divisor number to be divided by. -@param ddepth optional depth of the output matrix. If -1, the depth of output matrix will be the same as input matrix depth. -@param scale scale factor. -@sa add, sub, div, addWeighted -*/ -GAPI_EXPORTS_W GMat divC(const GMat& src, const GScalar& divisor, double scale, int ddepth = -1); - -/** @brief Divides scalar by matrix. - -The function divRC divides given scalar by each element of matrix src and keep the division result in new matrix of the same size and type as src: - -\f[\texttt{dst(I) = saturate(divident*scale/src(I))}\f] - -When src(I) is zero, dst(I) will also be zero. Different channels of -multi-channel matrices are processed independently. -The matrices can be single or multi channel. Output matrix must have the same size and depth as src. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.divRC" -@param src input matrix. -@param divident number to be divided. -@param ddepth optional depth of the output matrix. If -1, the depth of output matrix will be the same as input matrix depth. -@param scale scale factor -@sa add, sub, div, addWeighted -*/ -GAPI_EXPORTS_W GMat divRC(const GScalar& divident, const GMat& src, double scale, int ddepth = -1); - -/** @brief Applies a mask to a matrix. - -The function mask set value from given matrix if the corresponding pixel value in mask matrix set to true, -and set the matrix value to 0 otherwise. - -Supported src matrix data types are @ref CV_8UC1, @ref CV_16SC1, @ref CV_16UC1. Supported mask data type is @ref CV_8UC1. - -@note Function textual ID is "org.opencv.core.math.mask" -@param src input matrix. -@param mask input mask matrix. -*/ -GAPI_EXPORTS_W GMat mask(const GMat& src, const GMat& mask); - -/** @brief Calculates an average (mean) of matrix elements. - -The function mean calculates the mean value M of matrix elements, -independently for each channel, and return it. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.math.mean" -@param src input matrix. -@sa countNonZero, min, max -*/ -GAPI_EXPORTS_W GScalar mean(const GMat& src); - -/** @brief Calculates x and y coordinates of 2D vectors from their magnitude and angle. - -The function polarToCart calculates the Cartesian coordinates of each 2D -vector represented by the corresponding elements of magnitude and angle: -\f[\begin{array}{l} \texttt{x} (I) = \texttt{magnitude} (I) \cos ( \texttt{angle} (I)) \\ \texttt{y} (I) = \texttt{magnitude} (I) \sin ( \texttt{angle} (I)) \\ \end{array}\f] - -The relative accuracy of the estimated coordinates is about 1e-6. - -First output is a matrix of x-coordinates of 2D vectors. -Second output is a matrix of y-coordinates of 2D vectors. -Both output must have the same size and depth as input matrices. - -@note Function textual ID is "org.opencv.core.math.polarToCart" - -@param magnitude input floating-point @ref CV_32FC1 matrix (1xN) of magnitudes of 2D vectors; -@param angle input floating-point @ref CV_32FC1 matrix (1xN) of angles of 2D vectors. -@param angleInDegrees when true, the input angles are measured in -degrees, otherwise, they are measured in radians. -@sa cartToPolar, exp, log, pow, sqrt -*/ -GAPI_EXPORTS_W std::tuple polarToCart(const GMat& magnitude, const GMat& angle, - bool angleInDegrees = false); - -/** @brief Calculates the magnitude and angle of 2D vectors. - -The function cartToPolar calculates either the magnitude, angle, or both -for every 2D vector (x(I),y(I)): -\f[\begin{array}{l} \texttt{magnitude} (I)= \sqrt{\texttt{x}(I)^2+\texttt{y}(I)^2} , \\ \texttt{angle} (I)= \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))[ \cdot180 / \pi ] \end{array}\f] - -The angles are calculated with accuracy about 0.3 degrees. For the point -(0,0), the angle is set to 0. - -First output is a matrix of magnitudes of the same size and depth as input x. -Second output is a matrix of angles that has the same size and depth as -x; the angles are measured in radians (from 0 to 2\*Pi) or in degrees (0 to 360 degrees). - -@note Function textual ID is "org.opencv.core.math.cartToPolar" - -@param x matrix of @ref CV_32FC1 x-coordinates. -@param y array of @ref CV_32FC1 y-coordinates. -@param angleInDegrees a flag, indicating whether the angles are measured -in radians (which is by default), or in degrees. -@sa polarToCart -*/ -GAPI_EXPORTS_W std::tuple cartToPolar(const GMat& x, const GMat& y, - bool angleInDegrees = false); - -/** @brief Calculates the rotation angle of 2D vectors. - -The function cv::phase calculates the rotation angle of each 2D vector that -is formed from the corresponding elements of x and y : -\f[\texttt{angle} (I) = \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))\f] - -The angle estimation accuracy is about 0.3 degrees. When x(I)=y(I)=0 , -the corresponding angle(I) is set to 0. -@param x input floating-point array of x-coordinates of 2D vectors. -@param y input array of y-coordinates of 2D vectors; it must have the -same size and the same type as x. -@param angleInDegrees when true, the function calculates the angle in -degrees, otherwise, they are measured in radians. -@return array of vector angles; it has the same size and same type as x. -*/ -GAPI_EXPORTS_W GMat phase(const GMat& x, const GMat &y, bool angleInDegrees = false); - -/** @brief Calculates a square root of array elements. - -The function cv::gapi::sqrt calculates a square root of each input array element. -In case of multi-channel arrays, each channel is processed -independently. The accuracy is approximately the same as of the built-in -std::sqrt . -@param src input floating-point array. -@return output array of the same size and type as src. -*/ -GAPI_EXPORTS_W GMat sqrt(const GMat &src); - -//! @} gapi_math -//! -//! @addtogroup gapi_pixelwise -//! @{ - -/** @brief Performs the per-element comparison of two matrices checking if elements from first matrix are greater compare to elements in second. - -The function compares elements of two matrices src1 and src2 of the same size: - \f[\texttt{dst} (I) = \texttt{src1} (I) > \texttt{src2} (I)\f] - -When the comparison result is true, the corresponding element of output -array is set to 255. The comparison operations can be replaced with the -equivalent matrix expressions: -\f[\texttt{dst} = \texttt{src1} > \texttt{src2}\f] - -Output matrix of depth @ref CV_8U must have the same size and the same number of channels as - the input matrices/matrix. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpGT" -@param src1 first input matrix. -@param src2 second input matrix/scalar of the same depth as first input matrix. -@sa min, max, threshold, cmpLE, cmpGE, cmpLT -*/ -GAPI_EXPORTS_W GMat cmpGT(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpGTScalar" -*/ -GAPI_EXPORTS_W GMat cmpGT(const GMat& src1, const GScalar& src2); - -/** @brief Performs the per-element comparison of two matrices checking if elements from first matrix are less than elements in second. - -The function compares elements of two matrices src1 and src2 of the same size: - \f[\texttt{dst} (I) = \texttt{src1} (I) < \texttt{src2} (I)\f] - -When the comparison result is true, the corresponding element of output -array is set to 255. The comparison operations can be replaced with the -equivalent matrix expressions: - \f[\texttt{dst} = \texttt{src1} < \texttt{src2}\f] - -Output matrix of depth @ref CV_8U must have the same size and the same number of channels as - the input matrices/matrix. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpLT" -@param src1 first input matrix. -@param src2 second input matrix/scalar of the same depth as first input matrix. -@sa min, max, threshold, cmpLE, cmpGE, cmpGT -*/ -GAPI_EXPORTS_W GMat cmpLT(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpLTScalar" -*/ -GAPI_EXPORTS_W GMat cmpLT(const GMat& src1, const GScalar& src2); - -/** @brief Performs the per-element comparison of two matrices checking if elements from first matrix are greater or equal compare to elements in second. - -The function compares elements of two matrices src1 and src2 of the same size: - \f[\texttt{dst} (I) = \texttt{src1} (I) >= \texttt{src2} (I)\f] - -When the comparison result is true, the corresponding element of output -array is set to 255. The comparison operations can be replaced with the -equivalent matrix expressions: - \f[\texttt{dst} = \texttt{src1} >= \texttt{src2}\f] - -Output matrix of depth @ref CV_8U must have the same size and the same number of channels as - the input matrices. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpGE" -@param src1 first input matrix. -@param src2 second input matrix/scalar of the same depth as first input matrix. -@sa min, max, threshold, cmpLE, cmpGT, cmpLT -*/ -GAPI_EXPORTS_W GMat cmpGE(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpLGEcalar" -*/ -GAPI_EXPORTS_W GMat cmpGE(const GMat& src1, const GScalar& src2); - -/** @brief Performs the per-element comparison of two matrices checking if elements from first matrix are less or equal compare to elements in second. - -The function compares elements of two matrices src1 and src2 of the same size: - \f[\texttt{dst} (I) = \texttt{src1} (I) <= \texttt{src2} (I)\f] - -When the comparison result is true, the corresponding element of output -array is set to 255. The comparison operations can be replaced with the -equivalent matrix expressions: - \f[\texttt{dst} = \texttt{src1} <= \texttt{src2}\f] - -Output matrix of depth @ref CV_8U must have the same size and the same number of channels as - the input matrices. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpLE" -@param src1 first input matrix. -@param src2 second input matrix/scalar of the same depth as first input matrix. -@sa min, max, threshold, cmpGT, cmpGE, cmpLT -*/ -GAPI_EXPORTS_W GMat cmpLE(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpLEScalar" -*/ -GAPI_EXPORTS_W GMat cmpLE(const GMat& src1, const GScalar& src2); - -/** @brief Performs the per-element comparison of two matrices checking if elements from first matrix are equal to elements in second. - -The function compares elements of two matrices src1 and src2 of the same size: - \f[\texttt{dst} (I) = \texttt{src1} (I) == \texttt{src2} (I)\f] - -When the comparison result is true, the corresponding element of output -array is set to 255. The comparison operations can be replaced with the -equivalent matrix expressions: - \f[\texttt{dst} = \texttt{src1} == \texttt{src2}\f] - -Output matrix of depth @ref CV_8U must have the same size and the same number of channels as - the input matrices. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpEQ" -@param src1 first input matrix. -@param src2 second input matrix/scalar of the same depth as first input matrix. -@sa min, max, threshold, cmpNE -*/ -GAPI_EXPORTS_W GMat cmpEQ(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpEQScalar" -*/ -GAPI_EXPORTS_W GMat cmpEQ(const GMat& src1, const GScalar& src2); - -/** @brief Performs the per-element comparison of two matrices checking if elements from first matrix are not equal to elements in second. - -The function compares elements of two matrices src1 and src2 of the same size: - \f[\texttt{dst} (I) = \texttt{src1} (I) != \texttt{src2} (I)\f] - -When the comparison result is true, the corresponding element of output -array is set to 255. The comparison operations can be replaced with the -equivalent matrix expressions: - \f[\texttt{dst} = \texttt{src1} != \texttt{src2}\f] - -Output matrix of depth @ref CV_8U must have the same size and the same number of channels as - the input matrices. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpNE" -@param src1 first input matrix. -@param src2 second input matrix/scalar of the same depth as first input matrix. -@sa min, max, threshold, cmpEQ -*/ -GAPI_EXPORTS_W GMat cmpNE(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.compare.cmpNEScalar" -*/ -GAPI_EXPORTS_W GMat cmpNE(const GMat& src1, const GScalar& src2); - -/** @brief computes bitwise conjunction of the two matrixes (src1 & src2) -Calculates the per-element bit-wise logical conjunction of two matrices of the same size. - -In case of floating-point matrices, their machine-specific bit -representations (usually IEEE754-compliant) are used for the operation. -In case of multi-channel matrices, each channel is processed -independently. Output matrix must have the same size and depth as the input -matrices. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.bitwise_and" - -@param src1 first input matrix. -@param src2 second input matrix. -*/ -GAPI_EXPORTS_W GMat bitwise_and(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.bitwise_andS" -@param src1 first input matrix. -@param src2 scalar, which will be per-lemenetly conjuncted with elements of src1. -*/ -GAPI_EXPORTS_W GMat bitwise_and(const GMat& src1, const GScalar& src2); - -/** @brief computes bitwise disjunction of the two matrixes (src1 | src2) -Calculates the per-element bit-wise logical disjunction of two matrices of the same size. - -In case of floating-point matrices, their machine-specific bit -representations (usually IEEE754-compliant) are used for the operation. -In case of multi-channel matrices, each channel is processed -independently. Output matrix must have the same size and depth as the input -matrices. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.bitwise_or" - -@param src1 first input matrix. -@param src2 second input matrix. -*/ -GAPI_EXPORTS_W GMat bitwise_or(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.bitwise_orS" -@param src1 first input matrix. -@param src2 scalar, which will be per-lemenetly disjuncted with elements of src1. -*/ -GAPI_EXPORTS_W GMat bitwise_or(const GMat& src1, const GScalar& src2); - - -/** @brief computes bitwise logical "exclusive or" of the two matrixes (src1 ^ src2) -Calculates the per-element bit-wise logical "exclusive or" of two matrices of the same size. - -In case of floating-point matrices, their machine-specific bit -representations (usually IEEE754-compliant) are used for the operation. -In case of multi-channel matrices, each channel is processed -independently. Output matrix must have the same size and depth as the input -matrices. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.bitwise_xor" - -@param src1 first input matrix. -@param src2 second input matrix. -*/ -GAPI_EXPORTS_W GMat bitwise_xor(const GMat& src1, const GMat& src2); -/** @overload -@note Function textual ID is "org.opencv.core.pixelwise.bitwise_xorS" -@param src1 first input matrix. -@param src2 scalar, for which per-lemenet "logical or" operation on elements of src1 will be performed. -*/ -GAPI_EXPORTS_W GMat bitwise_xor(const GMat& src1, const GScalar& src2); - - -/** @brief Inverts every bit of an array. - -The function bitwise_not calculates per-element bit-wise inversion of the input -matrix: -\f[\texttt{dst} (I) = \neg \texttt{src} (I)\f] - -In case of floating-point matrices, their machine-specific bit -representations (usually IEEE754-compliant) are used for the operation. -In case of multi-channel matrices, each channel is processed -independently. Output matrix must have the same size and depth as the input -matrix. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.bitwise_not" - -@param src input matrix. -*/ -GAPI_EXPORTS_W GMat bitwise_not(const GMat& src); - -/** @brief Select values from either first or second of input matrices by given mask. -The function set to the output matrix either the value from the first input matrix if corresponding value of mask matrix is 255, - or value from the second input matrix (if value of mask matrix set to 0). - -Input mask matrix must be of @ref CV_8UC1 type, two other inout matrices and output matrix should be of the same type. The size should -be the same for all input and output matrices. -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.pixelwise.select" - -@param src1 first input matrix. -@param src2 second input matrix. -@param mask mask input matrix. -*/ -GAPI_EXPORTS_W GMat select(const GMat& src1, const GMat& src2, const GMat& mask); - -//! @} gapi_pixelwise - - -//! @addtogroup gapi_matrixop -//! @{ -/** @brief Calculates per-element minimum of two matrices. - -The function min calculates the per-element minimum of two matrices of the same size, number of channels and depth: -\f[\texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{src2} (I))\f] - where I is a multi-dimensional index of matrix elements. In case of - multi-channel matrices, each channel is processed independently. -Output matrix must be of the same size and depth as src1. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.min" -@param src1 first input matrix. -@param src2 second input matrix of the same size and depth as src1. -@sa max, cmpEQ, cmpLT, cmpLE -*/ -GAPI_EXPORTS_W GMat min(const GMat& src1, const GMat& src2); - -/** @brief Calculates per-element maximum of two matrices. - -The function max calculates the per-element maximum of two matrices of the same size, number of channels and depth: -\f[\texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{src2} (I))\f] - where I is a multi-dimensional index of matrix elements. In case of - multi-channel matrices, each channel is processed independently. -Output matrix must be of the same size and depth as src1. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.max" -@param src1 first input matrix. -@param src2 second input matrix of the same size and depth as src1. -@sa min, compare, cmpEQ, cmpGT, cmpGE -*/ -GAPI_EXPORTS_W GMat max(const GMat& src1, const GMat& src2); - -/** @brief Calculates the per-element absolute difference between two matrices. - -The function absDiff calculates absolute difference between two matrices of the same size and depth: - \f[\texttt{dst}(I) = \texttt{saturate} (| \texttt{src1}(I) - \texttt{src2}(I)|)\f] - where I is a multi-dimensional index of matrix elements. In case of - multi-channel matrices, each channel is processed independently. -Output matrix must have the same size and depth as input matrices. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.absdiff" -@param src1 first input matrix. -@param src2 second input matrix. -@sa abs -*/ -GAPI_EXPORTS_W GMat absDiff(const GMat& src1, const GMat& src2); - -/** @brief Calculates absolute value of matrix elements. - -The function abs calculates absolute difference between matrix elements and given scalar value: - \f[\texttt{dst}(I) = \texttt{saturate} (| \texttt{src1}(I) - \texttt{matC}(I)|)\f] - where matC is constructed from given scalar c and has the same sizes and depth as input matrix src. - -Output matrix must be of the same size and depth as src. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.absdiffC" -@param src input matrix. -@param c scalar to be subtracted. -@sa min, max -*/ -GAPI_EXPORTS_W GMat absDiffC(const GMat& src, const GScalar& c); - -/** @brief Calculates sum of all matrix elements. - -The function sum calculates sum of all matrix elements, independently for each channel. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.sum" -@param src input matrix. -@sa countNonZero, mean, min, max -*/ -GAPI_EXPORTS_W GScalar sum(const GMat& src); - -/** @brief Counts non-zero array elements. - -The function returns the number of non-zero elements in src : -\f[\sum _{I: \; \texttt{src} (I) \ne0 } 1\f] - -Supported matrix data types are @ref CV_8UC1, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.countNonZero" -@param src input single-channel matrix. -@sa mean, min, max -*/ -GAPI_EXPORTS_W GOpaque countNonZero(const GMat& src); - -/** @brief Calculates the weighted sum of two matrices. - -The function addWeighted calculates the weighted sum of two matrices as follows: -\f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I)* \texttt{alpha} + \texttt{src2} (I)* \texttt{beta} + \texttt{gamma} )\f] -where I is a multi-dimensional index of array elements. In case of multi-channel matrices, each -channel is processed independently. - -The function can be replaced with a matrix expression: - \f[\texttt{dst}(I) = \texttt{alpha} * \texttt{src1}(I) - \texttt{beta} * \texttt{src2}(I) + \texttt{gamma} \f] - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.addweighted" -@param src1 first input matrix. -@param alpha weight of the first matrix elements. -@param src2 second input matrix of the same size and channel number as src1. -@param beta weight of the second matrix elements. -@param gamma scalar added to each sum. -@param ddepth optional depth of the output matrix. -@sa add, sub -*/ -GAPI_EXPORTS_W GMat addWeighted(const GMat& src1, double alpha, const GMat& src2, double beta, double gamma, int ddepth = -1); - -/** @brief Calculates the absolute L1 norm of a matrix. - -This version of normL1 calculates the absolute L1 norm of src. - -As example for one array consider the function \f$r(x)= \begin{pmatrix} x \\ 1-x \end{pmatrix}, x \in [-1;1]\f$. -The \f$ L_{1} \f$ norm for the sample value \f$r(-1) = \begin{pmatrix} -1 \\ 2 \end{pmatrix}\f$ -is calculated as follows -\f{align*} - \| r(-1) \|_{L_1} &= |-1| + |2| = 3 \\ -\f} -and for \f$r(0.5) = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix}\f$ the calculation is -\f{align*} - \| r(0.5) \|_{L_1} &= |0.5| + |0.5| = 1 \\ -\f} - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.norml1" -@param src input matrix. -@sa normL2, normInf -*/ -GAPI_EXPORTS_W GScalar normL1(const GMat& src); - -/** @brief Calculates the absolute L2 norm of a matrix. - -This version of normL2 calculates the absolute L2 norm of src. - -As example for one array consider the function \f$r(x)= \begin{pmatrix} x \\ 1-x \end{pmatrix}, x \in [-1;1]\f$. -The \f$ L_{2} \f$ norm for the sample value \f$r(-1) = \begin{pmatrix} -1 \\ 2 \end{pmatrix}\f$ -is calculated as follows -\f{align*} - \| r(-1) \|_{L_2} &= \sqrt{(-1)^{2} + (2)^{2}} = \sqrt{5} \\ -\f} -and for \f$r(0.5) = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix}\f$ the calculation is -\f{align*} - \| r(0.5) \|_{L_2} &= \sqrt{(0.5)^{2} + (0.5)^{2}} = \sqrt{0.5} \\ -\f} - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. -@note Function textual ID is "org.opencv.core.matrixop.norml2" -@param src input matrix. -@sa normL1, normInf -*/ -GAPI_EXPORTS_W GScalar normL2(const GMat& src); - -/** @brief Calculates the absolute infinite norm of a matrix. - -This version of normInf calculates the absolute infinite norm of src. - -As example for one array consider the function \f$r(x)= \begin{pmatrix} x \\ 1-x \end{pmatrix}, x \in [-1;1]\f$. -The \f$ L_{\infty} \f$ norm for the sample value \f$r(-1) = \begin{pmatrix} -1 \\ 2 \end{pmatrix}\f$ -is calculated as follows -\f{align*} - \| r(-1) \|_{L_\infty} &= \max(|-1|,|2|) = 2 -\f} -and for \f$r(0.5) = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix}\f$ the calculation is -\f{align*} - \| r(0.5) \|_{L_\infty} &= \max(|0.5|,|0.5|) = 0.5. -\f} - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.core.matrixop.norminf" -@param src input matrix. -@sa normL1, normL2 -*/ -GAPI_EXPORTS_W GScalar normInf(const GMat& src); - -/** @brief Calculates the integral of an image. - -The function calculates one or more integral images for the source image as follows: - -\f[\texttt{sum} (X,Y) = \sum _{x integral(const GMat& src, int sdepth = -1, int sqdepth = -1); - -/** @brief Applies a fixed-level threshold to each matrix element. - -The function applies fixed-level thresholding to a single- or multiple-channel matrix. -The function is typically used to get a bi-level (binary) image out of a grayscale image ( cmp functions could be also used for -this purpose) or for removing a noise, that is, filtering out pixels with too small or too large -values. There are several types of thresholding supported by the function. They are determined by -type parameter. - -Also, the special values cv::THRESH_OTSU or cv::THRESH_TRIANGLE may be combined with one of the -above values. In these cases, the function determines the optimal threshold value using the Otsu's -or Triangle algorithm and uses it instead of the specified thresh . The function returns the -computed threshold value in addititon to thresholded matrix. -The Otsu's and Triangle methods are implemented only for 8-bit matrices. - -Input image should be single channel only in case of cv::THRESH_OTSU or cv::THRESH_TRIANGLE flags. -Output matrix must be of the same size and depth as src. - -@note Function textual ID is "org.opencv.core.matrixop.threshold" - -@param src input matrix (@ref CV_8UC1, @ref CV_8UC3, or @ref CV_32FC1). -@param thresh threshold value. -@param maxval maximum value to use with the cv::THRESH_BINARY and cv::THRESH_BINARY_INV thresholding -types. -@param type thresholding type (see the cv::ThresholdTypes). - -@sa min, max, cmpGT, cmpLE, cmpGE, cmpLT - */ -GAPI_EXPORTS_W GMat threshold(const GMat& src, const GScalar& thresh, const GScalar& maxval, int type); -/** @overload -This function applicable for all threshold types except cv::THRESH_OTSU and cv::THRESH_TRIANGLE -@note Function textual ID is "org.opencv.core.matrixop.thresholdOT" -*/ -GAPI_EXPORTS_W std::tuple threshold(const GMat& src, const GScalar& maxval, int type); - -/** @brief Applies a range-level threshold to each matrix element. - -The function applies range-level thresholding to a single- or multiple-channel matrix. -It sets output pixel value to OxFF if the corresponding pixel value of input matrix is in specified range,or 0 otherwise. - -Input and output matrices must be CV_8UC1. - -@note Function textual ID is "org.opencv.core.matrixop.inRange" - -@param src input matrix (CV_8UC1). -@param threshLow lower boundary value. -@param threshUp upper boundary value. - -@sa threshold - */ -GAPI_EXPORTS_W GMat inRange(const GMat& src, const GScalar& threshLow, const GScalar& threshUp); - -//! @} gapi_matrixop - -//! @addtogroup gapi_transform -//! @{ -/** @brief Creates one 4-channel matrix out of 4 single-channel ones. - -The function merges several matrices to make a single multi-channel matrix. That is, each -element of the output matrix will be a concatenation of the elements of the input matrices, where -elements of i-th input matrix are treated as mv[i].channels()-element vectors. -Output matrix must be of @ref CV_8UC4 type. - -The function split4 does the reverse operation. - -@note - - Function textual ID is "org.opencv.core.transform.merge4" - -@param src1 first input @ref CV_8UC1 matrix to be merged. -@param src2 second input @ref CV_8UC1 matrix to be merged. -@param src3 third input @ref CV_8UC1 matrix to be merged. -@param src4 fourth input @ref CV_8UC1 matrix to be merged. -@sa merge3, split4, split3 -*/ -GAPI_EXPORTS_W GMat merge4(const GMat& src1, const GMat& src2, const GMat& src3, const GMat& src4); - -/** @brief Creates one 3-channel matrix out of 3 single-channel ones. - -The function merges several matrices to make a single multi-channel matrix. That is, each -element of the output matrix will be a concatenation of the elements of the input matrices, where -elements of i-th input matrix are treated as mv[i].channels()-element vectors. -Output matrix must be of @ref CV_8UC3 type. - -The function split3 does the reverse operation. - -@note - - Function textual ID is "org.opencv.core.transform.merge3" - -@param src1 first input @ref CV_8UC1 matrix to be merged. -@param src2 second input @ref CV_8UC1 matrix to be merged. -@param src3 third input @ref CV_8UC1 matrix to be merged. -@sa merge4, split4, split3 -*/ -GAPI_EXPORTS_W GMat merge3(const GMat& src1, const GMat& src2, const GMat& src3); - -/** @brief Divides a 4-channel matrix into 4 single-channel matrices. - -The function splits a 4-channel matrix into 4 single-channel matrices: -\f[\texttt{mv} [c](I) = \texttt{src} (I)_c\f] - -All output matrices must be of @ref CV_8UC1 type. - -The function merge4 does the reverse operation. - -@note - - Function textual ID is "org.opencv.core.transform.split4" - -@param src input @ref CV_8UC4 matrix. -@sa split3, merge3, merge4 -*/ -GAPI_EXPORTS_W std::tuple split4(const GMat& src); - -/** @brief Divides a 3-channel matrix into 3 single-channel matrices. - -The function splits a 3-channel matrix into 3 single-channel matrices: -\f[\texttt{mv} [c](I) = \texttt{src} (I)_c\f] - -All output matrices must be of @ref CV_8UC1 type. - -The function merge3 does the reverse operation. - -@note - - Function textual ID is "org.opencv.core.transform.split3" - -@param src input @ref CV_8UC3 matrix. -@sa split4, merge3, merge4 -*/ -GAPI_EXPORTS_W std::tuple split3(const GMat& src); - -/** @brief Applies a generic geometrical transformation to an image. - -The function remap transforms the source image using the specified map: - -\f[\texttt{dst} (x,y) = \texttt{src} (map_x(x,y),map_y(x,y))\f] - -where values of pixels with non-integer coordinates are computed using one of available -interpolation methods. \f$map_x\f$ and \f$map_y\f$ can be encoded as separate floating-point maps -in \f$map_1\f$ and \f$map_2\f$ respectively, or interleaved floating-point maps of \f$(x,y)\f$ in -\f$map_1\f$, or fixed-point maps created by using convertMaps. The reason you might want to -convert from floating to fixed-point representations of a map is that they can yield much faster -(\~2x) remapping operations. In the converted case, \f$map_1\f$ contains pairs (cvFloor(x), -cvFloor(y)) and \f$map_2\f$ contains indices in a table of interpolation coefficients. -Output image must be of the same size and depth as input one. - -@note - - Function textual ID is "org.opencv.core.transform.remap" - - Due to current implementation limitations the size of an input and output images should be less than 32767x32767. - -@param src Source image. -@param map1 The first map of either (x,y) points or just x values having the type CV_16SC2, -CV_32FC1, or CV_32FC2. -@param map2 The second map of y values having the type CV_16UC1, CV_32FC1, or none (empty map -if map1 is (x,y) points), respectively. -@param interpolation Interpolation method (see cv::InterpolationFlags). The methods #INTER_AREA -and #INTER_LINEAR_EXACT are not supported by this function. -@param borderMode Pixel extrapolation method (see cv::BorderTypes). When -borderMode=BORDER_TRANSPARENT, it means that the pixels in the destination image that -corresponds to the "outliers" in the source image are not modified by the function. -@param borderValue Value used in case of a constant border. By default, it is 0. - */ -GAPI_EXPORTS_W GMat remap(const GMat& src, const Mat& map1, const Mat& map2, - int interpolation, int borderMode = BORDER_CONSTANT, - const Scalar& borderValue = Scalar()); - -/** @brief Flips a 2D matrix around vertical, horizontal, or both axes. - -The function flips the matrix in one of three different ways (row -and column indices are 0-based): -\f[\texttt{dst} _{ij} = -\left\{ -\begin{array}{l l} -\texttt{src} _{\texttt{src.rows}-i-1,j} & if\; \texttt{flipCode} = 0 \\ -\texttt{src} _{i, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} > 0 \\ -\texttt{src} _{ \texttt{src.rows} -i-1, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} < 0 \\ -\end{array} -\right.\f] -The example scenarios of using the function are the following: -* Vertical flipping of the image (flipCode == 0) to switch between - top-left and bottom-left image origin. This is a typical operation - in video processing on Microsoft Windows\* OS. -* Horizontal flipping of the image with the subsequent horizontal - shift and absolute difference calculation to check for a - vertical-axis symmetry (flipCode \> 0). -* Simultaneous horizontal and vertical flipping of the image with - the subsequent shift and absolute difference calculation to check - for a central symmetry (flipCode \< 0). -* Reversing the order of point arrays (flipCode \> 0 or - flipCode == 0). -Output image must be of the same depth as input one, size should be correct for given flipCode. - -@note Function textual ID is "org.opencv.core.transform.flip" - -@param src input matrix. -@param flipCode a flag to specify how to flip the array; 0 means -flipping around the x-axis and positive value (for example, 1) means -flipping around y-axis. Negative value (for example, -1) means flipping -around both axes. -@sa remap -*/ -GAPI_EXPORTS_W GMat flip(const GMat& src, int flipCode); - -/** @brief Crops a 2D matrix. - -The function crops the matrix by given cv::Rect. - -Output matrix must be of the same depth as input one, size is specified by given rect size. - -@note Function textual ID is "org.opencv.core.transform.crop" - -@param src input matrix. -@param rect a rect to crop a matrix to -@sa resize -*/ -GAPI_EXPORTS_W GMat crop(const GMat& src, const Rect& rect); - -/** @brief Applies horizontal concatenation to given matrices. - -The function horizontally concatenates two GMat matrices (with the same number of rows). -@code{.cpp} - GMat A = { 1, 4, - 2, 5, - 3, 6 }; - GMat B = { 7, 10, - 8, 11, - 9, 12 }; - - GMat C = gapi::concatHor(A, B); - //C: - //[1, 4, 7, 10; - // 2, 5, 8, 11; - // 3, 6, 9, 12] -@endcode -Output matrix must the same number of rows and depth as the src1 and src2, and the sum of cols of the src1 and src2. -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.imgproc.transform.concatHor" - -@param src1 first input matrix to be considered for horizontal concatenation. -@param src2 second input matrix to be considered for horizontal concatenation. -@sa concatVert -*/ -GAPI_EXPORTS_W GMat concatHor(const GMat& src1, const GMat& src2); - -/** @overload -The function horizontally concatenates given number of GMat matrices (with the same number of columns). -Output matrix must the same number of columns and depth as the input matrices, and the sum of rows of input matrices. - -@param v vector of input matrices to be concatenated horizontally. -*/ -GAPI_EXPORTS_W GMat concatHor(const std::vector &v); - -/** @brief Applies vertical concatenation to given matrices. - -The function vertically concatenates two GMat matrices (with the same number of cols). - @code{.cpp} - GMat A = { 1, 7, - 2, 8, - 3, 9 }; - GMat B = { 4, 10, - 5, 11, - 6, 12 }; - - GMat C = gapi::concatVert(A, B); - //C: - //[1, 7; - // 2, 8; - // 3, 9; - // 4, 10; - // 5, 11; - // 6, 12] - @endcode - -Output matrix must the same number of cols and depth as the src1 and src2, and the sum of rows of the src1 and src2. -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. - -@note Function textual ID is "org.opencv.imgproc.transform.concatVert" - -@param src1 first input matrix to be considered for vertical concatenation. -@param src2 second input matrix to be considered for vertical concatenation. -@sa concatHor -*/ -GAPI_EXPORTS_W GMat concatVert(const GMat& src1, const GMat& src2); - -/** @overload -The function vertically concatenates given number of GMat matrices (with the same number of columns). -Output matrix must the same number of columns and depth as the input matrices, and the sum of rows of input matrices. - -@param v vector of input matrices to be concatenated vertically. -*/ -GAPI_EXPORTS_W GMat concatVert(const std::vector &v); - - -/** @brief Performs a look-up table transform of a matrix. - -The function LUT fills the output matrix with values from the look-up table. Indices of the entries -are taken from the input matrix. That is, the function processes each element of src as follows: -\f[\texttt{dst} (I) \leftarrow \texttt{lut(src(I))}\f] - -Supported matrix data types are @ref CV_8UC1. -Output is a matrix of the same size and number of channels as src, and the same depth as lut. - -@note Function textual ID is "org.opencv.core.transform.LUT" - -@param src input matrix of 8-bit elements. -@param lut look-up table of 256 elements; in case of multi-channel input array, the table should -either have a single channel (in this case the same table is used for all channels) or the same -number of channels as in the input matrix. -*/ -GAPI_EXPORTS_W GMat LUT(const GMat& src, const Mat& lut); - -/** @brief Converts a matrix to another data depth with optional scaling. - -The method converts source pixel values to the target data depth. saturate_cast\<\> is applied at -the end to avoid possible overflows: - -\f[m(x,y) = saturate \_ cast( \alpha (*this)(x,y) + \beta )\f] -Output matrix must be of the same size as input one. - -@note Function textual ID is "org.opencv.core.transform.convertTo" -@param src input matrix to be converted from. -@param rdepth desired output matrix depth or, rather, the depth since the number of channels are the -same as the input has; if rdepth is negative, the output matrix will have the same depth as the input. -@param alpha optional scale factor. -@param beta optional delta added to the scaled values. - */ -GAPI_EXPORTS_W GMat convertTo(const GMat& src, int rdepth, double alpha=1, double beta=0); - -/** @brief Normalizes the norm or value range of an array. - -The function normalizes scale and shift the input array elements so that -\f[\| \texttt{dst} \| _{L_p}= \texttt{alpha}\f] -(where p=Inf, 1 or 2) when normType=NORM_INF, NORM_L1, or NORM_L2, respectively; or so that -\f[\min _I \texttt{dst} (I)= \texttt{alpha} , \, \, \max _I \texttt{dst} (I)= \texttt{beta}\f] -when normType=NORM_MINMAX (for dense arrays only). - -@note Function textual ID is "org.opencv.core.normalize" - -@param src input array. -@param alpha norm value to normalize to or the lower range boundary in case of the range -normalization. -@param beta upper range boundary in case of the range normalization; it is not used for the norm -normalization. -@param norm_type normalization type (see cv::NormTypes). -@param ddepth when negative, the output array has the same type as src; otherwise, it has the same -number of channels as src and the depth =ddepth. -@sa norm, Mat::convertTo -*/ -GAPI_EXPORTS_W GMat normalize(const GMat& src, double alpha, double beta, - int norm_type, int ddepth = -1); - -/** @brief Applies a perspective transformation to an image. - -The function warpPerspective transforms the source image using the specified matrix: - -\f[\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , - \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right )\f] - -when the flag #WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted with invert -and then put in the formula above instead of M. The function cannot operate in-place. - -@param src input image. -@param M \f$3\times 3\f$ transformation matrix. -@param dsize size of the output image. -@param flags combination of interpolation methods (#INTER_LINEAR or #INTER_NEAREST) and the -optional flag #WARP_INVERSE_MAP, that sets M as the inverse transformation ( -\f$\texttt{dst}\rightarrow\texttt{src}\f$ ). -@param borderMode pixel extrapolation method (#BORDER_CONSTANT or #BORDER_REPLICATE). -@param borderValue value used in case of a constant border; by default, it equals 0. - -@sa warpAffine, resize, remap, getRectSubPix, perspectiveTransform - */ -GAPI_EXPORTS_W GMat warpPerspective(const GMat& src, const Mat& M, const Size& dsize, int flags = cv::INTER_LINEAR, - int borderMode = cv::BORDER_CONSTANT, const Scalar& borderValue = Scalar()); - -/** @brief Applies an affine transformation to an image. - -The function warpAffine transforms the source image using the specified matrix: - -\f[\texttt{dst} (x,y) = \texttt{src} ( \texttt{M} _{11} x + \texttt{M} _{12} y + \texttt{M} _{13}, \texttt{M} _{21} x + \texttt{M} _{22} y + \texttt{M} _{23})\f] - -when the flag #WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted -with #invertAffineTransform and then put in the formula above instead of M. The function cannot -operate in-place. - -@param src input image. -@param M \f$2\times 3\f$ transformation matrix. -@param dsize size of the output image. -@param flags combination of interpolation methods (see #InterpolationFlags) and the optional -flag #WARP_INVERSE_MAP that means that M is the inverse transformation ( -\f$\texttt{dst}\rightarrow\texttt{src}\f$ ). -@param borderMode pixel extrapolation method (see #BorderTypes); -borderMode=#BORDER_TRANSPARENT isn't supported -@param borderValue value used in case of a constant border; by default, it is 0. - -@sa warpPerspective, resize, remap, getRectSubPix, transform - */ -GAPI_EXPORTS_W GMat warpAffine(const GMat& src, const Mat& M, const Size& dsize, int flags = cv::INTER_LINEAR, - int borderMode = cv::BORDER_CONSTANT, const Scalar& borderValue = Scalar()); -//! @} gapi_transform - -/** @brief Finds centers of clusters and groups input samples around the clusters. - -The function kmeans implements a k-means algorithm that finds the centers of K clusters -and groups the input samples around the clusters. As an output, \f$\texttt{bestLabels}_i\f$ -contains a 0-based cluster index for the \f$i^{th}\f$ sample. - -@note - - Function textual ID is "org.opencv.core.kmeansND" - - In case of an N-dimentional points' set given, input GMat can have the following traits: -2 dimensions, a single row or column if there are N channels, -or N columns if there is a single channel. Mat should have @ref CV_32F depth. - - Although, if GMat with height != 1, width != 1, channels != 1 given as data, n-dimensional -samples are considered given in amount of A, where A = height, n = width * channels. - - In case of GMat given as data: - - the output labels are returned as 1-channel GMat with sizes -width = 1, height = A, where A is samples amount, or width = bestLabels.width, -height = bestLabels.height if bestLabels given; - - the cluster centers are returned as 1-channel GMat with sizes -width = n, height = K, where n is samples' dimentionality and K is clusters' amount. - - As one of possible usages, if you want to control the initial labels for each attempt -by yourself, you can utilize just the core of the function. To do that, set the number -of attempts to 1, initialize labels each time using a custom algorithm, pass them with the -( flags = #KMEANS_USE_INITIAL_LABELS ) flag, and then choose the best (most-compact) clustering. - -@param data Data for clustering. An array of N-Dimensional points with float coordinates is needed. -Function can take GArray, GArray for 2D and 3D cases or GMat for any -dimentionality and channels. -@param K Number of clusters to split the set by. -@param bestLabels Optional input integer array that can store the supposed initial cluster indices -for every sample. Used when ( flags = #KMEANS_USE_INITIAL_LABELS ) flag is set. -@param criteria The algorithm termination criteria, that is, the maximum number of iterations -and/or the desired accuracy. The accuracy is specified as criteria.epsilon. As soon as each of -the cluster centers moves by less than criteria.epsilon on some iteration, the algorithm stops. -@param attempts Flag to specify the number of times the algorithm is executed using different -initial labellings. The algorithm returns the labels that yield the best compactness (see the first -function return value). -@param flags Flag that can take values of cv::KmeansFlags . - -@return - - Compactness measure that is computed as -\f[\sum _i \| \texttt{samples} _i - \texttt{centers} _{ \texttt{labels} _i} \| ^2\f] -after every attempt. The best (minimum) value is chosen and the corresponding labels and the -compactness value are returned by the function. - - Integer array that stores the cluster indices for every sample. - - Array of the cluster centers. -*/ -GAPI_EXPORTS_W std::tuple,GMat,GMat> -kmeans(const GMat& data, const int K, const GMat& bestLabels, - const TermCriteria& criteria, const int attempts, const KmeansFlags flags); - -/** @overload -@note - - Function textual ID is "org.opencv.core.kmeansNDNoInit" - - #KMEANS_USE_INITIAL_LABELS flag must not be set while using this overload. - */ -GAPI_EXPORTS_W std::tuple,GMat,GMat> -kmeans(const GMat& data, const int K, const TermCriteria& criteria, const int attempts, - const KmeansFlags flags); - -/** @overload -@note Function textual ID is "org.opencv.core.kmeans2D" - */ -GAPI_EXPORTS_W std::tuple,GArray,GArray> -kmeans(const GArray& data, const int K, const GArray& bestLabels, - const TermCriteria& criteria, const int attempts, const KmeansFlags flags); - -/** @overload -@note Function textual ID is "org.opencv.core.kmeans3D" - */ -GAPI_EXPORTS_W std::tuple,GArray,GArray> -kmeans(const GArray& data, const int K, const GArray& bestLabels, - const TermCriteria& criteria, const int attempts, const KmeansFlags flags); - - -/** @brief Transposes a matrix. - -The function transposes the matrix: -\f[\texttt{dst} (i,j) = \texttt{src} (j,i)\f] - -@note - - Function textual ID is "org.opencv.core.transpose" - - No complex conjugation is done in case of a complex matrix. It should be done separately if needed. - -@param src input array. -*/ -GAPI_EXPORTS_W GMat transpose(const GMat& src); - - -namespace streaming { -/** @brief Gets dimensions from Mat. - -@note Function textual ID is "org.opencv.streaming.size" - -@param src Input tensor -@return Size (tensor dimensions). -*/ -GAPI_EXPORTS_W GOpaque size(const GMat& src); - -/** @overload -Gets dimensions from rectangle. - -@note Function textual ID is "org.opencv.streaming.sizeR" - -@param r Input rectangle. -@return Size (rectangle dimensions). -*/ -GAPI_EXPORTS_W GOpaque size(const GOpaque& r); - -/** @brief Gets dimensions from MediaFrame. - -@note Function textual ID is "org.opencv.streaming.sizeMF" - -@param src Input frame -@return Size (frame dimensions). -*/ -GAPI_EXPORTS_W GOpaque size(const GFrame& src); -} //namespace streaming -} //namespace gapi -} //namespace cv - -#endif //OPENCV_GAPI_CORE_HPP diff --git a/modules/gapi/include/opencv2/gapi/cpu/core.hpp b/modules/gapi/include/opencv2/gapi/cpu/core.hpp deleted file mode 100644 index ee86fb72c2..0000000000 --- a/modules/gapi/include/opencv2/gapi/cpu/core.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_CPU_CORE_API_HPP -#define OPENCV_GAPI_CPU_CORE_API_HPP - -#include // GKernelPackage -#include // GAPI_EXPORTS - -namespace cv { -namespace gapi { -namespace core { -namespace cpu { - -GAPI_EXPORTS_W cv::GKernelPackage kernels(); - -} // namespace cpu -} // namespace core -} // namespace gapi -} // namespace cv - - -#endif // OPENCV_GAPI_CPU_CORE_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/cpu/gcpukernel.hpp b/modules/gapi/include/opencv2/gapi/cpu/gcpukernel.hpp deleted file mode 100644 index eb5f784747..0000000000 --- a/modules/gapi/include/opencv2/gapi/cpu/gcpukernel.hpp +++ /dev/null @@ -1,542 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2022 Intel Corporation - - -#ifndef OPENCV_GAPI_GCPUKERNEL_HPP -#define OPENCV_GAPI_GCPUKERNEL_HPP - -#if defined _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4702) // "Unreachable code" on postprocess(...) call inside OCVCallHelper -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include //suppress_unused_warning -#include - -// FIXME: namespace scheme for backends? -namespace cv { - -namespace gimpl -{ - // Forward-declare an internal class - class GCPUExecutable; -} // namespace gimpl - -namespace gapi -{ -/** - * @brief This namespace contains G-API CPU backend functions, - * structures, and symbols. - */ -namespace cpu -{ - /** - * \addtogroup gapi_std_backends - * @{ - * - * @brief G-API backends available in this OpenCV version - * - * G-API backends play a corner stone role in G-API execution - * stack. Every backend is hardware-oriented and thus can run its - * kernels efficiently on the target platform. - * - * Backends are usually "black boxes" for G-API users -- on the API - * side, all backends are represented as different objects of the - * same class cv::gapi::GBackend. - * User can manipulate with backends by specifying which kernels to use. - * - * @sa @ref gapi_hld - */ - - /** - * @brief Get a reference to CPU (OpenCV) backend. - * - * This is the default backend in G-API at the moment, providing - * broader functional coverage but losing some graph model - * advantages. Provided mostly for reference and prototyping - * purposes. - * - * @sa gapi_std_backends - */ - GAPI_EXPORTS cv::gapi::GBackend backend(); - /** @} */ - - class GOCVFunctor; - - //! @cond IGNORED - template - GOCVFunctor ocv_kernel(const Callable& c); - - template - GOCVFunctor ocv_kernel(Callable& c); - //! @endcond - -} // namespace cpu -} // namespace gapi - -// Represents arguments which are passed to a wrapped CPU function -// FIXME: put into detail? -class GAPI_EXPORTS GCPUContext -{ -public: - // Generic accessor API - template - const T& inArg(int input) { return m_args.at(input).get(); } - - // Syntax sugar - const cv::Mat& inMat(int input); - cv::Mat& outMatR(int output); // FIXME: Avoid cv::Mat m = ctx.outMatR() - - const cv::Scalar& inVal(int input); - cv::Scalar& outValR(int output); // FIXME: Avoid cv::Scalar s = ctx.outValR() - cv::MediaFrame& outFrame(int output); - template std::vector& outVecR(int output) // FIXME: the same issue - { - return outVecRef(output).wref(); - } - template T& outOpaqueR(int output) // FIXME: the same issue - { - return outOpaqueRef(output).wref(); - } - - GArg state() - { - return m_state; - } - -protected: - detail::VectorRef& outVecRef(int output); - detail::OpaqueRef& outOpaqueRef(int output); - - std::vector m_args; - GArg m_state; - - //FIXME: avoid conversion of arguments from internal representation to OpenCV one on each call - //to OCV kernel. (This can be achieved by a two single time conversions in GCPUExecutable::run, - //once on enter for input and output arguments, and once before return for output arguments only - std::unordered_map m_results; - - friend class gimpl::GCPUExecutable; -}; - -class GAPI_EXPORTS GCPUKernel -{ -public: - // This function is a kernel's execution entry point (does the processing work) - using RunF = std::function; - // This function is a stateful kernel's setup routine (configures state) - using SetupF = std::function; - - GCPUKernel(); - GCPUKernel(const RunF& runF, const SetupF& setupF = nullptr); - - RunF m_runF = nullptr; - SetupF m_setupF = nullptr; - - bool m_isStateful = false; -}; - -// FIXME: This is an ugly ad-hoc implementation. TODO: refactor - -namespace detail -{ -template struct get_in; -template<> struct get_in -{ - static cv::Mat get(GCPUContext &ctx, int idx) { return ctx.inMat(idx); } -}; -template<> struct get_in -{ - static cv::Mat get(GCPUContext &ctx, int idx) { return get_in::get(ctx, idx); } -}; -template<> struct get_in -{ - static cv::MediaFrame get(GCPUContext &ctx, int idx) { return ctx.inArg(idx); } -}; -template<> struct get_in -{ - static cv::Scalar get(GCPUContext &ctx, int idx) { return ctx.inVal(idx); } -}; -template struct get_in > -{ - static const std::vector& get(GCPUContext &ctx, int idx) { return ctx.inArg(idx).rref(); } -}; -template struct get_in > -{ - static const U& get(GCPUContext &ctx, int idx) { return ctx.inArg(idx).rref(); } -}; - -//FIXME(dm): GArray/GArray conversion should be done more gracefully in the system -template<> struct get_in >: public get_in > -{ -}; - -//FIXME(dm): GArray/GArray conversion should be done more gracefully in the system -template<> struct get_in >: public get_in > -{ -}; - -// FIXME(dm): GArray>/GArray> conversion should be done more gracefully in the system -template struct get_in> >: public get_in> > -{ -}; - -//FIXME(dm): GOpaque/GOpaque conversion should be done more gracefully in the system -template<> struct get_in >: public get_in > -{ -}; - -//FIXME(dm): GOpaque/GOpaque conversion should be done more gracefully in the system -template<> struct get_in >: public get_in > -{ -}; - -template struct get_in -{ - static T get(GCPUContext &ctx, int idx) { return ctx.inArg(idx); } -}; - -struct tracked_cv_mat{ - tracked_cv_mat(cv::Mat& m) : r{m}, original_data{m.data} {} - cv::Mat r; - uchar* original_data; - - operator cv::Mat& (){ return r;} - void validate() const{ - if (r.data != original_data) - { - util::throw_error - (std::logic_error - ("OpenCV kernel output parameter was reallocated. \n" - "Incorrect meta data was provided ?")); - } - } -}; - -template -void postprocess(Outputs&... outs) -{ - struct - { - void operator()(tracked_cv_mat* bm) { bm->validate(); } - void operator()(...) { } - - } validate; - //dummy array to unfold parameter pack - int dummy[] = { 0, (validate(&outs), 0)... }; - cv::util::suppress_unused_warning(dummy); -} - -template struct get_out; -template<> struct get_out -{ - static tracked_cv_mat get(GCPUContext &ctx, int idx) - { - auto& r = ctx.outMatR(idx); - return {r}; - } -}; -template<> struct get_out -{ - static tracked_cv_mat get(GCPUContext &ctx, int idx) - { - return get_out::get(ctx, idx); - } -}; -template<> struct get_out -{ - static cv::Scalar& get(GCPUContext &ctx, int idx) - { - return ctx.outValR(idx); - } -}; -template<> struct get_out -{ - static cv::MediaFrame& get(GCPUContext &ctx, int idx) - { - return ctx.outFrame(idx); - } -}; -template struct get_out> -{ - static std::vector& get(GCPUContext &ctx, int idx) - { - return ctx.outVecR(idx); - } -}; - -//FIXME(dm): GArray/GArray conversion should be done more gracefully in the system -template<> struct get_out >: public get_out > -{ -}; - -// FIXME(dm): GArray>/GArray> conversion should be done more gracefully in the system -template struct get_out> >: public get_out> > -{ -}; - -template struct get_out> -{ - static U& get(GCPUContext &ctx, int idx) - { - return ctx.outOpaqueR(idx); - } -}; - -template -struct OCVSetupHelper; - -template -struct OCVSetupHelper> -{ - // Using 'auto' return type and 'decltype' specifier in both 'setup_impl' versions - // to check existence of required 'Impl::setup' functions. - // While 'decltype' specifier accepts expression we pass expression with 'comma-operator' - // where first operand of comma-operator is call attempt to desired 'Impl::setup' and - // the second operand is 'void()' expression. - // - // SFINAE for 'Impl::setup' which accepts compile arguments. - template - static auto setup_impl(const GMetaArgs &metaArgs, const GArgs &args, - GArg &state, const GCompileArgs &compileArgs, - detail::Seq) -> - decltype(Impl::setup(detail::get_in_meta(metaArgs, args, IIs)..., - std::declval - >::type - >(), - compileArgs) - , void()) - { - // TODO: unique_ptr <-> shared_ptr conversion ? - // To check: Conversion is possible only if the state which should be passed to - // 'setup' user callback isn't required to have previous value - std::shared_ptr stPtr; - Impl::setup(detail::get_in_meta(metaArgs, args, IIs)..., stPtr, compileArgs); - state = GArg(stPtr); - } - - // SFINAE for 'Impl::setup' which doesn't accept compile arguments. - template - static auto setup_impl(const GMetaArgs &metaArgs, const GArgs &args, - GArg &state, const GCompileArgs &/* compileArgs */, - detail::Seq) -> - decltype(Impl::setup(detail::get_in_meta(metaArgs, args, IIs)..., - std::declval - >::type - >() - ) - , void()) - { - // The same comment as in 'setup' above. - std::shared_ptr stPtr; - Impl::setup(detail::get_in_meta(metaArgs, args, IIs)..., stPtr); - state = GArg(stPtr); - } - - static void setup(const GMetaArgs &metaArgs, const GArgs &args, - GArg& state, const GCompileArgs &compileArgs) - { - setup_impl(metaArgs, args, state, compileArgs, - typename detail::MkSeq::type()); - } -}; - -// OCVCallHelper is a helper class to call stateless OCV kernels and OCV kernel functors. -template -struct OCVCallHelper; - -// FIXME: probably can be simplified with std::apply or analogue. -template -struct OCVCallHelper, std::tuple> -{ - template - struct call_and_postprocess - { - template - static void call(Inputs&&... ins, Outputs&&... outs) - { - //not using a std::forward on outs is deliberate in order to - //cause compilation error, by trying to bind rvalue references to lvalue references - Impl::run(std::forward(ins)..., outs...); - postprocess(outs...); - } - - template - static void call(Impl& impl, Inputs&&... ins, Outputs&&... outs) - { - impl(std::forward(ins)..., outs...); - } - }; - - template - static void call_impl(GCPUContext &ctx, detail::Seq, detail::Seq) - { - //Make sure that OpenCV kernels do not reallocate memory for output parameters - //by comparing it's state (data ptr) before and after the call. - //This is done by converting each output Mat into tracked_cv_mat object, and binding - //them to parameters of ad-hoc function - call_and_postprocess::get(ctx, IIs))...> - ::call(get_in::get(ctx, IIs)..., get_out::get(ctx, OIs)...); - } - - template - static void call_impl(cv::GCPUContext &ctx, Impl& impl, - detail::Seq, detail::Seq) - { - call_and_postprocess::get(ctx, IIs))...> - ::call(impl, get_in::get(ctx, IIs)..., get_out::get(ctx, OIs)...); - } - - static void call(GCPUContext &ctx) - { - call_impl(ctx, - typename detail::MkSeq::type(), - typename detail::MkSeq::type()); - } - - // NB: Same as call but calling the object - // This necessary for kernel implementations that have a state - // and are represented as an object - static void callFunctor(cv::GCPUContext &ctx, Impl& impl) - { - call_impl(ctx, impl, - typename detail::MkSeq::type(), - typename detail::MkSeq::type()); - } -}; - -// OCVStCallHelper is a helper class to call stateful OCV kernels. -template -struct OCVStCallHelper; - -template -struct OCVStCallHelper, std::tuple> : - OCVCallHelper, std::tuple> -{ - template - struct call_and_postprocess - { - template - static void call(typename Impl::State& st, Inputs&&... ins, Outputs&&... outs) - { - Impl::run(std::forward(ins)..., outs..., st); - postprocess(outs...); - } - }; - - template - static void call_impl(GCPUContext &ctx, detail::Seq, detail::Seq) - { - auto& st = *ctx.state().get>(); - call_and_postprocess::get(ctx, IIs))...> - ::call(st, get_in::get(ctx, IIs)..., get_out::get(ctx, OIs)...); - } - - static void call(GCPUContext &ctx) - { - call_impl(ctx, - typename detail::MkSeq::type(), - typename detail::MkSeq::type()); - } -}; - -} // namespace detail - -template -class GCPUKernelImpl: public cv::detail::KernelTag -{ - using CallHelper = cv::detail::OCVCallHelper; - -public: - using API = K; - - static cv::gapi::GBackend backend() { return cv::gapi::cpu::backend(); } - static cv::GCPUKernel kernel() { return GCPUKernel(&CallHelper::call); } -}; - -template -class GCPUStKernelImpl: public cv::detail::KernelTag -{ - using StSetupHelper = detail::OCVSetupHelper; - using StCallHelper = detail::OCVStCallHelper; - -public: - using API = K; - using State = S; - - static cv::gapi::GBackend backend() { return cv::gapi::cpu::backend(); } - static cv::GCPUKernel kernel() { return GCPUKernel(&StCallHelper::call, - &StSetupHelper::setup); } -}; - -#define GAPI_OCV_KERNEL(Name, API) struct Name: public cv::GCPUKernelImpl - -// TODO: Reuse Anatoliy's logic for support of types with commas in macro. -// Retrieve the common part from Anatoliy's logic to the separate place. -#define GAPI_OCV_KERNEL_ST(Name, API, State) \ - struct Name: public cv::GCPUStKernelImpl \ - -/// @private -class gapi::cpu::GOCVFunctor : public gapi::GFunctor -{ -public: - using Impl = std::function; - using Meta = cv::GKernel::M; - - GOCVFunctor(const char* id, const Meta &meta, const Impl& impl) - : gapi::GFunctor(id), impl_{GCPUKernel(impl), meta} - { - } - - GKernelImpl impl() const override { return impl_; } - gapi::GBackend backend() const override { return gapi::cpu::backend(); } - -private: - GKernelImpl impl_; -}; - -//! @cond IGNORED -template -gapi::cpu::GOCVFunctor gapi::cpu::ocv_kernel(Callable& c) -{ - using P = cv::detail::OCVCallHelper; - return GOCVFunctor{ K::id() - , &K::getOutMeta - , std::bind(&P::callFunctor, std::placeholders::_1, std::ref(c)) - }; -} - -template -gapi::cpu::GOCVFunctor gapi::cpu::ocv_kernel(const Callable& c) -{ - using P = cv::detail::OCVCallHelper; - return GOCVFunctor{ K::id() - , &K::getOutMeta - , std::bind(&P::callFunctor, std::placeholders::_1, c) - }; -} -//! @endcond - -} // namespace cv - -#if defined _MSC_VER -#pragma warning(pop) -#endif - -#endif // OPENCV_GAPI_GCPUKERNEL_HPP diff --git a/modules/gapi/include/opencv2/gapi/cpu/imgproc.hpp b/modules/gapi/include/opencv2/gapi/cpu/imgproc.hpp deleted file mode 100644 index 0b96db08ae..0000000000 --- a/modules/gapi/include/opencv2/gapi/cpu/imgproc.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_CPU_IMGPROC_API_HPP -#define OPENCV_GAPI_CPU_IMGPROC_API_HPP - -#include // GAPI_EXPORTS -#include // GKernelPackage - -namespace cv { -namespace gapi { -namespace imgproc { -namespace cpu { - -GAPI_EXPORTS GKernelPackage kernels(); - -} // namespace cpu -} // namespace imgproc -} // namespace gapi -} // namespace cv - - -#endif // OPENCV_GAPI_CPU_IMGPROC_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/cpu/ot.hpp b/modules/gapi/include/opencv2/gapi/cpu/ot.hpp deleted file mode 100644 index 03dbe904cc..0000000000 --- a/modules/gapi/include/opencv2/gapi/cpu/ot.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_CPU_OT_API_HPP -#define OPENCV_GAPI_CPU_OT_API_HPP - -#include // GAPI_EXPORTS -#include // GKernelPackage - -namespace cv { -namespace gapi { -/** - * @brief This namespace contains G-API Operation Types for - * VAS Object Tracking module functionality. - */ -namespace ot { -namespace cpu { -GAPI_EXPORTS_W GKernelPackage kernels(); -} // namespace cpu -} // namespace ot -} // namespace gapi -} // namespace cv - - -#endif // OPENCV_GAPI_CPU_OT_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/cpu/stereo.hpp b/modules/gapi/include/opencv2/gapi/cpu/stereo.hpp deleted file mode 100644 index e2a2242bd0..0000000000 --- a/modules/gapi/include/opencv2/gapi/cpu/stereo.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_CPU_STEREO_API_HPP -#define OPENCV_GAPI_CPU_STEREO_API_HPP - -#include // GKernelPackage - -namespace cv { -namespace gapi { -namespace calib3d { -namespace cpu { - -GAPI_EXPORTS GKernelPackage kernels(); - -/** @brief Structure for the Stereo operation initialization parameters.*/ -struct GAPI_EXPORTS StereoInitParam { - StereoInitParam(int nD, int bS, double bL, double f): - numDisparities(nD), blockSize(bS), baseline(bL), focus(f) {} - - StereoInitParam() = default; - - int numDisparities = 0; - int blockSize = 21; - double baseline = 63.5; - double focus = 3.6; -}; - -} // namespace cpu -} // namespace calib3d -} // namespace gapi - -namespace detail { - - template<> struct CompileArgTag { - static const char* tag() { - return "org.opencv.stereoInit"; - } -}; - -} // namespace detail -} // namespace cv - - -#endif // OPENCV_GAPI_CPU_STEREO_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/cpu/video.hpp b/modules/gapi/include/opencv2/gapi/cpu/video.hpp deleted file mode 100644 index d3c1f2e670..0000000000 --- a/modules/gapi/include/opencv2/gapi/cpu/video.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - -#ifndef OPENCV_GAPI_CPU_VIDEO_API_HPP -#define OPENCV_GAPI_CPU_VIDEO_API_HPP - -#include // GKernelPackage - -namespace cv { -namespace gapi { -namespace video { -namespace cpu { - -GAPI_EXPORTS GKernelPackage kernels(); - -} // namespace cpu -} // namespace video -} // namespace gapi -} // namespace cv - - -#endif // OPENCV_GAPI_CPU_VIDEO_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/fluid/core.hpp b/modules/gapi/include/opencv2/gapi/fluid/core.hpp deleted file mode 100644 index a4329d6f50..0000000000 --- a/modules/gapi/include/opencv2/gapi/fluid/core.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_FLUID_CORE_HPP -#define OPENCV_GAPI_FLUID_CORE_HPP - -#include // GKernelPackage -#include // GAPI_EXPORTS - -namespace cv { namespace gapi { namespace core { namespace fluid { - -GAPI_EXPORTS_W cv::GKernelPackage kernels(); - -}}}} - -#endif // OPENCV_GAPI_FLUID_CORE_HPP diff --git a/modules/gapi/include/opencv2/gapi/fluid/gfluidbuffer.hpp b/modules/gapi/include/opencv2/gapi/fluid/gfluidbuffer.hpp deleted file mode 100644 index 551f0a398f..0000000000 --- a/modules/gapi/include/opencv2/gapi/fluid/gfluidbuffer.hpp +++ /dev/null @@ -1,154 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_FLUID_BUFFER_HPP -#define OPENCV_GAPI_FLUID_BUFFER_HPP - -#include -#include // accumulate -#include // ostream -#include // uint8_t - -#include -#include - -#include - -namespace cv { -namespace gapi { -namespace fluid { - -struct Border -{ - // This constructor is required to support existing kernels which are part of G-API - Border(int _type, cv::Scalar _val) : type(_type), value(_val) {} - - int type; - cv::Scalar value; -}; - -using BorderOpt = util::optional; - -bool operator == (const Border& b1, const Border& b2); - -class GAPI_EXPORTS Buffer; - -class GAPI_EXPORTS View -{ -public: - struct Cache - { - std::vector m_linePtrs; - GMatDesc m_desc; - int m_border_size = 0; - - inline const uint8_t* linePtr(int index) const - { - // "out_of_window" check: - // user must not request the lines which are outside of specified kernel window - GAPI_DbgAssert(index >= -m_border_size - && index < -m_border_size + static_cast(m_linePtrs.size())); - return m_linePtrs[index + m_border_size]; - } - }; - - const inline uint8_t* InLineB(int index) const // -(w-1)/2...0...+(w-1)/2 for Filters - { - return m_cache->linePtr(index); - } - - template const inline T* InLine(int i) const - { - const uint8_t* ptr = this->InLineB(i); - return reinterpret_cast(ptr); - } - - inline operator bool() const { return m_priv != nullptr; } - bool ready() const; - inline int length() const { return m_cache->m_desc.size.width; } - int y() const; - - inline const GMatDesc& meta() const { return m_cache->m_desc; } - - class GAPI_EXPORTS Priv; // internal use only - Priv& priv(); // internal use only - const Priv& priv() const; // internal use only - - View(); - View(std::unique_ptr&& p); - View(View&& v); - View& operator=(View&& v); - ~View(); - -private: - std::unique_ptr m_priv; - const Cache* m_cache = nullptr; -}; - -class GAPI_EXPORTS Buffer -{ -public: - struct Cache - { - std::vector m_linePtrs; - GMatDesc m_desc; - }; - - // Default constructor (executable creation stage, - // all following initialization performed in Priv::init()) - Buffer(); - // Scratch constructor (user kernels) - Buffer(const cv::GMatDesc &desc); - - // Constructor for intermediate buffers (for tests) - Buffer(const cv::GMatDesc &desc, - int max_line_consumption, int border_size, - int skew, - int wlpi, - BorderOpt border); - // Constructor for in/out buffers (for tests) - Buffer(const cv::Mat &data, bool is_input); - ~Buffer(); - Buffer& operator=(Buffer&&); - - inline uint8_t* OutLineB(int index = 0) - { - return m_cache->m_linePtrs[index]; - } - - template inline T* OutLine(int index = 0) - { - uint8_t* ptr = this->OutLineB(index); - return reinterpret_cast(ptr); - } - - int y() const; - - int linesReady() const; - void debug(std::ostream &os) const; - inline int length() const { return m_cache->m_desc.size.width; } - int lpi() const; // LPI for WRITER - - inline const GMatDesc& meta() const { return m_cache->m_desc; } - - View mkView(int borderSize, bool ownStorage); - void addView(const View* v); - - class GAPI_EXPORTS Priv; // internal use only - Priv& priv(); // internal use only - const Priv& priv() const; // internal use only - -private: - std::unique_ptr m_priv; - const Cache* m_cache; -}; - -} // namespace cv::gapi::fluid -} // namespace cv::gapi -} // namespace cv - -#endif // OPENCV_GAPI_FLUID_BUFFER_HPP diff --git a/modules/gapi/include/opencv2/gapi/fluid/gfluidkernel.hpp b/modules/gapi/include/opencv2/gapi/fluid/gfluidkernel.hpp deleted file mode 100644 index c3ae9dfdd6..0000000000 --- a/modules/gapi/include/opencv2/gapi/fluid/gfluidkernel.hpp +++ /dev/null @@ -1,442 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2019 Intel Corporation - - -#ifndef OPENCV_GAPI_FLUID_KERNEL_HPP -#define OPENCV_GAPI_FLUID_KERNEL_HPP - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -// FIXME: namespace scheme for backends? -namespace cv { - -namespace gapi -{ -/** - * @brief This namespace contains G-API Fluid backend functions, structures, and symbols. - */ -namespace fluid -{ - /** - * \addtogroup gapi_std_backends G-API Standard Backends - * @{ - */ - /** - * @brief Get a reference to Fluid backend. - * - * @sa gapi_std_backends - */ - GAPI_EXPORTS cv::gapi::GBackend backend(); - /** @} */ -} // namespace fluid -} // namespace gapi - - -class GAPI_EXPORTS GFluidKernel -{ -public: - enum class Kind - { - Filter, - Resize, - YUV420toRGB //Color conversion of 4:2:0 chroma sub-sampling formats (NV12, I420 ..etc) to RGB - }; - - // This function is a generic "doWork" callback - using F = std::function &)>; - - // This function is a generic "initScratch" callback - using IS = std::function; - - // This function is a generic "resetScratch" callback - using RS = std::function; - - // This function describes kernel metadata inference rule. - using M = std::function; - - // This function is a generic "getBorder" callback (extracts border-related data from kernel's input parameters) - using B = std::function; - - // This function is a generic "getWindow" callback (extracts window-related data from kernel's input parameters) - using GW = std::function; - - // FIXME: move implementations out of header file - GFluidKernel() {} - GFluidKernel(Kind k, int l, bool scratch, const F& f, const IS &is, const RS &rs, const B& b, const GW& win) - : m_kind(k) - , m_lpi(l) - , m_scratch(scratch) - , m_f(f) - , m_is(is) - , m_rs(rs) - , m_b(b) - , m_gw(win) {} - - Kind m_kind; - const int m_lpi = -1; - const bool m_scratch = false; - - const F m_f; - const IS m_is; - const RS m_rs; - const B m_b; - const GW m_gw; -}; - -// FIXME!!! -// This is the temporary and experimental API -// which should be replaced by runtime roi-based scheduling -/** \addtogroup gapi_compile_args - * @{ - */ -/** - * @brief This structure allows to control the output image region - * which Fluid backend will produce in the graph. - * - * This feature is useful for external tiling and parallelism, but - * will be deprecated in the future releases. - */ -struct GFluidOutputRois -{ - std::vector rois; -}; - -/** - * @brief This structure forces Fluid backend to generate multiple - * parallel output regions in the graph. These regions execute in parallel. - * - * This feature may be deprecated in the future releases. - */ -struct GFluidParallelOutputRois -{ - std::vector parallel_rois; -}; - -/** - * @brief This structure allows to customize the way how Fluid executes - * parallel regions. - * - * For example, user can utilize his own threading runtime via this parameter. - * The `parallel_for` member functor is called by the Fluid runtime with the - * following arguments: - * - * @param size Size of the parallel range to process - * @param f A function which should be called for every integer index - * in this range by the specified parallel_for implementation. - * - * This feature may be deprecated in the future releases. - */ -struct GFluidParallelFor -{ - //this function accepts: - // - size of the "parallel" range as the first argument - // - and a function to be called on the range items, designated by item index - std::function)> parallel_for; -}; -/** @} gapi_compile_args */ - -namespace detail -{ -template<> struct CompileArgTag -{ - static const char* tag() { return "gapi.fluid.outputRois"; } -}; - -template<> struct CompileArgTag -{ - static const char* tag() { return "gapi.fluid.parallelFor"; } -}; - -template<> struct CompileArgTag -{ - static const char* tag() { return "gapi.fluid.parallelOutputRois"; } -}; - -} // namespace detail - -namespace detail -{ -template struct fluid_get_in; -template<> struct fluid_get_in -{ - static const cv::gapi::fluid::View& get(const cv::GArgs &in_args, int idx) - { - return *in_args[idx].unsafe_get(); - } -}; - -template<> struct fluid_get_in -{ - // FIXME: change to return by reference when moved to own::Scalar - static cv::Scalar get(const cv::GArgs &in_args, int idx) - { - return in_args[idx].unsafe_get(); - } -}; - -template struct fluid_get_in> -{ - static const std::vector& get(const cv::GArgs &in_args, int idx) - { - return in_args.at(idx).unsafe_get().rref(); - } -}; - -template struct fluid_get_in> -{ - static const U& get(const cv::GArgs &in_args, int idx) - { - return in_args.at(idx).unsafe_get().rref(); - } -}; - -template struct fluid_get_in -{ - static const T& get(const cv::GArgs &in_args, int idx) - { - return in_args[idx].unsafe_get(); - } -}; - -template -struct scratch_helper; - -template -struct scratch_helper -{ - // Init - template - static void help_init_impl(const cv::GMetaArgs &metas, - const cv::GArgs &in_args, - gapi::fluid::Buffer &scratch_buf, - detail::Seq) - { - Impl::initScratch(get_in_meta(metas, in_args, IIs)..., scratch_buf); - } - - static void help_init(const cv::GMetaArgs &metas, - const cv::GArgs &in_args, - gapi::fluid::Buffer &b) - { - help_init_impl(metas, in_args, b, typename detail::MkSeq::type()); - } - - // Reset - static void help_reset(gapi::fluid::Buffer &b) - { - Impl::resetScratch(b); - } -}; - -template -struct scratch_helper -{ - static void help_init(const cv::GMetaArgs &, - const cv::GArgs &, - gapi::fluid::Buffer &) - { - GAPI_Error("InternalError"); - } - static void help_reset(gapi::fluid::Buffer &) - { - GAPI_Error("InternalError"); - } -}; - -template struct is_gmat_type -{ - static const constexpr bool value = std::is_same::value; -}; - -template -struct get_border_helper; - -template -struct get_border_helper -{ - template - static gapi::fluid::BorderOpt get_border_impl(const GMetaArgs &metas, - const cv::GArgs &in_args, - cv::detail::Seq) - { - return util::make_optional(Impl::getBorder(cv::detail::get_in_meta(metas, in_args, IIs)...)); - } - - static gapi::fluid::BorderOpt help(const GMetaArgs &metas, - const cv::GArgs &in_args) - { - return get_border_impl(metas, in_args, typename detail::MkSeq::type()); - } -}; - -template -struct get_border_helper -{ - static gapi::fluid::BorderOpt help(const cv::GMetaArgs &, - const cv::GArgs &) - { - return {}; - } -}; - -template -struct get_window_helper; - -template -struct get_window_helper -{ - template - static int get_window_impl(const GMetaArgs &metas, - const cv::GArgs &in_args, - cv::detail::Seq) - { - return Impl::getWindow(cv::detail::get_in_meta(metas, in_args, IIs)...); - } - - static int help(const GMetaArgs &metas, const cv::GArgs &in_args) - { - return get_window_impl(metas, in_args, typename detail::MkSeq::type()); - } -}; - -template -struct get_window_helper -{ - static int help(const cv::GMetaArgs &, - const cv::GArgs &) - { - return Impl::Window; - } -}; - -template -struct has_Window -{ -private: - template - static constexpr auto Check(U*) -> typename std::is_same::type; - - template - static constexpr std::false_type Check(...); - - typedef decltype(Check(0)) Result; - -public: - static constexpr bool value = Result::value; -}; - -template -struct callCustomGetBorder; - -template -struct callCustomGetBorder -{ - static constexpr bool value = (Impl::Window != 1); -}; - -template -struct callCustomGetBorder -{ - static constexpr bool value = true; -}; - -template -struct FluidCallHelper; - -template -struct FluidCallHelper, std::tuple, UseScratch> -{ - static_assert(all_satisfy::value, "return type must be GMat"); - static_assert(contains::value, "input must contain at least one GMat"); - - // Execution dispatcher //////////////////////////////////////////////////// - template - static void call_impl(const cv::GArgs &in_args, - const std::vector &out_bufs, - detail::Seq, - detail::Seq) - { - Impl::run(fluid_get_in::get(in_args, IIs)..., *out_bufs[OIs]...); - } - - static void call(const cv::GArgs &in_args, - const std::vector &out_bufs) - { - constexpr int numOuts = (sizeof...(Outs)) + (UseScratch ? 1 : 0); - call_impl(in_args, out_bufs, - typename detail::MkSeq::type(), - typename detail::MkSeq::type()); - } - - // Scratch buffer initialization dispatcher //////////////////////////////// - static void init_scratch(const GMetaArgs &metas, - const cv::GArgs &in_args, - gapi::fluid::Buffer &b) - { - scratch_helper::help_init(metas, in_args, b); - } - - // Scratch buffer reset dispatcher ///////////////////////////////////////// - static void reset_scratch(gapi::fluid::Buffer &scratch_buf) - { - scratch_helper::help_reset(scratch_buf); - } - - static gapi::fluid::BorderOpt getBorder(const GMetaArgs &metas, const cv::GArgs &in_args) - { - constexpr bool hasWindow = has_Window::value; - - // User must provide "init" callback if Window != 1 - // TODO: move to constexpr if when we enable C++17 - return get_border_helper::value, Impl, Ins...>::help(metas, in_args); - } - - static int getWindow(const GMetaArgs &metas, const cv::GArgs &in_args) - { - constexpr bool callCustomGetWindow = !(has_Window::value); - return get_window_helper::help(metas, in_args); - } -}; -} // namespace detail - - -template -class GFluidKernelImpl : public cv::detail::KernelTag -{ - static const int LPI = 1; - static const auto Kind = GFluidKernel::Kind::Filter; - using P = detail::FluidCallHelper; - -public: - using API = K; - - static GFluidKernel kernel() - { - // FIXME: call() and getOutMeta() needs to be renamed so it is clear these - // functions are internal wrappers, not user API - return GFluidKernel(Impl::Kind, Impl::LPI, - UseScratch, - &P::call, &P::init_scratch, &P::reset_scratch, &P::getBorder, &P::getWindow); - } - - static cv::gapi::GBackend backend() { return cv::gapi::fluid::backend(); } -}; - -#define GAPI_FLUID_KERNEL(Name, API, Scratch) struct Name: public cv::GFluidKernelImpl - -} // namespace cv - -#endif // OPENCV_GAPI_GCPUKERNEL_HPP diff --git a/modules/gapi/include/opencv2/gapi/fluid/imgproc.hpp b/modules/gapi/include/opencv2/gapi/fluid/imgproc.hpp deleted file mode 100644 index a4e8ac0f99..0000000000 --- a/modules/gapi/include/opencv2/gapi/fluid/imgproc.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_FLUID_IMGPROC_HPP -#define OPENCV_GAPI_FLUID_IMGPROC_HPP - -#include // GKernelPackage -#include // GAPI_EXPORTS - -namespace cv { namespace gapi { namespace imgproc { namespace fluid { - -GAPI_EXPORTS_W GKernelPackage kernels(); - -}}}} - -#endif // OPENCV_GAPI_FLUID_IMGPROC_HPP diff --git a/modules/gapi/include/opencv2/gapi/garg.hpp b/modules/gapi/include/opencv2/gapi/garg.hpp deleted file mode 100644 index 2a8315f9d8..0000000000 --- a/modules/gapi/include/opencv2/gapi/garg.hpp +++ /dev/null @@ -1,311 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2021 Intel Corporation - - -#ifndef OPENCV_GAPI_GARG_HPP -#define OPENCV_GAPI_GARG_HPP - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace cv { - -class GArg; - -namespace detail { - template - using is_garg = std::is_same::type>; -} - -// Parameter holder class for a node -// Depending on platform capabilities, can either support arbitrary types -// (as `boost::any`) or a limited number of types (as `boot::variant`). -// FIXME: put into "details" as a user shouldn't use it in his code -class GAPI_EXPORTS GArg -{ -public: - GArg() {} - - template::value, int>::type = 0> - explicit GArg(const T &t) - : kind(detail::GTypeTraits::kind) - , opaque_kind(detail::GOpaqueTraits::kind) - , value(detail::wrap_gapi_helper::wrap(t)) - { - } - - template::value, int>::type = 0> - explicit GArg(T &&t) - : kind(detail::GTypeTraits::type>::kind) - , opaque_kind(detail::GOpaqueTraits::type>::kind) - , value(detail::wrap_gapi_helper::wrap(t)) - { - } - - template inline T& get() - { - return util::any_cast::type>(value); - } - - template inline const T& get() const - { - return util::any_cast::type>(value); - } - - template inline T& unsafe_get() - { - return util::unsafe_any_cast::type>(value); - } - - template inline const T& unsafe_get() const - { - return util::unsafe_any_cast::type>(value); - } - - detail::ArgKind kind = detail::ArgKind::OPAQUE_VAL; - detail::OpaqueKind opaque_kind = detail::OpaqueKind::CV_UNKNOWN; - -protected: - util::any value; -}; - -using GArgs = std::vector; - -// FIXME: Express as M::type -// FIXME: Move to a separate file! -using GRunArgBase = util::variant< -#if !defined(GAPI_STANDALONE) - cv::UMat, -#endif // !defined(GAPI_STANDALONE) - cv::RMat, - cv::gapi::wip::IStreamSource::Ptr, - cv::Mat, - cv::Scalar, - cv::detail::VectorRef, - cv::detail::OpaqueRef, - cv::MediaFrame - >; - -namespace detail { -template -struct in_variant; - -template -struct in_variant > - : std::integral_constant::value > { -}; -} // namespace detail - -struct GAPI_EXPORTS GRunArg: public GRunArgBase -{ - // Metadata information here - using Meta = std::unordered_map; - Meta meta; - - // Mimic the old GRunArg semantics here, old of the times when - // GRunArg was an alias to variant<> - GRunArg(); - GRunArg(const cv::GRunArg &arg); - GRunArg(cv::GRunArg &&arg); - - GRunArg& operator= (const GRunArg &arg); - GRunArg& operator= (GRunArg &&arg); - - template - GRunArg(const T &t, - const Meta &m = Meta{}, - typename std::enable_if< detail::in_variant::value, int>::type = 0) - : GRunArgBase(t) - , meta(m) - { - } - template - GRunArg(T &&t, - const Meta &m = Meta{}, - typename std::enable_if< detail::in_variant::value, int>::type = 0) - : GRunArgBase(std::move(t)) - , meta(m) - { - } - template auto operator= (const T &t) - -> typename std::enable_if< detail::in_variant::value, cv::GRunArg>::type& - { - GRunArgBase::operator=(t); - return *this; - } - template auto operator= (T&& t) - -> typename std::enable_if< detail::in_variant::value, cv::GRunArg>::type& - { - GRunArgBase::operator=(std::move(t)); - return *this; - } -}; -using GRunArgs = std::vector; - -// TODO: Think about the addition operator -/** - * @brief This operator allows to complement the input vector at runtime. - * - * It's an ordinary overload of addition assignment operator. - * - * Example of usage: - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/dynamic_graph_snippets.cpp GRunArgs usage - * - */ -inline GRunArgs& operator += (GRunArgs &lhs, const GRunArgs &rhs) -{ - lhs.reserve(lhs.size() + rhs.size()); - lhs.insert(lhs.end(), rhs.begin(), rhs.end()); - return lhs; -} - -namespace gapi -{ -namespace wip -{ -/** - * @brief This aggregate type represents all types which G-API can - * handle (via variant). - * - * It only exists to overcome C++ language limitations (where a - * `using`-defined class can't be forward-declared). - */ -struct GAPI_EXPORTS Data: public GRunArg -{ - using GRunArg::GRunArg; - template - Data& operator= (const T& t) { GRunArg::operator=(t); return *this; } - template - Data& operator= (T&& t) { GRunArg::operator=(std::move(t)); return *this; } -}; -} // namespace wip -} // namespace gapi - -using GRunArgP = util::variant< -#if !defined(GAPI_STANDALONE) - cv::UMat*, -#endif // !defined(GAPI_STANDALONE) - cv::Mat*, - cv::RMat*, - cv::Scalar*, - cv::MediaFrame*, - cv::detail::VectorRef, - cv::detail::OpaqueRef - >; -using GRunArgsP = std::vector; - -// TODO: Think about the addition operator -/** - * @brief This operator allows to complement the output vector at runtime. - * - * It's an ordinary overload of addition assignment operator. - * - * Example of usage: - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/dynamic_graph_snippets.cpp GRunArgsP usage - * - */ -inline GRunArgsP& operator += (GRunArgsP &lhs, const GRunArgsP &rhs) -{ - lhs.reserve(lhs.size() + rhs.size()); - lhs.insert(lhs.end(), rhs.begin(), rhs.end()); - return lhs; -} - -namespace gapi -{ -/** - * \addtogroup gapi_serialization - * @{ - * - * @brief G-API functions and classes for serialization and deserialization. - */ - -/** @brief Wraps deserialized output GRunArgs to GRunArgsP which can be used by GCompiled. - * - * Since it's impossible to get modifiable output arguments from deserialization - * it needs to be wrapped by this function. - * - * Example of usage: - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp bind after deserialization - * - * @param out_args deserialized GRunArgs. - * @return the same GRunArgs wrapped in GRunArgsP. - * @see deserialize - */ -GAPI_EXPORTS cv::GRunArgsP bind(cv::GRunArgs &out_args); - -/** @brief Wraps output GRunArgsP available during graph execution to GRunArgs which can be serialized. - * - * GRunArgsP is pointer-to-value, so to be serialized they need to be binded to real values - * which this function does. - * - * Example of usage: - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp bind before serialization - * - * @param out output GRunArgsP available during graph execution. - * @return the same GRunArgsP wrapped in serializable GRunArgs. - * @see serialize - */ -GAPI_EXPORTS cv::GRunArg bind(cv::GRunArgP &out); // FIXME: think more about it -/** @} */ -} - -template inline GRunArgs gin(const Ts&... args) -{ - return GRunArgs{ GRunArg(detail::wrap_host_helper::wrap_in(args))... }; -} - -template inline GRunArgsP gout(Ts&... args) -{ - return GRunArgsP{ GRunArgP(detail::wrap_host_helper::wrap_out(args))... }; -} - -struct GTypeInfo; -using GTypesInfo = std::vector; - -// FIXME: Needed for python bridge, must be moved to more appropriate header -namespace detail { -struct ExtractArgsCallback -{ - cv::GRunArgs operator()(const cv::GTypesInfo& info) const { return c(info); } - using CallBackT = std::function; - CallBackT c; -}; - -struct ExtractMetaCallback -{ - cv::GMetaArgs operator()(const cv::GTypesInfo& info) const { return c(info); } - using CallBackT = std::function; - CallBackT c; -}; - -void constructGraphOutputs(const cv::GTypesInfo &out_info, - cv::GRunArgs &args, - cv::GRunArgsP &outs); -} // namespace detail - -} // namespace cv - -#endif // OPENCV_GAPI_GARG_HPP diff --git a/modules/gapi/include/opencv2/gapi/garray.hpp b/modules/gapi/include/opencv2/gapi/garray.hpp deleted file mode 100644 index a2951993f2..0000000000 --- a/modules/gapi/include/opencv2/gapi/garray.hpp +++ /dev/null @@ -1,440 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GARRAY_HPP -#define OPENCV_GAPI_GARRAY_HPP - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include // flatten_g only! -#include // flatten_g only! - -namespace cv -{ -// Forward declaration; GNode and GOrigin are an internal -// (user-inaccessible) classes. -class GNode; -struct GOrigin; -template class GArray; - -/** - * \addtogroup gapi_meta_args - * @{ - */ -struct GAPI_EXPORTS_W_SIMPLE GArrayDesc -{ - // FIXME: Body - // FIXME: Also implement proper operator== then - bool operator== (const GArrayDesc&) const { return true; } -}; -template GArrayDesc descr_of(const std::vector &) { return {};} -GAPI_EXPORTS_W inline GArrayDesc empty_array_desc() {return {}; } -/** @} */ - -std::ostream& operator<<(std::ostream& os, const cv::GArrayDesc &desc); - -namespace detail -{ - // ConstructVec is a callback which stores information about T and is used by - // G-API runtime to construct arrays in host memory (T remains opaque for G-API). - // ConstructVec is carried into G-API internals by GArrayU. - // Currently it is suitable for Host (CPU) plugins only, real offload may require - // more information for manual memory allocation on-device. - class VectorRef; - using ConstructVec = std::function; - - // This is the base struct for GArrayU type holder - struct TypeHintBase{virtual ~TypeHintBase() = default;}; - - // This class holds type of initial GArray to be checked from GArrayU - template - struct TypeHint final : public TypeHintBase{}; - - // This class strips type information from GArray and makes it usable - // in the G-API graph compiler (expression unrolling, graph generation, etc). - // Part of GProtoArg. - class GAPI_EXPORTS GArrayU - { - public: - GArrayU(const GNode &n, std::size_t out); // Operation result constructor - - template - bool holds() const; // Check if was created from GArray - - GOrigin& priv(); // Internal use only - const GOrigin& priv() const; // Internal use only - - protected: - GArrayU(); // Default constructor - GArrayU(const detail::VectorRef& vref); // Constant value constructor - template friend class cv::GArray; // (available to GArray only) - - void setConstructFcn(ConstructVec &&cv); // Store T-aware constructor - - template - void specifyType(); // Store type of initial GArray - - template - void storeKind(); - - void setKind(cv::detail::OpaqueKind); - - std::shared_ptr m_priv; - std::shared_ptr m_hint; - }; - - template - bool GArrayU::holds() const{ - GAPI_Assert(m_hint != nullptr); - using U = typename std::decay::type; - return dynamic_cast*>(m_hint.get()) != nullptr; - } - - template - void GArrayU::specifyType(){ - m_hint.reset(new TypeHint::type>); - } - - template - void GArrayU::storeKind(){ - setKind(cv::detail::GOpaqueTraits::kind); - } - - // This class represents a typed STL vector reference. - // Depending on origins, this reference may be either "just a" reference to - // an object created externally, OR actually own the underlying object - // (be value holder). - class BasicVectorRef - { - public: - // These fields are set by the derived class(es) - std::size_t m_elemSize = 0ul; - cv::GArrayDesc m_desc; - virtual ~BasicVectorRef() {} - - virtual void mov(BasicVectorRef &ref) = 0; - virtual const void* ptr() const = 0; - virtual std::size_t size() const = 0; - }; - - template class VectorRefT final: public BasicVectorRef - { - using empty_t = util::monostate; - using ro_ext_t = const std::vector *; - using rw_ext_t = std::vector *; - using rw_own_t = std::vector ; - util::variant m_ref; - - inline bool isEmpty() const { return util::holds_alternative(m_ref); } - inline bool isROExt() const { return util::holds_alternative(m_ref); } - inline bool isRWExt() const { return util::holds_alternative(m_ref); } - inline bool isRWOwn() const { return util::holds_alternative(m_ref); } - - void init(const std::vector* vec = nullptr) - { - m_elemSize = sizeof(T); - if (vec) m_desc = cv::descr_of(*vec); - } - - public: - VectorRefT() { init(); } - virtual ~VectorRefT() {} - - explicit VectorRefT(const std::vector& vec) : m_ref(&vec) { init(&vec); } - explicit VectorRefT(std::vector& vec) : m_ref(&vec) { init(&vec); } - explicit VectorRefT(std::vector&& vec) : m_ref(std::move(vec)) { init(&vec); } - - // Reset a VectorRefT. Called only for objects instantiated - // internally in G-API (e.g. temporary GArray's within a - // computation). Reset here means both initialization - // (creating an object) and reset (discarding its existing - // content before the next execution). Must never be called - // for external VectorRefTs. - void reset() - { - if (isEmpty()) - { - std::vector empty_vector; - m_desc = cv::descr_of(empty_vector); - m_ref = std::move(empty_vector); - GAPI_Assert(isRWOwn()); - } - else if (isRWOwn()) - { - util::get(m_ref).clear(); - } - else GAPI_Error("InternalError"); // shouldn't be called in *EXT modes - } - - // Obtain a WRITE reference to underlying object - // Used by CPU kernel API wrappers when a kernel execution frame - // is created - std::vector& wref() - { - GAPI_Assert(isRWExt() || isRWOwn()); - if (isRWExt()) return *util::get(m_ref); - if (isRWOwn()) return util::get(m_ref); - util::throw_error(std::logic_error("Impossible happened")); - } - - // Obtain a READ reference to underlying object - // Used by CPU kernel API wrappers when a kernel execution frame - // is created - const std::vector& rref() const - { - // ANY vector can be accessed for reading, even if it declared for - // output. Example -- a GComputation from [in] to [out1,out2] - // where [out2] is a result of operation applied to [out1]: - // - // GComputation boundary - // . . . . . . . - // . . - // [in] ----> foo() ----> [out1] - // . . : - // . . . .:. . . - // . V . - // . bar() ---> [out2] - // . . . . . . . . . . . . - // - if (isROExt()) return *util::get(m_ref); - if (isRWExt()) return *util::get(m_ref); - if (isRWOwn()) return util::get(m_ref); - util::throw_error(std::logic_error("Impossible happened")); - } - - virtual void mov(BasicVectorRef &v) override { - VectorRefT *tv = dynamic_cast*>(&v); - GAPI_Assert(tv != nullptr); - wref() = std::move(tv->wref()); - } - - virtual const void* ptr() const override { return &rref(); } - virtual std::size_t size() const override { return rref().size(); } - }; - - // This class strips type information from VectorRefT<> and makes it usable - // in the G-API executables (carrying run-time data/information to kernels). - // Part of GRunArg. - // Its methods are typed proxies to VectorRefT. - // VectorRef maintains "reference" semantics so two copies of VectoRef refer - // to the same underlying object. - // FIXME: Put a good explanation on why cv::OutputArray doesn't fit this role - class VectorRef - { - std::shared_ptr m_ref; - cv::detail::OpaqueKind m_kind = cv::detail::OpaqueKind::CV_UNKNOWN; - - template inline void check() const - { - GAPI_DbgAssert(dynamic_cast*>(m_ref.get()) != nullptr); - GAPI_Assert(sizeof(T) == m_ref->m_elemSize); - } - - public: - VectorRef() = default; - template explicit VectorRef(const std::vector& vec) - : m_ref(new VectorRefT(vec)) - , m_kind(GOpaqueTraits::kind) - {} - template explicit VectorRef(std::vector& vec) - : m_ref(new VectorRefT(vec)) - , m_kind(GOpaqueTraits::kind) - {} - template explicit VectorRef(std::vector&& vec) - : m_ref(new VectorRefT(std::move(vec))) - , m_kind(GOpaqueTraits::kind) - {} - - cv::detail::OpaqueKind getKind() const - { - return m_kind; - } - - template void reset() - { - if (!m_ref) m_ref.reset(new VectorRefT()); - check(); - storeKind(); - static_cast&>(*m_ref).reset(); - } - - template - void storeKind() - { - m_kind = cv::detail::GOpaqueTraits::kind; - } - - template std::vector& wref() - { - check(); - return static_cast&>(*m_ref).wref(); - } - - template const std::vector& rref() const - { - check(); - return static_cast&>(*m_ref).rref(); - } - - // Check if was created for/from std::vector - template bool holds() const - { - if (!m_ref) return false; - using U = typename std::decay::type; - return dynamic_cast*>(m_ref.get()) != nullptr; - } - - void mov(VectorRef &v) - { - m_ref->mov(*v.m_ref); - } - - cv::GArrayDesc descr_of() const - { - return m_ref->m_desc; - } - - std::size_t size() const - { - return m_ref->size(); - } - - // May be used to uniquely identify this object internally - const void *ptr() const { return m_ref->ptr(); } - }; - - // Helper (FIXME: work-around?) - // stripping G types to their host types - // like cv::GArray would still map to std::vector - // but not to std::vector -#if defined(GAPI_STANDALONE) -# define FLATTEN_NS cv::gapi::own -#else -# define FLATTEN_NS cv -#endif - template struct flatten_g; - template<> struct flatten_g { using type = FLATTEN_NS::Mat; }; - template<> struct flatten_g { using type = FLATTEN_NS::Scalar; }; - template struct flatten_g> { using type = std::vector; }; - template struct flatten_g { using type = T; }; -#undef FLATTEN_NS - // FIXME: the above mainly duplicates "ProtoToParam" thing from gtyped.hpp - // but I decided not to include gtyped here - probably worth moving that stuff - // to some common place? (DM) -} // namespace detail - -/** \addtogroup gapi_data_objects - * @{ - */ -/** - * @brief `cv::GArray` template class represents a list of objects - * of class `T` in the graph. - * - * `cv::GArray` describes a functional relationship between - * operations consuming and producing arrays of objects of class - * `T`. The primary purpose of `cv::GArray` is to represent a - * dynamic list of objects -- where the size of the list is not known - * at the graph construction or compile time. Examples include: corner - * and feature detectors (`cv::GArray`), object detection - * and tracking results (`cv::GArray`). Programmers can use - * their own types with `cv::GArray` in the custom operations. - * - * Similar to `cv::GScalar`, `cv::GArray` may be value-initialized - * -- in this case a graph-constant value is associated with the object. - * - * `GArray` is a virtual counterpart of `std::vector`, which is - * usually used to represent the `GArray` data in G-API during the - * execution. - * - * @sa `cv::GOpaque` - */ -template class GArray -{ -public: - // Host type (or Flat type) - the type this GArray is actually - // specified to. - /// @private - using HT = typename detail::flatten_g::type>::type; - - /** - * @brief Constructs a value-initialized `cv::GArray` - * - * `cv::GArray` objects may have their values - * be associated at graph construction time. It is useful when - * some operation has a `cv::GArray` input which doesn't change during - * the program execution, and is set only once. In this case, - * there is no need to declare such `cv::GArray` as a graph input. - * - * @note The value of `cv::GArray` may be overwritten by assigning some - * other `cv::GArray` to the object using `operator=` -- on the - * assignment, the old association or value is discarded. - * - * @param v a std::vector to associate with this - * `cv::GArray` object. Vector data is copied into the - * `cv::GArray` (no reference to the passed data is held). - */ - explicit GArray(const std::vector& v) // Constant value constructor - : m_ref(detail::GArrayU(detail::VectorRef(v))) { putDetails(); } - - /** - * @overload - * @brief Constructs a value-initialized `cv::GArray` - * - * @param v a std::vector to associate with this - * `cv::GArray` object. Vector data is moved into the `cv::GArray`. - */ - explicit GArray(std::vector&& v) // Move-constructor - : m_ref(detail::GArrayU(detail::VectorRef(std::move(v)))) { putDetails(); } - - /** - * @brief Constructs an empty `cv::GArray` - * - * Normally, empty G-API data objects denote a starting point of - * the graph. When an empty `cv::GArray` is assigned to a result - * of some operation, it obtains a functional link to this - * operation (and is not empty anymore). - */ - GArray() { putDetails(); } // Empty constructor - - /// @private - explicit GArray(detail::GArrayU &&ref) // GArrayU-based constructor - : m_ref(ref) { putDetails(); } // (used by GCall, not for users) - - /// @private - detail::GArrayU strip() const { - return m_ref; - } - /// @private - static void VCtor(detail::VectorRef& vref) { - vref.reset(); - } - -private: - void putDetails() { - m_ref.setConstructFcn(&VCtor); - m_ref.specifyType(); // FIXME: to unify those 2 to avoid excessive dynamic_cast - m_ref.storeKind(); // - } - - detail::GArrayU m_ref; -}; - -/** @} */ - -} // namespace cv - -#endif // OPENCV_GAPI_GARRAY_HPP diff --git a/modules/gapi/include/opencv2/gapi/gasync_context.hpp b/modules/gapi/include/opencv2/gapi/gasync_context.hpp deleted file mode 100644 index f49b59822d..0000000000 --- a/modules/gapi/include/opencv2/gapi/gasync_context.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - -#ifndef OPENCV_GAPI_GASYNC_CONTEXT_HPP -#define OPENCV_GAPI_GASYNC_CONTEXT_HPP - -#if !defined(GAPI_STANDALONE) -# include -#else // Without OpenCV -# include -#endif // !defined(GAPI_STANDALONE) - -#include - -namespace cv { -namespace gapi{ - -/** - * @brief This namespace contains experimental G-API functionality, - * functions or structures in this namespace are subjects to change or - * removal in the future releases. This namespace also contains - * functions which API is not stabilized yet. - */ -namespace wip { - -/** - * @brief A class to group async requests to cancel them in a single shot. - * - * GAsyncContext is passed as an argument to async() and async_apply() functions - */ - -class GAPI_EXPORTS GAsyncContext{ - std::atomic cancelation_requested = {false}; -public: - /** - * @brief Start cancellation process for an associated request. - * - * User still has to wait for each individual request (either via callback or according std::future object) to make sure it actually canceled. - * - * @return true if it was a first request to cancel the context - */ - bool cancel(); - - /** - * @brief Returns true if cancellation was requested for this context. - * - * @return true if cancellation was requested for this context - */ - bool isCanceled() const; -}; - -class GAPI_EXPORTS GAsyncCanceled : public std::exception { -public: - virtual const char* what() const noexcept CV_OVERRIDE; -}; -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif //OPENCV_GAPI_GASYNC_CONTEXT_HPP diff --git a/modules/gapi/include/opencv2/gapi/gcall.hpp b/modules/gapi/include/opencv2/gapi/gcall.hpp deleted file mode 100644 index 8d1b8d6010..0000000000 --- a/modules/gapi/include/opencv2/gapi/gcall.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GCALL_HPP -#define OPENCV_GAPI_GCALL_HPP - -#include // GArg -#include // GMat -#include // GScalar -#include // GFrame -#include // GArray -#include // GOpaque - -namespace cv { - -struct GKernel; - -// The whole idea of this class is to represent an operation -// which is applied to arguments. This is part of public API, -// since it is what users should use to define kernel interfaces. - -class GAPI_EXPORTS GCall final -{ -public: - class Priv; - - explicit GCall(const GKernel &k); - ~GCall(); - - template - GCall& pass(Ts&&... args) - { - setArgs({cv::GArg(std::move(args))...}); - return *this; - } - - // A generic yield method - obtain a link to operator's particular GMat output - GMat yield (int output = 0); - GMatP yieldP (int output = 0); - GScalar yieldScalar(int output = 0); - GFrame yieldFrame (int output = 0); - - template GArray yieldArray(int output = 0) - { - return GArray(yieldArray(output)); - } - - template GOpaque yieldOpaque(int output = 0) - { - return GOpaque(yieldOpaque(output)); - } - - // Internal use only - Priv& priv(); - const Priv& priv() const; - - // GKernel and params can be modified, it's needed for infer, - // because information about output shapes doesn't exist in compile time - GKernel& kernel(); - cv::util::any& params(); - - void setArgs(std::vector &&args); - -protected: - std::shared_ptr m_priv; - - // Public versions return a typed array or opaque, those are implementation details - detail::GArrayU yieldArray(int output = 0); - detail::GOpaqueU yieldOpaque(int output = 0); -}; - -} // namespace cv - -#endif // OPENCV_GAPI_GCALL_HPP diff --git a/modules/gapi/include/opencv2/gapi/gcommon.hpp b/modules/gapi/include/opencv2/gapi/gcommon.hpp deleted file mode 100644 index c61110e4d5..0000000000 --- a/modules/gapi/include/opencv2/gapi/gcommon.hpp +++ /dev/null @@ -1,309 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GCOMMON_HPP -#define OPENCV_GAPI_GCOMMON_HPP - -#include // std::hash -#include // std::vector -#include // decay - -#include - -#include -#include -#include -#include -#include -#include - -namespace cv { - -class GMat; // FIXME: forward declaration for GOpaqueTraits - -namespace detail -{ - // This is a trait-like structure to mark backend-specific compile arguments - // with tags - template struct CompileArgTag; - - // These structures are tags which separate kernels and transformations - struct KernelTag - {}; - struct TransformTag - {}; - - // This enum is utilized mostly by GArray and GOpaque to store and recognize their internal data - // types (aka Host type). Also it is widely used during serialization routine. - enum class OpaqueKind: int - { - CV_UNKNOWN, // Unknown, generic, opaque-to-GAPI data type unsupported in graph seriallization - CV_BOOL, // bool user G-API data - CV_INT, // int user G-API data - CV_INT64, // int64_t user G-API data - CV_DOUBLE, // double user G-API data - CV_FLOAT, // float user G-API data - CV_UINT64, // uint64_t user G-API data - CV_STRING, // std::string user G-API data - CV_POINT, // cv::Point user G-API data - CV_POINT2F, // cv::Point2f user G-API data - CV_POINT3F, // cv::Point3f user G-API data - CV_SIZE, // cv::Size user G-API data - CV_RECT, // cv::Rect user G-API data - CV_SCALAR, // cv::Scalar user G-API data - CV_MAT, // cv::Mat user G-API data - CV_DRAW_PRIM, // cv::gapi::wip::draw::Prim user G-API data - }; - - // Type traits helper which simplifies the extraction of kind from type - template struct GOpaqueTraits; - template struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_UNKNOWN; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_INT; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_INT64; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_DOUBLE; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_FLOAT; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_UINT64; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_BOOL; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_STRING; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_SIZE; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_SCALAR; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_POINT; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_POINT2F; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_POINT3F; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_MAT; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_RECT; }; - template<> struct GOpaqueTraits { static constexpr const OpaqueKind kind = OpaqueKind::CV_MAT; }; - template<> struct GOpaqueTraits - { static constexpr const OpaqueKind kind = OpaqueKind::CV_DRAW_PRIM; }; - using GOpaqueTraitsArrayTypes = std::tuple; - // GOpaque is not supporting cv::Mat and cv::Scalar since there are GScalar and GMat types - using GOpaqueTraitsOpaqueTypes = std::tuple; -} // namespace detail - -// This definition is here because it is reused by both public(?) and internal -// modules. Keeping it here wouldn't expose public details (e.g., API-level) -// to components which are internal and operate on a lower-level entities -// (e.g., compiler, backends). -// FIXME: merge with ArgKind? -// FIXME: replace with variant[format desc]? -enum class GShape: int -{ - GMAT, - GSCALAR, - GARRAY, - GOPAQUE, - GFRAME, -}; - -namespace gapi { -namespace s11n { -namespace detail { -template struct wrap_serialize; -} // namespace detail -} // namespace s11n -} // namespace gapi - - -struct GCompileArg; - -namespace detail { - template - using is_compile_arg = std::is_same::type>; -} // namespace detail - -// CompileArg is an unified interface over backend-specific compilation -// information -// FIXME: Move to a separate file? -/** \addtogroup gapi_compile_args - * @{ - * - * @brief Compilation arguments: data structures controlling the - * compilation process - * - * G-API comes with a number of graph compilation options which can be - * passed to cv::GComputation::apply() or - * cv::GComputation::compile(). Known compilation options are listed - * in this page, while extra backends may introduce their own - * compilation options (G-API transparently accepts _everything_ which - * can be passed to cv::compile_args(), it depends on underlying - * backends if an option would be interpreted or not). - * - * For example, if an example computation is executed like this: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp graph_decl_apply - * - * Extra parameter specifying which kernels to compile with can be - * passed like this: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp apply_with_param - */ - -/** - * @brief Represents an arbitrary compilation argument. - * - * Any value can be wrapped into cv::GCompileArg, but only known ones - * (to G-API or its backends) can be interpreted correctly. - * - * Normally objects of this class shouldn't be created manually, use - * cv::compile_args() function which automatically wraps everything - * passed in (a variadic template parameter pack) into a vector of - * cv::GCompileArg objects. - */ -struct GCompileArg -{ -public: - // NB: Required for pythnon bindings - GCompileArg() = default; - - std::string tag; - - // FIXME: use decay in GArg/other trait-based wrapper before leg is shot! - template::value, int>::type = 0> - explicit GCompileArg(T &&t) - : tag(detail::CompileArgTag::type>::tag()) - , serializeF(cv::gapi::s11n::detail::has_S11N_spec::value ? - &cv::gapi::s11n::detail::wrap_serialize::serialize : - nullptr) - , arg(t) - { - } - - template T& get() - { - return util::any_cast(arg); - } - - template const T& get() const - { - return util::any_cast(arg); - } - - void serialize(cv::gapi::s11n::IOStream& os) const - { - if (serializeF) - { - serializeF(os, *this); - } - } - -private: - std::function serializeF; - util::any arg; -}; - -using GCompileArgs = std::vector; - -inline cv::GCompileArgs& operator += ( cv::GCompileArgs &lhs, - const cv::GCompileArgs &rhs) -{ - lhs.reserve(lhs.size() + rhs.size()); - lhs.insert(lhs.end(), rhs.begin(), rhs.end()); - return lhs; -} - -/** - * @brief Wraps a list of arguments (a parameter pack) into a vector of - * compilation arguments (cv::GCompileArg). - */ -template GCompileArgs compile_args(Ts&&... args) -{ - return GCompileArgs{ GCompileArg(args)... }; -} - -namespace gapi -{ -/** - * @brief Retrieves particular compilation argument by its type from - * cv::GCompileArgs - */ -template -inline cv::util::optional getCompileArg(const cv::GCompileArgs &args) -{ - for (auto &compile_arg : args) - { - if (compile_arg.tag == cv::detail::CompileArgTag::tag()) - { - return cv::util::optional(compile_arg.get()); - } - } - return cv::util::optional(); -} - -namespace s11n { -namespace detail { -template struct wrap_serialize -{ - static void serialize(IOStream& os, const GCompileArg& arg) - { - using DT = typename std::decay::type; - S11N
::serialize(os, arg.get
()); - } -}; -} // namespace detail -} // namespace s11n -} // namespace gapi - -/** @} gapi_compile_args */ - -/** - * @brief Ask G-API to dump compiled graph in Graphviz format under - * the given file name. - * - * Specifies a graph dump path (path to .dot file to be generated). - * G-API will dump a .dot file under specified path during a - * compilation process if this flag is passed. - */ -struct graph_dump_path -{ - std::string m_dump_path; -}; - -/** - * @brief Ask G-API to use threaded executor when cv::GComputation - * is compiled via cv::GComputation::compile method. - * - * Specifies a number of threads that should be used by executor. - */ -struct GAPI_EXPORTS use_threaded_executor -{ - use_threaded_executor(); - explicit use_threaded_executor(const uint32_t nthreads); - - uint32_t num_threads; -}; - -namespace detail -{ - template<> struct CompileArgTag - { - static const char* tag() { return "gapi.graph_dump_path"; } - }; - - template<> struct CompileArgTag - { - static const char* tag() { return "gapi.threaded_executor"; } - }; -} - -} // namespace cv - -// std::hash overload for GShape -namespace std -{ -template<> struct hash -{ - size_t operator() (cv::GShape sh) const - { - return std::hash()(static_cast(sh)); - } -}; -} // namespace std - - -#endif // OPENCV_GAPI_GCOMMON_HPP diff --git a/modules/gapi/include/opencv2/gapi/gcompiled.hpp b/modules/gapi/include/opencv2/gapi/gcompiled.hpp deleted file mode 100644 index ac36783d62..0000000000 --- a/modules/gapi/include/opencv2/gapi/gcompiled.hpp +++ /dev/null @@ -1,232 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GCOMPILED_HPP -#define OPENCV_GAPI_GCOMPILED_HPP - -#include - -#include -#include -#include - -namespace cv { - -// This class represents a compiled computation. -// In theory (and ideally), it can be used w/o the rest of APIs. -// In theory (and ideally), it can be serialized/deserialized. -// It can enable scenarious like deployment to an autonomous devince, FuSa, etc. -// -// Currently GCompiled assumes all GMats you used to pass data to G-API -// are valid and not destroyed while you use a GCompiled object. -// -// FIXME: In future, there should be a way to name I/O objects and specify it -// to GCompiled externally (for example, when it is loaded on the target system). - -/** - * \addtogroup gapi_main_classes - * @{ - */ -/** - * @brief Represents a compiled computation (graph). Can only be used - * with image / data formats & resolutions it was compiled for, with - * some exceptions. - * - * This class represents a product of graph compilation (calling - * cv::GComputation::compile()). Objects of this class actually do - * data processing, and graph execution is incapsulated into objects - * of this class. Execution model itself depends on kernels and - * backends which were using during the compilation, see @ref - * gapi_compile_args for details. - * - * In a general case, GCompiled objects can be applied to data only in - * that formats/resolutions they were compiled for (see @ref - * gapi_meta_args). However, if the underlying backends allow, a - * compiled object can be _reshaped_ to handle data (images) of - * different resolution, though formats and types must remain the same. - * - * GCompiled is very similar to `std::function<>` in its semantics -- - * running it looks like a function call in the user code. - * - * At the moment, GCompiled objects are not reentrant -- generally, - * the objects are stateful since graph execution itself is a stateful - * process and this state is now maintained in GCompiled's own memory - * (not on the process stack). - * - * At the same time, two different GCompiled objects produced from the - * single cv::GComputation are completely independent and can be used - * concurrently. - * - * @sa GStreamingCompiled - */ -class GAPI_EXPORTS GCompiled -{ -public: - /// @private - class GAPI_EXPORTS Priv; - - /** - * @brief Constructs an empty object - */ - GCompiled(); - - /** - * @brief Run the compiled computation, a generic version. - * - * @param ins vector of inputs to process. - * @param outs vector of outputs to produce. - * - * Input/output vectors must have the same number of elements as - * defined in the cv::GComputation protocol (at the moment of its - * construction). Shapes of elements also must conform to protocol - * (e.g. cv::Mat needs to be passed where cv::GMat has been - * declared as input, and so on). Run-time exception is generated - * otherwise. - * - * Objects in output vector may remain empty (like cv::Mat) -- - * G-API will automatically initialize output objects to proper formats. - * - * @note Don't construct GRunArgs/GRunArgsP objects manually, use - * cv::gin()/cv::gout() wrappers instead. - */ - void operator() (GRunArgs &&ins, GRunArgsP &&outs); // Generic arg-to-arg -#if !defined(GAPI_STANDALONE) - - /** - * @brief Execute an unary computation - * - * @overload - * @param in input cv::Mat for unary computation - * @param out output cv::Mat for unary computation - * process. - */ - void operator() (cv::Mat in, cv::Mat &out); // Unary overload - - /** - * @brief Execute an unary computation - * - * @overload - * @param in input cv::Mat for unary computation - * @param out output cv::Scalar for unary computation - * process. - */ - void operator() (cv::Mat in, cv::Scalar &out); // Unary overload (scalar) - - /** - * @brief Execute a binary computation - * - * @overload - * @param in1 first input cv::Mat for binary computation - * @param in2 second input cv::Mat for binary computation - * @param out output cv::Mat for binary computation - * process. - */ - void operator() (cv::Mat in1, cv::Mat in2, cv::Mat &out); // Binary overload - - /** - * @brief Execute an binary computation - * - * @overload - * @param in1 first input cv::Mat for binary computation - * @param in2 second input cv::Mat for binary computation - * @param out output cv::Scalar for binary computation - * process. - */ - void operator() (cv::Mat in1, cv::Mat in2, cv::Scalar &out); // Binary overload (scalar) - - /** - * @brief Execute a computation with arbitrary number of - * inputs/outputs. - * - * @overload - * @param ins vector of input cv::Mat objects to process by the - * computation. - * @param outs vector of output cv::Mat objects to produce by the - * computation. - * - * Numbers of elements in ins/outs vectors must match numbers of - * inputs/outputs which were used to define the source GComputation. - */ - void operator() (const std::vector &ins, // Compatibility overload - const std::vector &outs); -#endif // !defined(GAPI_STANDALONE) - /// @private - Priv& priv(); - - /** - * @brief Check if compiled object is valid (non-empty) - * - * @return true if the object is runnable (valid), false otherwise - */ - explicit operator bool () const; - - /** - * @brief Vector of metadata this graph was compiled for. - * - * @return Unless _reshape_ is not supported, return value is the - * same vector which was passed to cv::GComputation::compile() to - * produce this compiled object. Otherwise, it is the latest - * metadata vector passed to reshape() (if that call was - * successful). - */ - const GMetaArgs& metas() const; // Meta passed to compile() - - /** - * @brief Vector of metadata descriptions of graph outputs - * - * @return vector with formats/resolutions of graph's output - * objects, auto-inferred from input metadata vector by - * operations which form this computation. - * - * @note GCompiled objects produced from the same - * cv::GComputiation graph with different input metas may return - * different values in this vector. - */ - const GMetaArgs& outMetas() const; - - /** - * @brief Check if the underlying backends support reshape or not. - * - * @return true if supported, false otherwise. - */ - bool canReshape() const; - - /** - * @brief Reshape a compiled graph to support new image - * resolutions. - * - * Throws an exception if an error occurs. - * - * @param inMetas new metadata to reshape on. Vector size and - * metadata shapes must match the computation's protocol. - * @param args compilation arguments to use. - */ - // FIXME: Why it requires compile args? - void reshape(const GMetaArgs& inMetas, const GCompileArgs& args); - - /** - * @brief Prepare inner kernels states for a new video-stream. - * - * GCompiled objects may be used to process video streams frame by frame. - * In this case, a GCompiled is called on every image frame individually. - * Starting OpenCV 4.4, some kernels in the graph may have their internal - * states (see GAPI_OCV_KERNEL_ST for the OpenCV backend). - * In this case, if user starts processing another video stream with - * this GCompiled, this method needs to be called to let kernels re-initialize - * their internal states to a new video stream. - */ - void prepareForNewStream(); - -protected: - /// @private - std::shared_ptr m_priv; -}; -/** @} */ - -} - -#endif // OPENCV_GAPI_GCOMPILED_HPP diff --git a/modules/gapi/include/opencv2/gapi/gcompiled_async.hpp b/modules/gapi/include/opencv2/gapi/gcompiled_async.hpp deleted file mode 100644 index a0c2917d6a..0000000000 --- a/modules/gapi/include/opencv2/gapi/gcompiled_async.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - - -#ifndef OPENCV_GAPI_GCOMPILED_ASYNC_HPP -#define OPENCV_GAPI_GCOMPILED_ASYNC_HPP - -#include //for std::future -#include //for std::exception_ptr -#include //for std::function -#include -#include - -namespace cv { - //fwd declaration - class GCompiled; - -namespace gapi{ -namespace wip { - class GAsyncContext; - /** - These functions asynchronously (i.e. probably on a separate thread of execution) call GCompiled::operator() member function of their first argument with copies of rest of arguments (except callback) passed in. - The difference between the function is the way to get the completion notification (via callback or a waiting on std::future object) - If exception is occurred during execution of apply it is transferred to the callback (via function parameter) or passed to future (and will be thrown on call to std::future::get) - - N.B. : - Input arguments are copied on call to async function (actually on call to cv::gin) and thus do not have to outlive the actual completion of asynchronous activity. - While output arguments are "captured" by reference(pointer) and therefore _must_ outlive the asynchronous activity - (i.e. live at least until callback is called or future is unblocked) - - @param gcmpld Compiled computation (graph) to start asynchronously - @param callback Callback to be called when execution of gcmpld is done - @param ins Input parameters for gcmpld - @param outs Output parameters for gcmpld - */ - GAPI_EXPORTS void async(GCompiled& gcmpld, std::function&& callback, GRunArgs &&ins, GRunArgsP &&outs); - - /** @overload - @param gcmpld Compiled computation (graph) to run asynchronously - @param callback Callback to be called when execution of gcmpld is done - @param ins Input parameters for gcmpld - @param outs Output parameters for gcmpld - @param ctx Context this request belongs to - @see async GAsyncContext - */ - GAPI_EXPORTS void async(GCompiled& gcmpld, std::function&& callback, GRunArgs &&ins, GRunArgsP &&outs, GAsyncContext& ctx); - - /** @overload - @param gcmpld Compiled computation (graph) to run asynchronously - @param ins Input parameters for gcmpld - @param outs Output parameters for gcmpld - @return std::future object to wait for completion of async operation - @see async - */ - GAPI_EXPORTS std::future async(GCompiled& gcmpld, GRunArgs &&ins, GRunArgsP &&outs); - - /** - @param gcmpld Compiled computation (graph) to run asynchronously - @param ins Input parameters for gcmpld - @param outs Output parameters for gcmpld - @param ctx Context this request belongs to - @return std::future object to wait for completion of async operation - @see async GAsyncContext - */ - GAPI_EXPORTS std::future async(GCompiled& gcmpld, GRunArgs &&ins, GRunArgsP &&outs, GAsyncContext& ctx); -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_GCOMPILED_ASYNC_HPP diff --git a/modules/gapi/include/opencv2/gapi/gcompoundkernel.hpp b/modules/gapi/include/opencv2/gapi/gcompoundkernel.hpp deleted file mode 100644 index df0ce34045..0000000000 --- a/modules/gapi/include/opencv2/gapi/gcompoundkernel.hpp +++ /dev/null @@ -1,139 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2019 Intel Corporation - - -#ifndef OPENCV_GAPI_GCOMPOUNDKERNEL_HPP -#define OPENCV_GAPI_GCOMPOUNDKERNEL_HPP - -#include -#include -#include -#include - -namespace cv { -namespace gapi -{ -namespace compound -{ - // FIXME User does not need to know about this function - // Needs that user may define compound kernels(as cpu kernels) - GAPI_EXPORTS cv::gapi::GBackend backend(); -} // namespace compound -} // namespace gapi - -namespace detail -{ - -struct GCompoundContext -{ - explicit GCompoundContext(const GArgs& in_args); - template - const T& inArg(int input) { return m_args.at(input).get(); } - - GArgs m_args; - GArgs m_results; -}; - -class GAPI_EXPORTS GCompoundKernel -{ -// Compound kernel must use all of it's inputs -public: - using F = std::function; - - explicit GCompoundKernel(const F& f); - void apply(GCompoundContext& ctx); - -protected: - F m_f; -}; - -template struct get_compound_in -{ - static T get(GCompoundContext &ctx, int idx) { return ctx.inArg(idx); } -}; - -template struct get_compound_in> -{ - static cv::GArray get(GCompoundContext &ctx, int idx) - { - auto array = cv::GArray(); - ctx.m_args[idx] = GArg(array); - return array; - } -}; - -template struct get_compound_in> -{ - static cv::GOpaque get(GCompoundContext &ctx, int idx) - { - auto opaq = cv::GOpaque(); - ctx.m_args[idx] = GArg(opaq); - return opaq; - } -}; - -template<> struct get_compound_in -{ - static cv::GMatP get(GCompoundContext &ctx, int idx) - { - auto mat = cv::GMatP(); - ctx.m_args[idx] = GArg(mat); - return mat; - } -}; - -template -struct GCompoundCallHelper; - -template -struct GCompoundCallHelper, std::tuple > -{ - template - static void expand_impl(GCompoundContext &ctx, detail::Seq, detail::Seq) - { - auto result = Impl::expand(get_compound_in::get(ctx, IIs)...); - auto tuple_return = tuple_wrap_helper::get(std::move(result)); - ctx.m_results = { cv::GArg(std::get(tuple_return))... }; - } - - static void expand(GCompoundContext &ctx) - { - expand_impl(ctx, - typename detail::MkSeq::type(), - typename detail::MkSeq::type()); - } -}; - -template -class GCompoundKernelImpl: public cv::detail::GCompoundCallHelper, - public cv::detail::KernelTag -{ - using P = cv::detail::GCompoundCallHelper; - -public: - using API = K; - - static cv::gapi::GBackend backend() { return cv::gapi::compound::backend(); } - static GCompoundKernel kernel() { return GCompoundKernel(&P::expand); } -}; - -} // namespace detail - - -/** - * Declares a new compound kernel. See this - * [documentation chapter](@ref gapi_kernel_compound) - * on compound kernels for more details. - * - * @param Name type name for new kernel - * @param API the interface this kernel implements - */ -#define GAPI_COMPOUND_KERNEL(Name, API) \ - struct Name: public cv::detail::GCompoundKernelImpl - -} // namespace cv - -#endif // OPENCV_GAPI_GCOMPOUNDKERNEL_HPP diff --git a/modules/gapi/include/opencv2/gapi/gcomputation.hpp b/modules/gapi/include/opencv2/gapi/gcomputation.hpp deleted file mode 100644 index 196eb37c6b..0000000000 --- a/modules/gapi/include/opencv2/gapi/gcomputation.hpp +++ /dev/null @@ -1,581 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GCOMPUTATION_HPP -#define OPENCV_GAPI_GCOMPUTATION_HPP - -#include - -#include -#include -#include -#include -#include -#include - -namespace cv { - -namespace detail -{ - // FIXME: move to algorithm, cover with separate tests - // FIXME: replace with O(1) version (both memory and compilation time) - template - struct last_type; - - template - struct last_type { using type = T;}; - - template - struct last_type { using type = typename last_type::type; }; - - template - using last_type_t = typename last_type::type; -} - -// Forward-declare the serialization objects -namespace gapi { -namespace s11n { - struct IIStream; - struct IOStream; -} // namespace s11n -} // namespace gapi - -/** - * \addtogroup gapi_main_classes - * @{ - * - * @brief G-API classes for constructed and compiled graphs. - */ - -/** - * @brief GComputation class represents a captured computation - * graph. GComputation objects form boundaries for expression code - * user writes with G-API, allowing to compile and execute it. - * - * G-API computations are defined with input/output data - * objects. G-API will track automatically which operations connect - * specified outputs to the inputs, forming up a call graph to be - * executed. The below example expresses calculation of Sobel operator - * for edge detection (\f$G = \sqrt{G_x^2 + G_y^2}\f$): - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp graph_def - * - * Full pipeline can be now captured with this object declaration: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp graph_cap_full - * - * Input/output data objects on which a call graph should be - * reconstructed are passed using special wrappers cv::GIn and - * cv::GOut. G-API will track automatically which operations form a - * path from inputs to outputs and build the execution graph appropriately. - * - * Note that cv::GComputation doesn't take ownership on data objects - * it is defined. Moreover, multiple GComputation objects may be - * defined on the same expressions, e.g. a smaller pipeline which - * expects that image gradients are already pre-calculated may be - * defined like this: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp graph_cap_sub - * - * The resulting graph would expect two inputs and produce one - * output. In this case, it doesn't matter if gx/gy data objects are - * results of cv::gapi::Sobel operators -- G-API will stop unrolling - * expressions and building the underlying graph one reaching this - * data objects. - * - * The way how GComputation is defined is important as its definition - * specifies graph _protocol_ -- the way how the graph should be - * used. Protocol is defined by number of inputs, number of outputs, - * and shapes of inputs and outputs. - * - * In the above example, sobelEdge expects one Mat on input and - * produces one Mat; while sobelEdgeSub expects two Mats on input and - * produces one Mat. GComputation's protocol defines how other - * computation methods should be used -- cv::GComputation::compile() and - * cv::GComputation::apply(). For example, if a graph is defined on - * two GMat inputs, two cv::Mat objects have to be passed to apply() - * for execution. GComputation checks protocol correctness in runtime - * so passing a different number of objects in apply() or passing - * cv::Scalar instead of cv::Mat there would compile well as a C++ - * source but raise an exception in run-time. G-API also comes with a - * typed wrapper cv::GComputationT<> which introduces this type-checking in - * compile-time. - * - * cv::GComputation itself is a thin object which just captures what - * the graph is. The compiled graph (which actually process data) is - * represented by class GCompiled. Use compile() method to generate a - * compiled graph with given compile options. cv::GComputation can - * also be used to process data with implicit graph compilation - * on-the-fly, see apply() for details. - * - * GComputation is a reference-counted object -- once defined, all its - * copies will refer to the same instance. - * - * @sa GCompiled - */ -class GAPI_EXPORTS_W GComputation -{ -public: - class Priv; - typedef std::function Generator; - - // Various constructors enable different ways to define a computation: ///// - // 1. Generic constructors - /** - * @brief Define a computation using a generator function. - * - * Graph can be defined in-place directly at the moment of its - * construction with a lambda: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp graph_gen - * - * This may be useful since all temporary objects (cv::GMats) and - * namespaces can be localized to scope of lambda, without - * contaminating the parent scope with probably unnecessary objects - * and information. - * - * @param gen generator function which returns a cv::GComputation, - * see Generator. - */ - GComputation(const Generator& gen); // Generator - // overload - - /** - * @brief Generic GComputation constructor. - * - * Constructs a new graph with a given protocol, specified as a - * flow of operations connecting input/output objects. Throws if - * the passed boundaries are invalid, e.g. if there's no - * functional dependency (path) between given outputs and inputs. - * - * @param ins Input data vector. - * @param outs Output data vector. - * - * @note Don't construct GProtoInputArgs/GProtoOutputArgs objects - * directly, use cv::GIn()/cv::GOut() wrapper functions instead. - * - * @sa @ref gapi_data_objects - */ - GAPI_WRAP GComputation(GProtoInputArgs &&ins, - GProtoOutputArgs &&outs); // Arg-to-arg overload - - // 2. Syntax sugar and compatibility overloads - /** - * @brief Defines an unary (one input -- one output) computation - * - * @overload - * @param in input GMat of the defined unary computation - * @param out output GMat of the defined unary computation - */ - GAPI_WRAP GComputation(GMat in, GMat out); // Unary overload - - /** - * @brief Defines an unary (one input -- one output) computation - * - * @overload - * @param in input GMat of the defined unary computation - * @param out output GScalar of the defined unary computation - */ - GAPI_WRAP GComputation(GMat in, GScalar out); // Unary overload (scalar) - - /** - * @brief Defines a binary (two inputs -- one output) computation - * - * @overload - * @param in1 first input GMat of the defined binary computation - * @param in2 second input GMat of the defined binary computation - * @param out output GMat of the defined binary computation - */ - GAPI_WRAP GComputation(GMat in1, GMat in2, GMat out); // Binary overload - - /** - * @brief Defines a binary (two inputs -- one output) computation - * - * @overload - * @param in1 first input GMat of the defined binary computation - * @param in2 second input GMat of the defined binary computation - * @param out output GScalar of the defined binary computation - */ - GComputation(GMat in1, GMat in2, GScalar out); // Binary - // overload - // (scalar) - - /** - * @brief Defines a computation with arbitrary input/output number. - * - * @overload - * @param ins vector of inputs GMats for this computation - * @param outs vector of outputs GMats for this computation - * - * Use this overload for cases when number of computation - * inputs/outputs is not known in compile-time -- e.g. when graph - * is programmatically generated to build an image pyramid with - * the given number of levels, etc. - */ - GComputation(const std::vector &ins, // Compatibility overload - const std::vector &outs); - - // Various versions of apply(): //////////////////////////////////////////// - // 1. Generic apply() - /** - * @brief Compile graph on-the-fly and immediately execute it on - * the inputs data vectors. - * - * Number of input/output data objects must match GComputation's - * protocol, also types of host data objects (cv::Mat, cv::Scalar) - * must match the shapes of data objects from protocol (cv::GMat, - * cv::GScalar). If there's a mismatch, a run-time exception will - * be generated. - * - * Internally, a cv::GCompiled object is created for the given - * input format configuration, which then is executed on the input - * data immediately. cv::GComputation caches compiled objects - * produced within apply() -- if this method would be called next - * time with the same input parameters (image formats, image - * resolution, etc), the underlying compiled graph will be reused - * without recompilation. If new metadata doesn't match the cached - * one, the underlying compiled graph is regenerated. - * - * @note compile() always triggers a compilation process and - * produces a new GCompiled object regardless if a similar one has - * been cached via apply() or not. - * - * @param ins vector of input data to process. Don't create - * GRunArgs object manually, use cv::gin() wrapper instead. - * @param outs vector of output data to fill results in. cv::Mat - * objects may be empty in this vector, G-API will automatically - * initialize it with the required format & dimensions. Don't - * create GRunArgsP object manually, use cv::gout() wrapper instead. - * @param args a list of compilation arguments to pass to the - * underlying compilation process. Don't create GCompileArgs - * object manually, use cv::compile_args() wrapper instead. - * - * @sa @ref gapi_data_objects, @ref gapi_compile_args - */ - void apply(GRunArgs &&ins, GRunArgsP &&outs, GCompileArgs &&args = {}); // Arg-to-arg overload - - /// @private -- Exclude this function from OpenCV documentation - GAPI_WRAP GRunArgs apply(const cv::detail::ExtractArgsCallback &callback, - GCompileArgs &&args = {}); - - /// @private -- Exclude this function from OpenCV documentation - void apply(const std::vector& ins, // Compatibility overload - const std::vector& outs, - GCompileArgs &&args = {}); - - // 2. Syntax sugar and compatibility overloads -#if !defined(GAPI_STANDALONE) - /** - * @brief Execute an unary computation (with compilation on the fly) - * - * @overload - * @param in input cv::Mat for unary computation - * @param out output cv::Mat for unary computation - * @param args compilation arguments for underlying compilation - * process. - */ - void apply(cv::Mat in, cv::Mat &out, GCompileArgs &&args = {}); // Unary overload - - /** - * @brief Execute an unary computation (with compilation on the fly) - * - * @overload - * @param in input cv::Mat for unary computation - * @param out output cv::Scalar for unary computation - * @param args compilation arguments for underlying compilation - * process. - */ - void apply(cv::Mat in, cv::Scalar &out, GCompileArgs &&args = {}); // Unary overload (scalar) - - /** - * @brief Execute a binary computation (with compilation on the fly) - * - * @overload - * @param in1 first input cv::Mat for binary computation - * @param in2 second input cv::Mat for binary computation - * @param out output cv::Mat for binary computation - * @param args compilation arguments for underlying compilation - * process. - */ - void apply(cv::Mat in1, cv::Mat in2, cv::Mat &out, GCompileArgs &&args = {}); // Binary overload - - /** - * @brief Execute an binary computation (with compilation on the fly) - * - * @overload - * @param in1 first input cv::Mat for binary computation - * @param in2 second input cv::Mat for binary computation - * @param out output cv::Scalar for binary computation - * @param args compilation arguments for underlying compilation - * process. - */ - void apply(cv::Mat in1, cv::Mat in2, cv::Scalar &out, GCompileArgs &&args = {}); // Binary overload (scalar) - - /** - * @brief Execute a computation with arbitrary number of - * inputs/outputs (with compilation on-the-fly). - * - * @overload - * @param ins vector of input cv::Mat objects to process by the - * computation. - * @param outs vector of output cv::Mat objects to produce by the - * computation. - * @param args compilation arguments for underlying compilation - * process. - * - * Numbers of elements in ins/outs vectors must match numbers of - * inputs/outputs which were used to define this GComputation. - */ - void apply(const std::vector& ins, // Compatibility overload - std::vector& outs, - GCompileArgs &&args = {}); -#endif // !defined(GAPI_STANDALONE) - // Various versions of compile(): ////////////////////////////////////////// - // 1. Generic compile() - requires metas to be passed as vector - /** - * @brief Compile the computation for specific input format(s). - * - * This method triggers compilation process and produces a new - * GCompiled object which then can process data of the given - * format. Passing data with different format to the compiled - * computation will generate a run-time exception. - * - * @param in_metas vector of input metadata configuration. Grab - * metadata from real data objects (like cv::Mat or cv::Scalar) - * using cv::descr_of(), or create it on your own. - * @param args compilation arguments for this compilation - * process. Compilation arguments directly affect what kind of - * executable object would be produced, e.g. which kernels (and - * thus, devices) would be used to execute computation. - * - * @return GCompiled, an executable computation compiled - * specifically for the given input parameters. - * - * @sa @ref gapi_compile_args - */ - GCompiled compile(GMetaArgs &&in_metas, GCompileArgs &&args = {}); - - // 2. Syntax sugar - variadic list of metas, no extra compile args - // FIXME: SFINAE looks ugly in the generated documentation - /** - * @overload - * - * Takes a variadic parameter pack with metadata - * descriptors for which a compiled object needs to be produced. - * - * @return GCompiled, an executable computation compiled - * specifically for the given input parameters. - */ - template - auto compile(const Ts&... metas) -> - typename std::enable_if::value, GCompiled>::type - { - return compile(GMetaArgs{GMetaArg(metas)...}, GCompileArgs()); - } - - // 3. Syntax sugar - variadic list of metas, extra compile args - // (seems optional parameters don't work well when there's an variadic template - // comes first) - // - // Ideally it should look like: - // - // template - // GCompiled compile(const Ts&... metas, GCompileArgs &&args) - // - // But not all compilers can handle this (and seems they shouldn't be able to). - // FIXME: SFINAE looks ugly in the generated documentation - /** - * @overload - * - * Takes a variadic parameter pack with metadata - * descriptors for which a compiled object needs to be produced, - * followed by GCompileArgs object representing compilation - * arguments for this process. - * - * @return GCompiled, an executable computation compiled - * specifically for the given input parameters. - */ - template - auto compile(const Ts&... meta_and_compile_args) -> - typename std::enable_if::value - && std::is_same >::value, - GCompiled>::type - { - //FIXME: wrapping meta_and_compile_args into a tuple to unwrap them inside a helper function is the overkill - return compile(std::make_tuple(meta_and_compile_args...), - typename detail::MkSeq::type()); - } - - - // FIXME: Document properly in the Doxygen format - // Video-oriented pipeline compilation: - // 1. A generic version - /** - * @brief Compile the computation for streaming mode. - * - * This method triggers compilation process and produces a new - * GStreamingCompiled object which then can process video stream - * data of the given format. Passing a stream in a different - * format to the compiled computation will generate a run-time - * exception. - * - * @param in_metas vector of input metadata configuration. Grab - * metadata from real data objects (like cv::Mat or cv::Scalar) - * using cv::descr_of(), or create it on your own. - * - * @param args compilation arguments for this compilation - * process. Compilation arguments directly affect what kind of - * executable object would be produced, e.g. which kernels (and - * thus, devices) would be used to execute computation. - * - * @return GStreamingCompiled, a streaming-oriented executable - * computation compiled specifically for the given input - * parameters. - * - * @sa @ref gapi_compile_args - */ - GAPI_WRAP GStreamingCompiled compileStreaming(GMetaArgs &&in_metas, GCompileArgs &&args = {}); - - /** - * @brief Compile the computation for streaming mode. - * - * This method triggers compilation process and produces a new - * GStreamingCompiled object which then can process video stream - * data in any format. Underlying mechanisms will be adjusted to - * every new input video stream automatically, but please note that - * _not all_ existing backends support this (see reshape()). - * - * @param args compilation arguments for this compilation - * process. Compilation arguments directly affect what kind of - * executable object would be produced, e.g. which kernels (and - * thus, devices) would be used to execute computation. - * - * @return GStreamingCompiled, a streaming-oriented executable - * computation compiled for any input image format. - * - * @sa @ref gapi_compile_args - */ - GAPI_WRAP GStreamingCompiled compileStreaming(GCompileArgs &&args = {}); - - /// @private -- Exclude this function from OpenCV documentation - GAPI_WRAP GStreamingCompiled compileStreaming(const cv::detail::ExtractMetaCallback &callback, - GCompileArgs &&args = {}); - - // 2. Direct metadata version - /** - * @overload - * - * Takes a variadic parameter pack with metadata - * descriptors for which a compiled object needs to be produced. - * - * @return GStreamingCompiled, a streaming-oriented executable - * computation compiled specifically for the given input - * parameters. - */ - template - auto compileStreaming(const Ts&... metas) -> - typename std::enable_if::value, GStreamingCompiled>::type - { - return compileStreaming(GMetaArgs{GMetaArg(metas)...}, GCompileArgs()); - } - - // 2. Direct metadata + compile arguments version - /** - * @overload - * - * Takes a variadic parameter pack with metadata - * descriptors for which a compiled object needs to be produced, - * followed by GCompileArgs object representing compilation - * arguments for this process. - * - * @return GStreamingCompiled, a streaming-oriented executable - * computation compiled specifically for the given input - * parameters. - */ - template - auto compileStreaming(const Ts&... meta_and_compile_args) -> - typename std::enable_if::value - && std::is_same >::value, - GStreamingCompiled>::type - { - //FIXME: wrapping meta_and_compile_args into a tuple to unwrap them inside a helper function is the overkill - return compileStreaming(std::make_tuple(meta_and_compile_args...), - typename detail::MkSeq::type()); - } - - // Internal use only - /// @private - Priv& priv(); - /// @private - const Priv& priv() const; - /// @private - explicit GComputation(cv::gapi::s11n::IIStream &); - /// @private - void serialize(cv::gapi::s11n::IOStream &) const; - -protected: - - // 4. Helper methods for (3) - /// @private - template - GCompiled compile(const std::tuple &meta_and_compile_args, detail::Seq) - { - GMetaArgs meta_args = {GMetaArg(std::get(meta_and_compile_args))...}; - GCompileArgs comp_args = std::get(meta_and_compile_args); - return compile(std::move(meta_args), std::move(comp_args)); - } - template - GStreamingCompiled compileStreaming(const std::tuple &meta_and_compile_args, detail::Seq) - { - GMetaArgs meta_args = {GMetaArg(std::get(meta_and_compile_args))...}; - GCompileArgs comp_args = std::get(meta_and_compile_args); - return compileStreaming(std::move(meta_args), std::move(comp_args)); - } - void recompile(GMetaArgs&& in_metas, GCompileArgs &&args); - /// @private - std::shared_ptr m_priv; -}; -/** @} */ - -namespace gapi -{ - // FIXME: all these standalone functions need to be added to some - // common documentation section - /** - * @brief Define an tagged island (subgraph) within a computation. - * - * Declare an Island tagged with `name` and defined from `ins` to `outs` - * (exclusively, as ins/outs are data objects, and regioning is done on - * operations level). - * Throws if any operation between `ins` and `outs` are already assigned - * to another island. - * - * Islands allow to partition graph into subgraphs, fine-tuning - * the way it is scheduled by the underlying executor. - * - * @param name name of the Island to create - * @param ins vector of input data objects where the subgraph - * begins - * @param outs vector of output data objects where the subgraph - * ends. - * - * The way how an island is defined is similar to how - * cv::GComputation is defined on input/output data objects. - * Same rules apply here as well -- if there's no functional - * dependency between inputs and outputs or there's not enough - * input data objects were specified to properly calculate all - * outputs, an exception is thrown. - * - * Use cv::GIn() / cv::GOut() to specify input/output vectors. - */ - void GAPI_EXPORTS island(const std::string &name, - GProtoInputArgs &&ins, - GProtoOutputArgs &&outs); -} // namespace gapi - -} // namespace cv -#endif // OPENCV_GAPI_GCOMPUTATION_HPP diff --git a/modules/gapi/include/opencv2/gapi/gcomputation_async.hpp b/modules/gapi/include/opencv2/gapi/gcomputation_async.hpp deleted file mode 100644 index 8af603efea..0000000000 --- a/modules/gapi/include/opencv2/gapi/gcomputation_async.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - -#ifndef OPENCV_GAPI_GCOMPUTATION_ASYNC_HPP -#define OPENCV_GAPI_GCOMPUTATION_ASYNC_HPP - - -#include //for std::future -#include //for std::exception_ptr -#include //for std::function -#include //for GRunArgs, GRunArgsP -#include //for GCompileArgs -#include - - -namespace cv { - //fwd declaration - class GComputation; -namespace gapi { -namespace wip { - class GAsyncContext; - /** In contrast to async() functions, these do call GComputation::apply() member function of the GComputation passed in. - - @param gcomp Computation (graph) to run asynchronously - @param callback Callback to be called when execution of gcomp is done - @param ins Input parameters for gcomp - @param outs Output parameters for gcomp - @param args Compile arguments to pass to GComputation::apply() - @see async - */ - GAPI_EXPORTS void async_apply(GComputation& gcomp, std::function&& callback, GRunArgs &&ins, GRunArgsP &&outs, GCompileArgs &&args = {}); - /** @overload - @param gcomp Computation (graph) to run asynchronously - @param callback Callback to be called when execution of gcomp is done - @param ins Input parameters for gcomp - @param outs Output parameters for gcomp - @param args Compile arguments to pass to GComputation::apply() - @param ctx Context this request belongs to - @see async_apply async GAsyncContext - */ - GAPI_EXPORTS void async_apply(GComputation& gcomp, std::function&& callback, GRunArgs &&ins, GRunArgsP &&outs, GCompileArgs &&args, GAsyncContext& ctx); - /** @overload - @param gcomp Computation (graph) to run asynchronously - @param ins Input parameters for gcomp - @param outs Output parameters for gcomp - @param args Compile arguments to pass to GComputation::apply() - @return std::future object to wait for completion of async operation - @see async_apply async - */ - GAPI_EXPORTS std::future async_apply(GComputation& gcomp, GRunArgs &&ins, GRunArgsP &&outs, GCompileArgs &&args = {}); - /** @overload - @param gcomp Computation (graph) to run asynchronously - @param ins Input parameters for gcomp - @param outs Output parameters for gcomp - @param args Compile arguments to pass to GComputation::apply() - @param ctx Context this request belongs to - @return std::future object to wait for completion of async operation - @see async_apply async GAsyncContext - */ - GAPI_EXPORTS std::future async_apply(GComputation& gcomp, GRunArgs &&ins, GRunArgsP &&outs, GCompileArgs &&args, GAsyncContext& ctx); -} // namespace wip -} // namespace gapi -} // namespace cv - - -#endif //OPENCV_GAPI_GCOMPUTATION_ASYNC_HPP diff --git a/modules/gapi/include/opencv2/gapi/gframe.hpp b/modules/gapi/include/opencv2/gapi/gframe.hpp deleted file mode 100644 index 54fb30789e..0000000000 --- a/modules/gapi/include/opencv2/gapi/gframe.hpp +++ /dev/null @@ -1,113 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GFRAME_HPP -#define OPENCV_GAPI_GFRAME_HPP - -#include -#include // std::shared_ptr - -#include -#include // GShape - -#include -#include - -// TODO GAPI_EXPORTS or so -namespace cv -{ -// Forward declaration; GNode and GOrigin are an internal -// (user-inaccessible) classes. -class GNode; -struct GOrigin; - -/** \addtogroup gapi_data_objects - * @{ - */ -/** - * @brief GFrame class represents an image or media frame in the graph. - * - * GFrame doesn't store any data itself, instead it describes a - * functional relationship between operations consuming and producing - * GFrame objects. - * - * GFrame is introduced to handle various media formats (e.g., NV12 or - * I420) under the same type. Various image formats may differ in the - * number of planes (e.g. two for NV12, three for I420) and the pixel - * layout inside. GFrame type allows to handle these media formats in - * the graph uniformly -- the graph structure will not change if the - * media format changes, e.g. a different camera or decoder is used - * with the same graph. G-API provides a number of operations which - * operate directly on GFrame, like `infer<>()` or - * renderFrame(); these operations are expected to handle different - * media formats inside. There is also a number of accessor - * operations like BGR(), Y(), UV() -- these operations provide - * access to frame's data in the familiar cv::GMat form, which can be - * used with the majority of the existing G-API operations. These - * accessor functions may perform color space conversion on the fly if - * the image format of the GFrame they are applied to differs from the - * operation's semantic (e.g. the BGR() accessor is called on an NV12 - * image frame). - * - * GFrame is a virtual counterpart of cv::MediaFrame. - * - * @sa cv::MediaFrame, cv::GFrameDesc, BGR(), Y(), UV(), infer<>(). - */ -class GAPI_EXPORTS_W_SIMPLE GFrame -{ -public: - /** - * @brief Constructs an empty GFrame - * - * Normally, empty G-API data objects denote a starting point of - * the graph. When an empty GFrame is assigned to a result of some - * operation, it obtains a functional link to this operation (and - * is not empty anymore). - */ - GAPI_WRAP GFrame(); // Empty constructor - - /// @private - GFrame(const GNode &n, std::size_t out); // Operation result constructor - /// @private - GOrigin& priv(); // Internal use only - /// @private - const GOrigin& priv() const; // Internal use only - -private: - std::shared_ptr m_priv; -}; -/** @} */ - -enum class MediaFormat: int -{ - BGR = 0, - NV12, - GRAY, -}; - -/** - * \addtogroup gapi_meta_args - * @{ - */ -struct GAPI_EXPORTS GFrameDesc -{ - MediaFormat fmt; - cv::Size size; - - bool operator== (const GFrameDesc &) const; -}; -static inline GFrameDesc empty_gframe_desc() { return GFrameDesc{}; } -/** @} */ - -class MediaFrame; -GAPI_EXPORTS GFrameDesc descr_of(const MediaFrame &frame); - -GAPI_EXPORTS std::ostream& operator<<(std::ostream& os, const cv::GFrameDesc &desc); - -} // namespace cv - -#endif // OPENCV_GAPI_GFRAME_HPP diff --git a/modules/gapi/include/opencv2/gapi/gkernel.hpp b/modules/gapi/include/opencv2/gapi/gkernel.hpp deleted file mode 100644 index 6ec6bf573d..0000000000 --- a/modules/gapi/include/opencv2/gapi/gkernel.hpp +++ /dev/null @@ -1,757 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2021 Intel Corporation - - -#ifndef OPENCV_GAPI_GKERNEL_HPP -#define OPENCV_GAPI_GKERNEL_HPP - -#include -#include -#include // string -#include // false_type, true_type -#include // map (for GKernelPackage) -#include // tuple - -#include // CompileArgTag -#include // Seq -#include -#include // GArg -#include // GMetaArg -#include // GTypeTraits -#include //suppress_unused_warning -#include - -namespace cv { - -struct GTypeInfo -{ - GShape shape; - cv::detail::OpaqueKind kind; - detail::HostCtor ctor; -}; - -using GShapes = std::vector; -using GKinds = std::vector; -using GCtors = std::vector; -using GTypesInfo = std::vector; - -// GKernel describes kernel API to the system -// FIXME: add attributes of a kernel, (e.g. number and types -// of inputs, etc) -struct GAPI_EXPORTS GKernel -{ - using M = std::function; - - std::string name; // kernel ID, defined by its API (signature) - std::string tag; // some (implementation-specific) tag - M outMeta; // generic adaptor to API::outMeta(...) - GShapes outShapes; // types (shapes) kernel's outputs - GKinds inKinds; // kinds of kernel's inputs (fixme: below) - GCtors outCtors; // captured constructors for template output types - GKinds outKinds; // kinds of kernel's outputs (fixme: below) -}; -// TODO: It's questionable if inKinds should really be here. Instead, -// this information could come from meta. - -// GKernelImpl describes particular kernel implementation to the system -struct GAPI_EXPORTS GKernelImpl -{ - util::any opaque; // backend-specific opaque info - GKernel::M outMeta; // for deserialized graphs, the outMeta is taken here -}; - -template class GKernelTypeM; - -namespace detail -{ - //////////////////////////////////////////////////////////////////////////// - // yield() is used in graph construction time as a generic method to obtain - // lazy "return value" of G-API operations - // - template struct Yield; - template<> struct Yield - { - static inline cv::GMat yield(cv::GCall &call, int i) { return call.yield(i); } - }; - template<> struct Yield - { - static inline cv::GMatP yield(cv::GCall &call, int i) { return call.yieldP(i); } - }; - template<> struct Yield - { - static inline cv::GScalar yield(cv::GCall &call, int i) { return call.yieldScalar(i); } - }; - template struct Yield > - { - static inline cv::GArray yield(cv::GCall &call, int i) { return call.yieldArray(i); } - }; - template struct Yield > - { - static inline cv::GOpaque yield(cv::GCall &call, int i) { return call.yieldOpaque(i); } - }; - template<> struct Yield - { - static inline cv::GFrame yield(cv::GCall &call, int i) { return call.yieldFrame(i); } - }; - - //////////////////////////////////////////////////////////////////////////// - // Helper classes which brings outputMeta() marshalling to kernel - // implementations - // - // 1. MetaType establishes G#Type -> G#Meta mapping between G-API dynamic - // types and its metadata descriptor types. - // This mapping is used to transform types to call outMeta() callback. - template struct MetaType; - template<> struct MetaType { using type = GMatDesc; }; - template<> struct MetaType { using type = GMatDesc; }; - template<> struct MetaType { using type = GFrameDesc; }; - template<> struct MetaType { using type = GScalarDesc; }; - template struct MetaType > { using type = GArrayDesc; }; - template struct MetaType > { using type = GOpaqueDesc; }; - template struct MetaType { using type = T; }; // opaque args passed as-is - // FIXME: Move it to type traits? - - // 2. Hacky test based on MetaType to check if we operate on G-* type or not - template using is_nongapi_type = std::is_same::type>; - - // 3. Two ways to transform input arguments to its meta - for G-* and non-G* types: - template - typename std::enable_if::value, typename MetaType::type> - ::type get_in_meta(const GMetaArgs &in_meta, const GArgs &, int idx) - { - return util::get::type>(in_meta.at(idx)); - } - - template - typename std::enable_if::value, T> - ::type get_in_meta(const GMetaArgs &, const GArgs &in_args, int idx) - { - return in_args.at(idx).template get(); - } - - // 4. The MetaHelper itself: an entity which generates outMeta() call - // based on kernel signature, with arguments properly substituted. - // 4.1 - case for multiple return values - // FIXME: probably can be simplified with std::apply or analogue. - template - struct MetaHelper; - - template - struct MetaHelper, std::tuple > - { - template - static GMetaArgs getOutMeta_impl(const GMetaArgs &in_meta, - const GArgs &in_args, - detail::Seq, - detail::Seq) - { - // FIXME: decay? - using R = std::tuple::type...>; - const R r = K::outMeta( get_in_meta(in_meta, in_args, IIs)... ); - return GMetaArgs{ GMetaArg(std::get(r))... }; - } - // FIXME: help users identify how outMeta must look like (via default impl w/static_assert?) - - static GMetaArgs getOutMeta(const GMetaArgs &in_meta, - const GArgs &in_args) - { - return getOutMeta_impl(in_meta, - in_args, - typename detail::MkSeq::type(), - typename detail::MkSeq::type()); - } - }; - - // 4.1 - case for a single return value - // FIXME: How to avoid duplication here? - template - struct MetaHelper, Out > - { - template - static GMetaArgs getOutMeta_impl(const GMetaArgs &in_meta, - const GArgs &in_args, - detail::Seq) - { - // FIXME: decay? - using R = typename MetaType::type; - const R r = K::outMeta( get_in_meta(in_meta, in_args, IIs)... ); - return GMetaArgs{ GMetaArg(r) }; - } - // FIXME: help users identify how outMeta must look like (via default impl w/static_assert?) - - static GMetaArgs getOutMeta(const GMetaArgs &in_meta, - const GArgs &in_args) - { - return getOutMeta_impl(in_meta, - in_args, - typename detail::MkSeq::type()); - } - }; - - //////////////////////////////////////////////////////////////////////////// - // Helper class to introduce tags to calls. By default there's no tag - struct NoTag { - static constexpr const char *tag() { return ""; } - }; - -} // namespace detail - -// GKernelType and GKernelTypeM are base classes which implement typed ::on() -// method based on kernel signature. GKernelTypeM stands for multiple-return-value kernels -// -// G_TYPED_KERNEL and G_TYPED_KERNEL_M macros inherit user classes from GKernelType and -// GKernelTypeM respectively. - -template -class GKernelTypeM(Args...)> > - : public detail::MetaHelper, std::tuple> - , public detail::NoTag -{ - template - static std::tuple yield(cv::GCall &call, detail::Seq) - { - return std::make_tuple(detail::Yield::yield(call, IIs)...); - } - -public: - using InArgs = std::tuple; - using OutArgs = std::tuple; - - // TODO: Args&&... here? - static std::tuple on(Args... args) - { - cv::GCall call(GKernel{ K::id() - , K::tag() - , &K::getOutMeta - , {detail::GTypeTraits::shape...} - , {detail::GTypeTraits::op_kind...} - , {detail::GObtainCtor::get()...} - , {detail::GTypeTraits::op_kind...}}); - call.pass(args...); // TODO: std::forward() here? - return yield(call, typename detail::MkSeq::type()); - } -}; - -template class GKernelType; - -template -class GKernelType > - : public detail::MetaHelper, R> - , public detail::NoTag -{ -public: - using InArgs = std::tuple; - using OutArgs = std::tuple; - - static R on(Args... args) - { - cv::GCall call(GKernel{ K::id() - , K::tag() - , &K::getOutMeta - , {detail::GTypeTraits::shape} - , {detail::GTypeTraits::op_kind...} - , {detail::GObtainCtor::get()} - , {detail::GTypeTraits::op_kind}}); - call.pass(args...); - return detail::Yield::yield(call, 0); - } -}; - -namespace detail { -// This tiny class eliminates the semantic difference between -// GKernelType and GKernelTypeM. -template class KernelTypeMedium; - -template -class KernelTypeMedium(Args...)>> : - public cv::GKernelTypeM(Args...)>> {}; - -template -class KernelTypeMedium> : - public cv::GKernelType> {}; -} // namespace detail - -} // namespace cv - - -// FIXME: I don't know a better way so far. Feel free to suggest one -// The problem is that every typed kernel should have ::id() but body -// of the class is defined by user (with outMeta, other stuff) - -//! @cond IGNORED -#define G_ID_HELPER_CLASS(Class) Class##IdHelper - -#define G_ID_HELPER_BODY(Class, Id) \ - struct G_ID_HELPER_CLASS(Class) \ - { \ - static constexpr const char * id() {return Id;} \ - }; \ -//! @endcond - -#define GET_G_TYPED_KERNEL(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, NAME, ...) NAME -#define COMBINE_SIGNATURE(...) __VA_ARGS__ -// Ensure correct __VA_ARGS__ expansion on Windows -#define __WRAP_VAARGS(x) x - -/** - * Helper for G_TYPED_KERNEL declares a new G-API Operation. See [Kernel API](@ref gapi_kernel_api) - * for more details. - * - * @param Class type name for this operation. - * @param API an `std::function<>`-like signature for the operation; - * return type is a single value or a tuple of multiple values. - * @param Id string identifier for the operation. Must be unique. - */ -#define G_TYPED_KERNEL_HELPER(Class, API, Id) \ - G_ID_HELPER_BODY(Class, Id) \ - struct Class final: public cv::detail::KernelTypeMedium, \ - public G_ID_HELPER_CLASS(Class) -// {body} is to be defined by user - -#define G_TYPED_KERNEL_HELPER_2(Class, _1, _2, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2), Id) - -#define G_TYPED_KERNEL_HELPER_3(Class, _1, _2, _3, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2, _3), Id) - -#define G_TYPED_KERNEL_HELPER_4(Class, _1, _2, _3, _4, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2, _3, _4), Id) - -#define G_TYPED_KERNEL_HELPER_5(Class, _1, _2, _3, _4, _5, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2, _3, _4, _5), Id) - -#define G_TYPED_KERNEL_HELPER_6(Class, _1, _2, _3, _4, _5, _6, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2, _3, _4, _5, _6), Id) - -#define G_TYPED_KERNEL_HELPER_7(Class, _1, _2, _3, _4, _5, _6, _7, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2, _3, _4, _5, _6, _7), Id) - -#define G_TYPED_KERNEL_HELPER_8(Class, _1, _2, _3, _4, _5, _6, _7, _8, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2, _3, _4, _5, _6, _7, _8), Id) - -#define G_TYPED_KERNEL_HELPER_9(Class, _1, _2, _3, _4, _5, _6, _7, _8, _9, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2, _3, _4, _5, _6, _7, _8, _9), Id) - -#define G_TYPED_KERNEL_HELPER_10(Class, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, Id) \ -G_TYPED_KERNEL_HELPER(Class, COMBINE_SIGNATURE(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10), Id) - -/** - * Declares a new G-API Operation. See [Kernel API](@ref gapi_kernel_api) - * for more details. - * - * @param Class type name for this operation. - */ -#define G_TYPED_KERNEL(Class, ...) __WRAP_VAARGS(GET_G_TYPED_KERNEL(__VA_ARGS__, \ - G_TYPED_KERNEL_HELPER_10, \ - G_TYPED_KERNEL_HELPER_9, \ - G_TYPED_KERNEL_HELPER_8, \ - G_TYPED_KERNEL_HELPER_7, \ - G_TYPED_KERNEL_HELPER_6, \ - G_TYPED_KERNEL_HELPER_5, \ - G_TYPED_KERNEL_HELPER_4, \ - G_TYPED_KERNEL_HELPER_3, \ - G_TYPED_KERNEL_HELPER_2, \ - G_TYPED_KERNEL_HELPER)(Class, __VA_ARGS__)) \ - -/** - * Declares a new G-API Operation. See [Kernel API](@ref gapi_kernel_api) for more details. - * - * @deprecated This macro is deprecated in favor of `G_TYPED_KERNEL` that is used for declaring any - * G-API Operation. - * - * @param Class type name for this operation. - */ -#define G_TYPED_KERNEL_M G_TYPED_KERNEL - -#define G_API_OP G_TYPED_KERNEL -#define G_API_OP_M G_API_OP - -namespace cv -{ -namespace gapi -{ - // Prework: model "Device" API before it gets to G-API headers. - // FIXME: Don't mix with internal Backends class! - /// @private - class GAPI_EXPORTS GBackend - { - public: - class Priv; - - // TODO: make it template (call `new` within??) - GBackend(); - explicit GBackend(std::shared_ptr &&p); - - Priv& priv(); - const Priv& priv() const; - std::size_t hash() const; - - bool operator== (const GBackend &rhs) const; - - private: - std::shared_ptr m_priv; - }; - - inline bool operator != (const GBackend &lhs, const GBackend &rhs) - { - return !(lhs == rhs); - } -} // namespace gapi -} // namespace cv - -namespace std -{ - template<> struct hash - { - std::size_t operator() (const cv::gapi::GBackend &b) const - { - return b.hash(); - } - }; -} // namespace std - -namespace cv { - class GAPI_EXPORTS_W_SIMPLE GKernelPackage; - -namespace gapi { - GAPI_EXPORTS_W cv::GKernelPackage combine(const cv::GKernelPackage &lhs, - const cv::GKernelPackage &rhs); - - /// @private - class GFunctor - { - public: - virtual cv::GKernelImpl impl() const = 0; - virtual cv::gapi::GBackend backend() const = 0; - const char* id() const { return m_id; } - - virtual ~GFunctor() = default; - protected: - GFunctor(const char* id) : m_id(id) { } - private: - const char* m_id; - }; -} // namespace gapi - - /** \addtogroup gapi_compile_args - * @{ - */ - - // FIXME: Hide implementation - /** - * @brief A container class for heterogeneous kernel - * implementation collections and graph transformations. - * - * GKernelPackage is a special container class which stores kernel - * _implementations_ and graph _transformations_. Objects of this class - * are created and passed to cv::GComputation::compile() to specify - * which kernels to use and which transformations to apply in the - * compiled graph. GKernelPackage may contain kernels of - * different backends, e.g. be heterogeneous. - * - * The most easy way to create a kernel package is to use function - * cv::gapi::kernels(). This template functions takes kernel - * implementations in form of type list (variadic template) and - * generates a kernel package atop of that. - * - * Kernel packages can be also generated programmatically, starting - * with an empty package (created with the default constructor) - * and then by populating it with kernels via call to - * GKernelPackage::include(). Note this method is also a template - * one since G-API kernel and transformation implementations are _types_, - * not objects. - * - * Finally, two kernel packages can be combined into a new one - * with function cv::gapi::combine(). - */ - class GAPI_EXPORTS_W_SIMPLE GKernelPackage - { - - /// @private - using M = std::unordered_map>; - - /// @private - M m_id_kernels; - - /// @private - std::vector m_transformations; - - protected: - /// @private - // Remove ALL implementations of the given API (identified by ID) - void removeAPI(const std::string &id); - - /// @private - // Partial include() specialization for kernels - template - typename std::enable_if<(std::is_base_of::value), void>::type - includeHelper() - { - auto backend = KImpl::backend(); - auto kernel_id = KImpl::API::id(); - auto kernel_impl = GKernelImpl{KImpl::kernel(), &KImpl::API::getOutMeta}; - removeAPI(kernel_id); - - m_id_kernels[kernel_id] = std::make_pair(backend, kernel_impl); - } - - /// @private - // Partial include() specialization for transformations - template - typename std::enable_if<(std::is_base_of::value), void>::type - includeHelper() - { - m_transformations.emplace_back(TImpl::transformation()); - } - - public: - void include(const cv::gapi::GFunctor& functor); - - /** - * @brief Returns total number of kernels - * in the package (across all backends included) - * - * @return a number of kernels in the package - */ - GAPI_WRAP std::size_t size() const; - - /** - * @brief Returns vector of transformations included in the package - * - * @return vector of transformations included in the package - */ - const std::vector& get_transformations() const; - - /** - * @brief Returns vector of kernel ids included in the package - * - * @return vector of kernel ids included in the package - */ - std::vector get_kernel_ids() const; - - /** - * @brief Test if a particular kernel _implementation_ KImpl is - * included in this kernel package. - * - * @sa includesAPI() - * - * @note cannot be applied to transformations - * - * @return true if there is such kernel, false otherwise. - */ - template - bool includes() const - { - static_assert(std::is_base_of::value, - "includes() can be applied to kernels only"); - - auto kernel_it = m_id_kernels.find(KImpl::API::id()); - return kernel_it != m_id_kernels.end() && - kernel_it->second.first == KImpl::backend(); - } - - /** - * @brief Remove all kernels associated with the given backend - * from the package. - * - * Does nothing if there's no kernels of this backend in the package. - * - * @param backend backend which kernels to remove - */ - void remove(const cv::gapi::GBackend& backend); - - /** - * @brief Remove all kernels implementing the given API from - * the package. - * - * Does nothing if there's no kernels implementing the given interface. - */ - template - void remove() - { - removeAPI(KAPI::id()); - } - - // FIXME: Rename to includes() and distinguish API/impl case by - // statically? - /** - * Check if package contains ANY implementation of a kernel API - * by API type. - */ - template - bool includesAPI() const - { - return includesAPI(KAPI::id()); - } - - /// @private - bool includesAPI(const std::string &id) const; - - // FIXME: The below comment is wrong, and who needs this function? - /** - * @brief Find a kernel (by its API) - * - * Returns implementation corresponding id. - * Throws if nothing found. - * - * @return Backend which hosts matching kernel implementation. - * - */ - template - cv::gapi::GBackend lookup() const - { - return lookup(KAPI::id()).first; - } - - /// @private - std::pair - lookup(const std::string &id) const; - - // FIXME: No overwrites allowed? - /** - * @brief Put a new kernel implementation or a new transformation - * KImpl into the package. - */ - template - void include() - { - includeHelper(); - } - - /** - * @brief Adds a new kernel based on it's backend and id into the kernel package - * - * @param backend backend associated with the kernel - * @param kernel_id a name/id of the kernel - */ - void include(const cv::gapi::GBackend& backend, const std::string& kernel_id); - - /** - * @brief Lists all backends which are included into package - * - * @return vector of backends - */ - std::vector backends() const; - - // TODO: Doxygen bug -- it wants me to place this comment - // here, not below. - /** - * @brief Create a new package based on `lhs` and `rhs`. - * - * @param lhs "Left-hand-side" package in the process - * @param rhs "Right-hand-side" package in the process - * @return a new kernel package. - */ - friend GAPI_EXPORTS GKernelPackage cv::gapi::combine(const GKernelPackage &lhs, - const GKernelPackage &rhs); - }; - /** @} */ - -namespace gapi { - using GKernelPackage = cv::GKernelPackage; // Keep backward compatibility - - /** \addtogroup gapi_compile_args - * @{ - */ - - /** - * @brief Create a kernel package object containing kernels - * and transformations specified in variadic template argument. - * - * In G-API, kernel implementations and transformations are _types_. - * Every backend has its own kernel API (like GAPI_OCV_KERNEL() and - * GAPI_FLUID_KERNEL()) but all of that APIs define a new type for - * each kernel implementation. - * - * Use this function to pass kernel implementations (defined in - * either way) and transformations to the system. Example: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp kernels_snippet - * - * Note that kernels() itself is a function returning object, not - * a type, so having `()` at the end is important -- it must be a - * function call. - */ - template GKernelPackage kernels() - { - // FIXME: currently there is no check that transformations' signatures are unique - // and won't be any intersection in graph compilation stage - static_assert(cv::detail::all_unique::value, "Kernels API must be unique"); - - GKernelPackage pkg; - - // For those who wonder - below is a trick to call a number of - // methods based on parameter pack (zeroes just help hiding these - // calls into a sequence which helps to expand this parameter pack). - // Just note that `f(),a` always equals to `a` (with f() called!) - // and parentheses are used to hide function call in the expanded sequence. - // Leading 0 helps to handle case when KK is an empty list (kernels<>()). - int unused[] = { 0, (pkg.include(), 0)... }; - cv::util::suppress_unused_warning(unused); - return pkg; - } - - template - GKernelPackage kernels(FF&... functors) - { - GKernelPackage pkg; - int unused[] = { 0, (pkg.include(functors), 0)... }; - cv::util::suppress_unused_warning(unused); - return pkg; - } - - /** @} */ - - /** - * @brief Combines multiple G-API kernel packages into one - * - * @overload - * - * This function successively combines the passed kernel packages using a right fold. - * Calling `combine(a, b, c)` is equal to `combine(a, combine(b, c))`. - * - * @return The resulting kernel package - */ - template - cv::GKernelPackage combine(const cv::GKernelPackage &a, const cv::GKernelPackage &b, Ps&&... rest) - { - return combine(a, combine(b, rest...)); - } - // NB(DM): Variadic-arg version in Python may require the same - // approach as used in GComputation::compile/apply. - - /** \addtogroup gapi_compile_args - * @{ - */ - /** - * @brief cv::gapi::use_only() is a special combinator which hints G-API to use only - * kernels specified in cv::GComputation::compile() (and not to extend kernels available by - * default with that package). - */ - struct GAPI_EXPORTS use_only - { - GKernelPackage pkg; - }; - /** @} */ - -} // namespace gapi - -namespace detail -{ - template<> struct CompileArgTag - { - static const char* tag() { return "gapi.kernel_package"; } - }; - - template<> struct CompileArgTag - { - static const char* tag() { return "gapi.use_only"; } - }; -} // namespace detail - -} // namespace cv - -#endif // OPENCV_GAPI_GKERNEL_HPP diff --git a/modules/gapi/include/opencv2/gapi/gmat.hpp b/modules/gapi/include/opencv2/gapi/gmat.hpp deleted file mode 100644 index 6d6f74ff7f..0000000000 --- a/modules/gapi/include/opencv2/gapi/gmat.hpp +++ /dev/null @@ -1,292 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GMAT_HPP -#define OPENCV_GAPI_GMAT_HPP - -#include -#include // std::shared_ptr - -#include -#include // GShape - -#include - -// TODO GAPI_EXPORTS or so -namespace cv -{ -// Forward declaration; GNode and GOrigin are an internal -// (user-inaccessible) classes. -class GNode; -struct GOrigin; - -/** \addtogroup gapi_data_objects - * @{ - * - * @brief G-API data objects used to build G-API expressions. - * - * These objects do not own any particular data (except compile-time - * associated values like with cv::GScalar or `cv::GArray`) and are - * used only to construct graphs. - * - * Every graph in G-API starts and ends with data objects. - * - * Once constructed and compiled, G-API operates with regular host-side - * data instead. Refer to the below table to find the mapping between - * G-API and regular data types when passing input and output data - * structures to G-API: - * - * G-API data type | I/O data type - * ------------------ | ------------- - * cv::GMat | cv::Mat, cv::UMat, cv::RMat - * cv::GScalar | cv::Scalar - * `cv::GArray` | std::vector - * `cv::GOpaque` | T - * cv::GFrame | cv::MediaFrame - */ - -/** - * @brief GMat class represents image or tensor data in the - * graph. - * - * GMat doesn't store any data itself, instead it describes a - * functional relationship between operations consuming and producing - * GMat objects. - * - * GMat is a virtual counterpart of Mat and UMat, but it - * doesn't mean G-API use Mat or UMat objects internally to represent - * GMat objects -- the internal data representation may be - * backend-specific or optimized out at all. - * - * @sa Mat, GMatDesc - */ -class GAPI_EXPORTS_W_SIMPLE GMat -{ -public: - /** - * @brief Constructs an empty GMat - * - * Normally, empty G-API data objects denote a starting point of - * the graph. When an empty GMat is assigned to a result of some - * operation, it obtains a functional link to this operation (and - * is not empty anymore). - */ - GAPI_WRAP GMat(); // Empty constructor - - /** - * @brief Constructs a value-initialized GMat - * - * GMat may be associated with a buffer at graph construction time. - * It is useful when some operation has a Mat input which doesn't - * change during the program execution, and is set only once. - * In this case, there's no need to declare such GMat as graph input. - * - * @param m a cv::Mat buffer to associate with this GMat object. - */ - GAPI_WRAP explicit GMat(cv::Mat m); // Value-initialization constructor - - /// @private - GMat(const GNode &n, std::size_t out); // Operation result constructor - /// @private - GOrigin& priv(); // Internal use only - /// @private - const GOrigin& priv() const; // Internal use only - -private: - std::shared_ptr m_priv; -}; - -class GAPI_EXPORTS GMatP : public GMat -{ -public: - using GMat::GMat; -}; - -class RMat; - -/** @} */ - -/** - * \addtogroup gapi_meta_args - * @{ - */ -struct GAPI_EXPORTS_W_SIMPLE GMatDesc -{ - // FIXME: Default initializers in C++14 - GAPI_PROP int depth; - GAPI_PROP int chan; - GAPI_PROP cv::Size size; // NB.: no multi-dimensional cases covered yet - GAPI_PROP bool planar; - GAPI_PROP std::vector dims; // FIXME: Maybe it's real questionable to have it here - - GAPI_WRAP GMatDesc(int d, int c, cv::Size s, bool p = false) - : depth(d), chan(c), size(s), planar(p) {} - - GAPI_WRAP GMatDesc(int d, const std::vector &dd) - : depth(d), chan(-1), size{-1,-1}, planar(false), dims(dd) {} - - GAPI_WRAP GMatDesc(int d, std::vector &&dd) - : depth(d), chan(-1), size{-1,-1}, planar(false), dims(std::move(dd)) {} - - GAPI_WRAP GMatDesc() : GMatDesc(-1, -1, {-1,-1}) {} - - inline bool operator== (const GMatDesc &rhs) const - { - return depth == rhs.depth - && chan == rhs.chan - && size == rhs.size - && planar == rhs.planar - && dims == rhs.dims; - } - - inline bool operator!= (const GMatDesc &rhs) const - { - return !(*this == rhs); - } - - bool isND() const { return !dims.empty(); } - - // Checks if the passed mat can be described by this descriptor - // (it handles the case when - // 1-channel mat can be reinterpreted as is (1-channel mat) - // and as a 3-channel planar mat with height divided by 3) - bool canDescribe(const cv::Mat& mat) const; - - bool canDescribe(const cv::RMat& mat) const; - - // Meta combinator: return a new GMatDesc which differs in size by delta - // (all other fields are taken unchanged from this GMatDesc) - // FIXME: a better name? - GAPI_WRAP GMatDesc withSizeDelta(cv::Size delta) const - { - GMatDesc desc(*this); - desc.size += delta; - return desc; - } - // Meta combinator: return a new GMatDesc which differs in size by delta - // (all other fields are taken unchanged from this GMatDesc) - // - // This is an overload. - GAPI_WRAP GMatDesc withSizeDelta(int dx, int dy) const - { - return withSizeDelta(cv::Size{dx,dy}); - } - - GAPI_WRAP GMatDesc withSize(cv::Size sz) const - { - GMatDesc desc(*this); - desc.size = sz; - return desc; - } - - // Meta combinator: return a new GMatDesc with specified data depth. - // (all other fields are taken unchanged from this GMatDesc) - GAPI_WRAP GMatDesc withDepth(int ddepth) const - { - GAPI_Assert(CV_MAT_CN(ddepth) == 1 || ddepth == -1); - GMatDesc desc(*this); - if (ddepth != -1) desc.depth = ddepth; - return desc; - } - - // Meta combinator: return a new GMatDesc with specified data depth - // and number of channels. - // (all other fields are taken unchanged from this GMatDesc) - GAPI_WRAP GMatDesc withType(int ddepth, int dchan) const - { - GAPI_Assert(CV_MAT_CN(ddepth) == 1 || ddepth == -1); - GMatDesc desc = withDepth(ddepth); - desc.chan = dchan; - return desc; - } - - // Meta combinator: return a new GMatDesc with planar flag set - // (no size changes are performed, only channel interpretation is changed - // (interleaved -> planar) - GAPI_WRAP GMatDesc asPlanar() const - { - GAPI_Assert(planar == false); - GMatDesc desc(*this); - desc.planar = true; - return desc; - } - - // Meta combinator: return a new GMatDesc - // reinterpreting 1-channel input as planar image - // (size height is divided by plane number) - GAPI_WRAP GMatDesc asPlanar(int planes) const - { - GAPI_Assert(planar == false); - GAPI_Assert(chan == 1); - GAPI_Assert(planes > 1); - GAPI_Assert(size.height % planes == 0); - GMatDesc desc(*this); - desc.size.height /= planes; - desc.chan = planes; - return desc.asPlanar(); - } - - // Meta combinator: return a new GMatDesc with planar flag set to false - // (no size changes are performed, only channel interpretation is changed - // (planar -> interleaved) - GAPI_WRAP GMatDesc asInterleaved() const - { - GAPI_Assert(planar == true); - GMatDesc desc(*this); - desc.planar = false; - return desc; - } -}; - -static inline GMatDesc empty_gmat_desc() { return GMatDesc{-1,-1,{-1,-1}}; } - -namespace gapi { namespace detail { -/** Checks GMatDesc fields if the passed matrix is a set of n-dimentional points. -@param in GMatDesc to check. -@param n expected dimensionality. -@return the amount of points. In case input matrix can't be described as vector of points -of expected dimensionality, returns -1. - */ -int checkVector(const GMatDesc& in, const size_t n); - -/** @overload - -Checks GMatDesc fields if the passed matrix can be described as a set of points of any -dimensionality. - -@return array of two elements in form of std::vector: the amount of points -and their calculated dimensionality. In case input matrix can't be described as vector of points, -returns {-1, -1}. - */ -std::vector checkVector(const GMatDesc& in); -}} // namespace gapi::detail - -#if !defined(GAPI_STANDALONE) -GAPI_EXPORTS GMatDesc descr_of(const cv::UMat &mat); -#endif // !defined(GAPI_STANDALONE) - -//Fwd declarations -namespace gapi { namespace own { - class Mat; - GAPI_EXPORTS GMatDesc descr_of(const Mat &mat); -}}//gapi::own - -GAPI_EXPORTS GMatDesc descr_of(const RMat &mat); - -#if !defined(GAPI_STANDALONE) -GAPI_EXPORTS GMatDesc descr_of(const cv::Mat &mat); -#else -using gapi::own::descr_of; -#endif - -/** @} */ - -GAPI_EXPORTS std::ostream& operator<<(std::ostream& os, const cv::GMatDesc &desc); - -} // namespace cv - -#endif // OPENCV_GAPI_GMAT_HPP diff --git a/modules/gapi/include/opencv2/gapi/gmetaarg.hpp b/modules/gapi/include/opencv2/gapi/gmetaarg.hpp deleted file mode 100644 index f21182c19f..0000000000 --- a/modules/gapi/include/opencv2/gapi/gmetaarg.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GMETAARG_HPP -#define OPENCV_GAPI_GMETAARG_HPP - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace cv -{ -// FIXME: Rename to GMeta? -// FIXME: user shouldn't deal with it - put to detail? -// GMetaArg is an union type over descriptions of G-types which can serve as -// GComputation's in/output slots. -// -// GMetaArg objects are passed as arguments to GComputation::compile() -// to specify which data a compiled computation should be specialized on. -// For manual compile(), user must supply this metadata, in case of apply() -// this metadata is taken from arguments computation should operate on. -// -// The first type (monostate) is equal to "uninitialized"/"unresolved" meta. -using GMetaArg = util::variant - < util::monostate - , GMatDesc - , GScalarDesc - , GArrayDesc - , GOpaqueDesc - , GFrameDesc - >; -GAPI_EXPORTS std::ostream& operator<<(std::ostream& os, const GMetaArg &); - -using GMetaArgs = std::vector; - -namespace detail -{ - // These traits are used by GComputation::compile() - - // FIXME: is_constructible doesn't work as variant doesn't do any SFINAE - // in its current template constructor - - template struct is_meta_descr : std::false_type {}; - template<> struct is_meta_descr : std::true_type {}; - template<> struct is_meta_descr : std::true_type {}; - template<> struct is_meta_descr : std::true_type {}; - template<> struct is_meta_descr : std::true_type {}; - - template - using are_meta_descrs = all_satisfy; - - template - using are_meta_descrs_but_last = all_satisfy::type>; - -} // namespace detail - -// Note: descr_of(std::vector<..>) returns a GArrayDesc, while -// descrs_of(std::vector<..>) returns an array of Meta args! -class UMat; -GAPI_EXPORTS cv::GMetaArgs descrs_of(const std::vector &vec); -GAPI_EXPORTS cv::GMetaArgs descrs_of(const std::vector &vec); -namespace gapi { namespace own { - GAPI_EXPORTS cv::GMetaArgs descrs_of(const std::vector &vec); -}} // namespace gapi::own - -} // namespace cv - -#endif // OPENCV_GAPI_GMETAARG_HPP diff --git a/modules/gapi/include/opencv2/gapi/gopaque.hpp b/modules/gapi/include/opencv2/gapi/gopaque.hpp deleted file mode 100644 index a3f98a9867..0000000000 --- a/modules/gapi/include/opencv2/gapi/gopaque.hpp +++ /dev/null @@ -1,369 +0,0 @@ -// 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. -// -// Copyright (C) 2019-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GOPAQUE_HPP -#define OPENCV_GAPI_GOPAQUE_HPP - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include // OpaqueKind -#include // TypeHintBase - -namespace cv -{ -// Forward declaration; GNode and GOrigin are an internal -// (user-inaccessible) classes. -class GNode; -struct GOrigin; -template class GOpaque; - -/** - * \addtogroup gapi_meta_args - * @{ - */ -struct GAPI_EXPORTS_W_SIMPLE GOpaqueDesc -{ - // FIXME: Body - // FIXME: Also implement proper operator== then - bool operator== (const GOpaqueDesc&) const { return true; } -}; -template GOpaqueDesc descr_of(const U &) { return {};} -GAPI_EXPORTS_W inline GOpaqueDesc empty_gopaque_desc() {return {}; } -/** @} */ - -std::ostream& operator<<(std::ostream& os, const cv::GOpaqueDesc &desc); - -namespace detail -{ - // ConstructOpaque is a callback which stores information about T and is used by - // G-API runtime to construct an object in host memory (T remains opaque for G-API). - // ConstructOpaque is carried into G-API internals by GOpaqueU. - // Currently it is suitable for Host (CPU) plugins only, real offload may require - // more information for manual memory allocation on-device. - class OpaqueRef; - using ConstructOpaque = std::function; - - // FIXME: garray.hpp already contains hint classes (for actual T type verification), - // need to think where it can be moved (currently opaque uses it from garray) - - // This class strips type information from GOpaque and makes it usable - // in the G-API graph compiler (expression unrolling, graph generation, etc). - // Part of GProtoArg. - class GAPI_EXPORTS GOpaqueU - { - public: - GOpaqueU(const GNode &n, std::size_t out); // Operation result constructor - - template - bool holds() const; // Check if was created from GOpaque - - GOrigin& priv(); // Internal use only - const GOrigin& priv() const; // Internal use only - - protected: - GOpaqueU(); // Default constructor - template friend class cv::GOpaque; // (available for GOpaque only) - - void setConstructFcn(ConstructOpaque &&cv); // Store T-aware constructor - - template - void specifyType(); // Store type of initial GOpaque - - template - void storeKind(); - - void setKind(cv::detail::OpaqueKind); - - std::shared_ptr m_priv; - std::shared_ptr m_hint; - }; - - template - bool GOpaqueU::holds() const{ - GAPI_Assert(m_hint != nullptr); - using U = util::decay_t; - return dynamic_cast*>(m_hint.get()) != nullptr; - } - - template - void GOpaqueU::specifyType(){ - m_hint.reset(new TypeHint>); - } - - template - void GOpaqueU::storeKind(){ - // FIXME: Add assert here on cv::Mat and cv::Scalar? - setKind(cv::detail::GOpaqueTraits::kind); - } - - // This class represents a typed object reference. - // Depending on origins, this reference may be either "just a" reference to - // an object created externally, OR actually own the underlying object - // (be value holder). - class BasicOpaqueRef - { - public: - cv::GOpaqueDesc m_desc; - virtual ~BasicOpaqueRef() {} - - virtual void mov(BasicOpaqueRef &ref) = 0; - virtual const void* ptr() const = 0; - virtual void set(const cv::util::any &a) = 0; - }; - - template class OpaqueRefT final: public BasicOpaqueRef - { - using empty_t = util::monostate; - using ro_ext_t = const T *; - using rw_ext_t = T *; - using rw_own_t = T ; - util::variant m_ref; - - inline bool isEmpty() const { return util::holds_alternative(m_ref); } - inline bool isROExt() const { return util::holds_alternative(m_ref); } - inline bool isRWExt() const { return util::holds_alternative(m_ref); } - inline bool isRWOwn() const { return util::holds_alternative(m_ref); } - - void init(const T* obj = nullptr) - { - if (obj) m_desc = cv::descr_of(*obj); - } - - public: - OpaqueRefT() { init(); } - virtual ~OpaqueRefT() {} - - explicit OpaqueRefT(const T& obj) : m_ref(&obj) { init(&obj); } - explicit OpaqueRefT( T& obj) : m_ref(&obj) { init(&obj); } - explicit OpaqueRefT( T&& obj) : m_ref(std::move(obj)) { init(&obj); } - - // Reset a OpaqueRefT. Called only for objects instantiated - // internally in G-API (e.g. temporary GOpaque's within a - // computation). Reset here means both initialization - // (creating an object) and reset (discarding its existing - // content before the next execution). Must never be called - // for external OpaqueRefTs. - void reset() - { - if (isEmpty()) - { - T empty_obj{}; - m_desc = cv::descr_of(empty_obj); - m_ref = std::move(empty_obj); - GAPI_Assert(isRWOwn()); - } - else if (isRWOwn()) - { - util::get(m_ref) = {}; - } - else GAPI_Error("InternalError"); // shouldn't be called in *EXT modes - } - - // Obtain a WRITE reference to underlying object - // Used by CPU kernel API wrappers when a kernel execution frame - // is created - T& wref() - { - GAPI_Assert(isRWExt() || isRWOwn()); - if (isRWExt()) return *util::get(m_ref); - if (isRWOwn()) return util::get(m_ref); - util::throw_error(std::logic_error("Impossible happened")); - } - - // Obtain a READ reference to underlying object - // Used by CPU kernel API wrappers when a kernel execution frame - // is created - const T& rref() const - { - // ANY object can be accessed for reading, even if it declared for - // output. Example -- a GComputation from [in] to [out1,out2] - // where [out2] is a result of operation applied to [out1]: - // - // GComputation boundary - // . . . . . . . - // . . - // [in] ----> foo() ----> [out1] - // . . : - // . . . .:. . . - // . V . - // . bar() ---> [out2] - // . . . . . . . . . . . . - // - if (isROExt()) return *util::get(m_ref); - if (isRWExt()) return *util::get(m_ref); - if (isRWOwn()) return util::get(m_ref); - util::throw_error(std::logic_error("Impossible happened")); - } - - virtual void mov(BasicOpaqueRef &v) override { - OpaqueRefT *tv = dynamic_cast*>(&v); - GAPI_Assert(tv != nullptr); - wref() = std::move(tv->wref()); - } - - virtual const void* ptr() const override { return &rref(); } - - virtual void set(const cv::util::any &a) override { - wref() = util::any_cast(a); - } - }; - - // This class strips type information from OpaqueRefT<> and makes it usable - // in the G-API executables (carrying run-time data/information to kernels). - // Part of GRunArg. - // Its methods are typed proxies to OpaqueRefT. - // OpaqueRef maintains "reference" semantics so two copies of OpaqueRef refer - // to the same underlying object. - class OpaqueRef - { - std::shared_ptr m_ref; - cv::detail::OpaqueKind m_kind = cv::detail::OpaqueKind::CV_UNKNOWN; - - template inline void check() const - { - GAPI_DbgAssert(dynamic_cast*>(m_ref.get()) != nullptr); - } - - public: - OpaqueRef() = default; - - template< - typename T, - typename = util::are_different_t - > - // FIXME: probably won't work with const object - explicit OpaqueRef(T&& obj) : - m_ref(new OpaqueRefT>(std::forward(obj))), - m_kind(GOpaqueTraits>::kind) {} - - cv::detail::OpaqueKind getKind() const - { - return m_kind; - } - - template void reset() - { - if (!m_ref) m_ref.reset(new OpaqueRefT()); - check(); - storeKind(); - static_cast&>(*m_ref).reset(); - } - - template - void storeKind() - { - m_kind = cv::detail::GOpaqueTraits::kind; - } - - template T& wref() - { - check(); - return static_cast&>(*m_ref).wref(); - } - - template const T& rref() const - { - check(); - return static_cast&>(*m_ref).rref(); - } - - void mov(OpaqueRef &v) - { - m_ref->mov(*v.m_ref); - } - - cv::GOpaqueDesc descr_of() const - { - return m_ref->m_desc; - } - - // May be used to uniquely identify this object internally - const void *ptr() const { return m_ref->ptr(); } - - // Introduced for in-graph meta handling - OpaqueRef& operator= (const cv::util::any &a) - { - m_ref->set(a); - return *this; - } - }; -} // namespace detail - -/** \addtogroup gapi_data_objects - * @{ - */ -/** - * @brief `cv::GOpaque` template class represents an object of - * class `T` in the graph. - * - * `cv::GOpaque` describes a functional relationship between operations - * consuming and producing object of class `T`. `cv::GOpaque` is - * designed to extend G-API with user-defined data types, which are - * often required with user-defined operations. G-API can't apply any - * optimizations to user-defined types since these types are opaque to - * the framework. However, there is a number of G-API operations - * declared with `cv::GOpaque` as a return type, - * e.g. cv::gapi::streaming::timestamp() or cv::gapi::streaming::size(). - * - * @sa `cv::GArray` - */ -template class GOpaque -{ -public: - // Host type (or Flat type) - the type this GOpaque is actually - // specified to. - /// @private - using HT = typename detail::flatten_g>::type; - - /** - * @brief Constructs an empty `cv::GOpaque` - * - * Normally, empty G-API data objects denote a starting point of - * the graph. When an empty `cv::GOpaque` is assigned to a result - * of some operation, it obtains a functional link to this - * operation (and is not empty anymore). - */ - GOpaque() { putDetails(); } // Empty constructor - - /// @private - explicit GOpaque(detail::GOpaqueU &&ref) // GOpaqueU-based constructor - : m_ref(ref) { putDetails(); } // (used by GCall, not for users) - - /// @private - detail::GOpaqueU strip() const { - return m_ref; - } - /// @private - static void Ctor(detail::OpaqueRef& ref) { - ref.reset(); - } -private: - void putDetails() { - m_ref.setConstructFcn(&Ctor); - m_ref.specifyType(); - m_ref.storeKind(); - } - - detail::GOpaqueU m_ref; -}; - -/** @} */ - -} // namespace cv - -#endif // OPENCV_GAPI_GOPAQUE_HPP diff --git a/modules/gapi/include/opencv2/gapi/gproto.hpp b/modules/gapi/include/opencv2/gapi/gproto.hpp deleted file mode 100644 index a2b5d83bc1..0000000000 --- a/modules/gapi/include/opencv2/gapi/gproto.hpp +++ /dev/null @@ -1,159 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GPROTO_HPP -#define OPENCV_GAPI_GPROTO_HPP - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include - -namespace cv { - -// FIXME: user shouldn't deal with it - put to detail? -// GProtoArg is an union type over G-types which can serve as -// GComputation's in/output slots. In other words, GProtoArg -// wraps any type which can serve as G-API exchange type. -// -// In Runtime, GProtoArgs are substituted with appropriate GRunArgs. -// -// GProtoArg objects are constructed in-place when user describes -// (captures) computations, user doesn't interact with these types -// directly. -using GProtoArg = util::variant - < GMat - , GMatP - , GFrame - , GScalar - , detail::GArrayU // instead of GArray - , detail::GOpaqueU // instead of GOpaque - >; - -using GProtoArgs = std::vector; - -namespace detail -{ -template inline GProtoArgs packArgs(Ts... args) -{ - return GProtoArgs{ GProtoArg(wrap_gapi_helper::wrap(args))... }; -} - -} - -template -struct GIOProtoArgs -{ -public: - // NB: Used by python wrapper - GIOProtoArgs() = default; - explicit GIOProtoArgs(const GProtoArgs& args) : m_args(args) {} - explicit GIOProtoArgs(GProtoArgs &&args) : m_args(std::move(args)) {} - - GProtoArgs m_args; - - // TODO: Think about the addition operator - /** - * @brief This operator allows to complement the proto vectors at runtime. - * - * It's an ordinary overload of addition assignment operator. - * - * Example of usage: - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/dynamic_graph_snippets.cpp GIOProtoArgs usage - * - */ - template - friend GIOProtoArgs& operator += (GIOProtoArgs &lhs, const GIOProtoArgs &rhs); -}; - -template -cv::GIOProtoArgs& operator += (cv::GIOProtoArgs &lhs, const cv::GIOProtoArgs &rhs) -{ - lhs.m_args.reserve(lhs.m_args.size() + rhs.m_args.size()); - lhs.m_args.insert(lhs.m_args.end(), rhs.m_args.begin(), rhs.m_args.end()); - return lhs; -} - -struct In_Tag{}; -struct Out_Tag{}; - -using GProtoInputArgs = GIOProtoArgs; -using GProtoOutputArgs = GIOProtoArgs; - -// Perfect forwarding -template inline GProtoInputArgs GIn(Ts&&... ts) -{ - return GProtoInputArgs(detail::packArgs(std::forward(ts)...)); -} - -template inline GProtoOutputArgs GOut(Ts&&... ts) -{ - return GProtoOutputArgs(detail::packArgs(std::forward(ts)...)); -} - -namespace detail -{ - // Extract elements form tuple - // FIXME: Someday utilize a generic tuple_to_vec<> routine - template - static GProtoOutputArgs getGOut_impl(const std::tuple& ts, detail::Seq) - { - return GProtoOutputArgs{ detail::packArgs(std::get(ts)...)}; - } -} - -template inline GProtoOutputArgs GOut(const std::tuple& ts) -{ - // TODO: think of std::forward(ts) - return detail::getGOut_impl(ts, typename detail::MkSeq::type()); -} - -// Takes rvalue as input arg -template inline GProtoOutputArgs GOut(std::tuple&& ts) -{ - // TODO: think of std::forward(ts) - return detail::getGOut_impl(ts, typename detail::MkSeq::type()); -} - -// Extract run-time arguments from node origin -// Can be used to extract constant values associated with G-objects -// (like GScalar) at graph construction time -GRunArg value_of(const GOrigin &origin); - -// Transform run-time computation arguments into a collection of metadata -// extracted from that arguments -GMetaArg GAPI_EXPORTS descr_of(const GRunArg &arg ); -GMetaArgs GAPI_EXPORTS descr_of(const GRunArgs &args); - -// Transform run-time operation result argument into metadata extracted from that argument -// Used to compare the metadata, which generated at compile time with the metadata result operation in run time -GMetaArg GAPI_EXPORTS descr_of(const GRunArgP& argp); - -// Checks if run-time computation argument can be described by metadata -bool GAPI_EXPORTS can_describe(const GMetaArg& meta, const GRunArg& arg); -bool GAPI_EXPORTS can_describe(const GMetaArgs& metas, const GRunArgs& args); - -// Checks if run-time computation result argument can be described by metadata. -// Used to check if the metadata generated at compile time -// coincides with output arguments passed to computation in cpu and ocl backends -bool GAPI_EXPORTS can_describe(const GMetaArg& meta, const GRunArgP& argp); - -// Validates input arguments -void GAPI_EXPORTS validate_input_arg(const GRunArg& arg); -void GAPI_EXPORTS validate_input_args(const GRunArgs& args); - -} // namespace cv - -#endif // OPENCV_GAPI_GPROTO_HPP diff --git a/modules/gapi/include/opencv2/gapi/gpu/core.hpp b/modules/gapi/include/opencv2/gapi/gpu/core.hpp deleted file mode 100644 index a7ee59577c..0000000000 --- a/modules/gapi/include/opencv2/gapi/gpu/core.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GPU_CORE_API_HPP -#define OPENCV_GAPI_GPU_CORE_API_HPP -/** @file -* @deprecated Use instead. -*/ - -#include - -namespace cv { -namespace gapi { -namespace core { -namespace gpu { - using namespace ocl; -} // namespace gpu -} // namespace core -} // namespace gapi -} // namespace cv - - -#endif // OPENCV_GAPI_GPU_CORE_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/gpu/ggpukernel.hpp b/modules/gapi/include/opencv2/gapi/gpu/ggpukernel.hpp deleted file mode 100644 index b52c21de6b..0000000000 --- a/modules/gapi/include/opencv2/gapi/gpu/ggpukernel.hpp +++ /dev/null @@ -1,18 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GGPUKERNEL_HPP -#define OPENCV_GAPI_GGPUKERNEL_HPP -/** @file -* @deprecated Use instead. -*/ - -#include -#define GAPI_GPU_KERNEL GAPI_OCL_KERNEL - - -#endif // OPENCV_GAPI_GGPUKERNEL_HPP diff --git a/modules/gapi/include/opencv2/gapi/gpu/imgproc.hpp b/modules/gapi/include/opencv2/gapi/gpu/imgproc.hpp deleted file mode 100644 index b0df7ae331..0000000000 --- a/modules/gapi/include/opencv2/gapi/gpu/imgproc.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GPU_IMGPROC_API_HPP -#define OPENCV_GAPI_GPU_IMGPROC_API_HPP -/** @file -* @deprecated Use instead. -*/ - -#include - - -namespace cv { -namespace gapi { -namespace imgproc { -namespace gpu { - using namespace ocl; -} // namespace gpu -} // namespace imgproc -} // namespace gapi -} // namespace cv - - -#endif // OPENCV_GAPI_GPU_IMGPROC_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/gscalar.hpp b/modules/gapi/include/opencv2/gapi/gscalar.hpp deleted file mode 100644 index de0dfe1383..0000000000 --- a/modules/gapi/include/opencv2/gapi/gscalar.hpp +++ /dev/null @@ -1,140 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GSCALAR_HPP -#define OPENCV_GAPI_GSCALAR_HPP - -#include - -#include -#include // GShape -#include - -namespace cv -{ -// Forward declaration; GNode and GOrigin are an internal -// (user-inaccessible) classes. -class GNode; -struct GOrigin; - -/** \addtogroup gapi_data_objects - * @{ - */ -/** - * @brief GScalar class represents cv::Scalar data in the graph. - * - * GScalar may be associated with a cv::Scalar value, which becomes - * its constant value bound in graph compile time. cv::GScalar describes a - * functional relationship between operations consuming and producing - * GScalar objects. - * - * GScalar is a virtual counterpart of cv::Scalar, which is usually used - * to represent the GScalar data in G-API during the execution. - * - * @sa Scalar - */ -class GAPI_EXPORTS_W_SIMPLE GScalar -{ -public: - /** - * @brief Constructs an empty GScalar - * - * Normally, empty G-API data objects denote a starting point of - * the graph. When an empty GScalar is assigned to a result of some - * operation, it obtains a functional link to this operation (and - * is not empty anymore). - */ - GAPI_WRAP GScalar(); - - /** - * @brief Constructs a value-initialized GScalar - * - * GScalars may have their values be associated at graph - * construction time. It is useful when some operation has a - * GScalar input which doesn't change during the program - * execution, and is set only once. In this case, there is no need - * to declare such GScalar as a graph input. - * - * @note The value of GScalar may be overwritten by assigning some - * other GScalar to the object using `operator=` -- on the - * assignment, the old GScalar value is discarded. - * - * @param s a cv::Scalar value to associate with this GScalar object. - */ - GAPI_WRAP - explicit GScalar(const cv::Scalar& s); - - /** - * @overload - * @brief Constructs a value-initialized GScalar - * - * @param s a cv::Scalar value to associate with this GScalar object. - */ - explicit GScalar(cv::Scalar&& s); // Constant value move-constructor from cv::Scalar - - /** - * @overload - * @brief Constructs a value-initialized GScalar - * - * @param v0 A `double` value to associate with this GScalar. Note - * that only the first component of a four-component cv::Scalar is - * set to this value, with others remain zeros. - * - * This constructor overload is not marked `explicit` and can be - * used in G-API expression code like this: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp gscalar_implicit - * - * Here operator+(GMat,GScalar) is used to wrap cv::gapi::addC() - * and a value-initialized GScalar is created on the fly. - * - * @overload - */ - GScalar(double v0); // Constant value constructor from double - - /// @private - GScalar(const GNode &n, std::size_t out); // Operation result constructor - /// @private - GOrigin& priv(); // Internal use only - /// @private - const GOrigin& priv() const; // Internal use only - -private: - std::shared_ptr m_priv; -}; - -/** @} */ - -/** - * \addtogroup gapi_meta_args - * @{ - */ -struct GAPI_EXPORTS_W_SIMPLE GScalarDesc -{ - // NB.: right now it is empty - - inline bool operator== (const GScalarDesc &) const - { - return true; // NB: implement this method if GScalar meta appears - } - - inline bool operator!= (const GScalarDesc &rhs) const - { - return !(*this == rhs); - } -}; - -GAPI_EXPORTS_W inline GScalarDesc empty_scalar_desc() { return GScalarDesc(); } - -GAPI_EXPORTS GScalarDesc descr_of(const cv::Scalar &scalar); - -std::ostream& operator<<(std::ostream& os, const cv::GScalarDesc &desc); - -} // namespace cv - -#endif // OPENCV_GAPI_GSCALAR_HPP diff --git a/modules/gapi/include/opencv2/gapi/gstreaming.hpp b/modules/gapi/include/opencv2/gapi/gstreaming.hpp deleted file mode 100644 index d413195b81..0000000000 --- a/modules/gapi/include/opencv2/gapi/gstreaming.hpp +++ /dev/null @@ -1,430 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2021 Intel Corporation - - -#ifndef OPENCV_GAPI_GSTREAMING_COMPILED_HPP -#define OPENCV_GAPI_GSTREAMING_COMPILED_HPP - -#include -#include - -#include -#include -#include -#include -#include - -namespace cv { - -template using optional = cv::util::optional; - -namespace detail { -template struct wref_spec { - using type = T; -}; -template struct wref_spec > { - using type = T; -}; - -template -struct OptRef { - struct OptHolder { - virtual void mov(RefHolder &h) = 0; - virtual void reset() = 0; - virtual ~OptHolder() = default; - using Ptr = std::shared_ptr; - }; - template struct Holder final: OptHolder { - std::reference_wrapper > m_opt_ref; - - explicit Holder(cv::optional& opt) : m_opt_ref(std::ref(opt)) { - } - virtual void mov(RefHolder &h) override { - using U = typename wref_spec::type; - m_opt_ref.get() = cv::util::make_optional(std::move(h.template wref())); - } - virtual void reset() override { - m_opt_ref.get().reset(); - } - }; - template - explicit OptRef(cv::optional& t) : m_opt{new Holder(t)} {} - void mov(RefHolder &h) { m_opt->mov(h); } - void reset() { m_opt->reset();} -private: - typename OptHolder::Ptr m_opt; -}; -using OptionalVectorRef = OptRef; -using OptionalOpaqueRef = OptRef; -} // namespace detail - -// TODO: Keep it in sync with GRunArgP (derive the type automatically?) -using GOptRunArgP = util::variant< - optional*, - optional*, - optional*, - optional*, - cv::detail::OptionalVectorRef, - cv::detail::OptionalOpaqueRef ->; -using GOptRunArgsP = std::vector; - -using GOptRunArg = util::variant< - optional, - optional, - optional, - optional, - optional, - optional ->; -using GOptRunArgs = std::vector; - -namespace detail { - -template inline GOptRunArgP wrap_opt_arg(optional& arg) { - // By default, T goes to an OpaqueRef. All other types are specialized - return GOptRunArgP{OptionalOpaqueRef(arg)}; -} - -template inline GOptRunArgP wrap_opt_arg(optional >& arg) { - return GOptRunArgP{OptionalVectorRef(arg)}; -} - -template<> inline GOptRunArgP wrap_opt_arg(optional &m) { - return GOptRunArgP{&m}; -} - -template<> inline GOptRunArgP wrap_opt_arg(optional &m) { - return GOptRunArgP{&m}; -} - -template<> inline GOptRunArgP wrap_opt_arg(optional &f) { - return GOptRunArgP{&f}; -} - -template<> inline GOptRunArgP wrap_opt_arg(optional &s) { - return GOptRunArgP{&s}; -} - -} // namespace detail - -// Now cv::gout() may produce an empty vector (see "dynamic graphs"), so -// there may be a conflict between these two. State here that Opt version -// _must_ have at least one input for this overload -template -inline GOptRunArgsP gout(optional&arg, optional&... args) -{ - return GOptRunArgsP{ detail::wrap_opt_arg(arg), detail::wrap_opt_arg(args)... }; -} - -/** - * \addtogroup gapi_main_classes - * @{ - */ -/** - * @brief Represents a computation (graph) compiled for streaming. - * - * This class represents a product of graph compilation (calling - * cv::GComputation::compileStreaming()). Objects of this class - * actually do stream processing, and the whole pipeline execution - * complexity is incapsulated into objects of this class. Execution - * model has two levels: at the very top, the execution of a - * heterogeneous graph is aggressively pipelined; at the very bottom - * the execution of every internal block is determined by its - * associated backend. Backends are selected based on kernel packages - * passed via compilation arguments ( see @ref gapi_compile_args, - * GNetworkPackage, GKernelPackage for details). - * - * GStreamingCompiled objects have a "player" semantics -- there are - * methods like start() and stop(). GStreamingCompiled has a full - * control over a videostream and so is stateful. You need to specify the - * input stream data using setSource() and then call start() to - * actually start processing. After that, use pull() or try_pull() to - * obtain next processed data frame from the graph in a blocking or - * non-blocking way, respectively. - * - * Currently a single GStreamingCompiled can process only one video - * streat at time. Produce multiple GStreamingCompiled objects to run the - * same graph on multiple video streams. - * - * @sa GCompiled - */ -class GAPI_EXPORTS_W_SIMPLE GStreamingCompiled -{ -public: - class GAPI_EXPORTS Priv; - GAPI_WRAP GStreamingCompiled(); - - // FIXME: More overloads? - /** - * @brief Specify the input data to GStreamingCompiled for - * processing, a generic version. - * - * Use gin() to create an input parameter vector. - * - * Input vectors must have the same number of elements as defined - * in the cv::GComputation protocol (at the moment of its - * construction). Shapes of elements also must conform to protocol - * (e.g. cv::Mat needs to be passed where cv::GMat has been - * declared as input, and so on). Run-time exception is generated - * on type mismatch. - * - * In contrast with regular GCompiled, user can also pass an - * object of type GVideoCapture for a GMat parameter of the parent - * GComputation. The compiled pipeline will start fetching data - * from that GVideoCapture and feeding it into the - * pipeline. Pipeline stops when a GVideoCapture marks end of the - * stream (or when stop() is called). - * - * Passing a regular Mat for a GMat parameter makes it "infinite" - * source -- pipeline may run forever feeding with this Mat until - * stopped explicitly. - * - * Currently only a single GVideoCapture is supported as input. If - * the parent GComputation is declared with multiple input GMat's, - * one of those can be specified as GVideoCapture but all others - * must be regular Mat objects. - * - * Throws if pipeline is already running. Use stop() and then - * setSource() to run the graph on a new video stream. - * - * @note This method is not thread-safe (with respect to the user - * side) at the moment. Protect the access if - * start()/stop()/setSource() may be called on the same object in - * multiple threads in your application. - * - * @param ins vector of inputs to process. - * @sa gin - */ - void setSource(GRunArgs &&ins); - - /// @private -- Exclude this function from OpenCV documentation - GAPI_WRAP void setSource(const cv::detail::ExtractArgsCallback& callback); - - /** - * @brief Specify an input video stream for a single-input - * computation pipeline. - * - * Throws if pipeline is already running. Use stop() and then - * setSource() to run the graph on a new video stream. - * - * @overload - * @param s a shared pointer to IStreamSource representing the - * input video stream. - */ - void setSource(const gapi::wip::IStreamSource::Ptr& s); - - /** - * @brief Constructs and specifies an input video stream for a - * single-input computation pipeline with the given parameters. - * - * Throws if pipeline is already running. Use stop() and then - * setSource() to run the graph on a new video stream. - * - * @overload - * @param args arguments used to construct and initialize a stream - * source. - */ - template - void setSource(Args&&... args) { - setSource(cv::gapi::wip::make_src(std::forward(args)...)); - } - - /** - * @brief Start the pipeline execution. - * - * Use pull()/try_pull() to obtain data. Throws an exception if - * a video source was not specified. - * - * setSource() must be called first, even if the pipeline has been - * working already and then stopped (explicitly via stop() or due - * stream completion) - * - * @note This method is not thread-safe (with respect to the user - * side) at the moment. Protect the access if - * start()/stop()/setSource() may be called on the same object in - * multiple threads in your application. - */ - GAPI_WRAP void start(); - - /** - * @brief Get the next processed frame from the pipeline. - * - * Use gout() to create an output parameter vector. - * - * Output vectors must have the same number of elements as defined - * in the cv::GComputation protocol (at the moment of its - * construction). Shapes of elements also must conform to protocol - * (e.g. cv::Mat needs to be passed where cv::GMat has been - * declared as output, and so on). Run-time exception is generated - * on type mismatch. - * - * This method writes new data into objects passed via output - * vector. If there is no data ready yet, this method blocks. Use - * try_pull() if you need a non-blocking version. - * - * @param outs vector of output parameters to obtain. - * @return true if next result has been obtained, - * false marks end of the stream. - */ - bool pull(cv::GRunArgsP &&outs); - - // NB: Used from python - /// @private -- Exclude this function from OpenCV documentation - GAPI_WRAP std::tuple> pull(); - - /** - * @brief Get some next available data from the pipeline. - * - * This method takes a vector of cv::optional object. An object is - * assigned to some value if this value is available (ready) at - * the time of the call, and resets the object to empty() if it is - * not. - * - * This is a blocking method which guarantees that some data has - * been written to the output vector on return. - * - * Using this method only makes sense if the graph has - * desynchronized parts (see cv::gapi::desync). If there is no - * desynchronized parts in the graph, the behavior of this - * method is identical to the regular pull() (all data objects are - * produced synchronously in the output vector). - * - * Use gout() to create an output parameter vector. - * - * Output vectors must have the same number of elements as defined - * in the cv::GComputation protocol (at the moment of its - * construction). Shapes of elements also must conform to protocol - * (e.g. cv::optional needs to be passed where cv::GMat - * has been declared as output, and so on). Run-time exception is - * generated on type mismatch. - * - * This method writes new data into objects passed via output - * vector. If there is no data ready yet, this method blocks. Use - * try_pull() if you need a non-blocking version. - * - * @param outs vector of output parameters to obtain. - * @return true if next result has been obtained, - * false marks end of the stream. - * - * @sa cv::gapi::desync - */ - bool pull(cv::GOptRunArgsP &&outs); - - /** - * @brief Try to get the next processed frame from the pipeline. - * - * Use gout() to create an output parameter vector. - * - * This method writes new data into objects passed via output - * vector. If there is no data ready yet, the output vector - * remains unchanged and false is returned. - * - * @return true if data has been obtained, and false if it was - * not. Note: false here doesn't mark the end of the stream. - */ - bool try_pull(cv::GRunArgsP &&outs); - - /** - * @brief Stop (abort) processing the pipeline. - * - * Note - it is not pause but a complete stop. Calling start() - * will cause G-API to start processing the stream from the early beginning. - * - * Throws if the pipeline is not running. - */ - GAPI_WRAP void stop(); - - /** - * @brief Test if the pipeline is running. - * - * @note This method is not thread-safe (with respect to the user - * side) at the moment. Protect the access if - * start()/stop()/setSource() may be called on the same object in - * multiple threads in your application. - * - * @return true if the current stream is not over yet. - */ - GAPI_WRAP bool running() const; - - /// @private - Priv& priv(); - - /** - * @brief Check if compiled object is valid (non-empty) - * - * @return true if the object is runnable (valid), false otherwise - */ - explicit operator bool () const; - - /** - * @brief Vector of metadata this graph was compiled for. - * - * @return Unless _reshape_ is not supported, return value is the - * same vector which was passed to cv::GComputation::compile() to - * produce this compiled object. Otherwise, it is the latest - * metadata vector passed to reshape() (if that call was - * successful). - */ - const GMetaArgs& metas() const; // Meta passed to compile() - - /** - * @brief Vector of metadata descriptions of graph outputs - * - * @return vector with formats/resolutions of graph's output - * objects, auto-inferred from input metadata vector by - * operations which form this computation. - * - * @note GCompiled objects produced from the same - * cv::GComputiation graph with different input metas may return - * different values in this vector. - */ - const GMetaArgs& outMetas() const; - -protected: - /// @private - std::shared_ptr m_priv; -}; - -namespace gapi { - -/** - * @brief This namespace contains G-API functions, structures, and - * symbols related to the Streaming execution mode. - * - * Some of the operations defined in this namespace (e.g. size(), - * BGR(), etc.) can be used in the traditional execution mode too. - */ -namespace streaming { -/** - * @brief Specify queue capacity for streaming execution. - * - * In the streaming mode the pipeline steps are connected with queues - * and this compile argument controls every queue's size. - */ -struct GAPI_EXPORTS_W_SIMPLE queue_capacity -{ - GAPI_WRAP - explicit queue_capacity(size_t cap = 1) : capacity(cap) { } - GAPI_PROP_RW - size_t capacity; -}; -} // namespace streaming -} // namespace gapi - -namespace detail -{ -template<> struct CompileArgTag -{ - static const char* tag() { return "gapi.queue_capacity"; } -}; -} - -/** @} gapi_main_classes */ - -} - -#endif // OPENCV_GAPI_GSTREAMING_COMPILED_HPP diff --git a/modules/gapi/include/opencv2/gapi/gtransform.hpp b/modules/gapi/include/opencv2/gapi/gtransform.hpp deleted file mode 100644 index ce88c894d7..0000000000 --- a/modules/gapi/include/opencv2/gapi/gtransform.hpp +++ /dev/null @@ -1,103 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - -#ifndef OPENCV_GAPI_GTRANSFORM_HPP -#define OPENCV_GAPI_GTRANSFORM_HPP - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace cv -{ - -struct GAPI_EXPORTS GTransform -{ - // FIXME: consider another simplified - // class instead of GComputation - using F = std::function; - - std::string description; - F pattern; - F substitute; - - GTransform(const std::string& d, const F &p, const F &s) : description(d), pattern(p), substitute(s) {} -}; - -namespace detail -{ - -template -struct TransHelper; - -template -struct TransHelper, Out> -{ - template - static GComputation invoke(Callable f, Seq, Seq) - { - const std::tuple ins; - const auto r = tuple_wrap_helper::get(f(std::get(ins)...)); - return GComputation(cv::GIn(std::get(ins)...), - cv::GOut(std::get(r)...)); - } - - static GComputation get_pattern() - { - return invoke(K::pattern, typename MkSeq::type(), - typename MkSeq::type>::value>::type()); - } - static GComputation get_substitute() - { - return invoke(K::substitute, typename MkSeq::type(), - typename MkSeq::type>::value>::type()); - } -}; -} // namespace detail - -template -class GTransformImpl; - -template -class GTransformImpl> : public cv::detail::TransHelper, R>, - public cv::detail::TransformTag -{ -public: - // FIXME: currently there is no check that transformations' signatures are unique - // and won't be any intersection in graph compilation stage - using API = K; - - static GTransform transformation() - { - return GTransform(K::descr(), &K::get_pattern, &K::get_substitute); - } -}; -} // namespace cv - -#define G_DESCR_HELPER_CLASS(Class) Class##DescrHelper - -#define G_DESCR_HELPER_BODY(Class, Descr) \ - namespace detail \ - { \ - struct G_DESCR_HELPER_CLASS(Class) \ - { \ - static constexpr const char *descr() { return Descr; } \ - }; \ - } - -#define GAPI_TRANSFORM(Class, API, Descr) \ - G_DESCR_HELPER_BODY(Class, Descr) \ - struct Class final : public cv::GTransformImpl, \ - public detail::G_DESCR_HELPER_CLASS(Class) - -#endif // OPENCV_GAPI_GTRANSFORM_HPP diff --git a/modules/gapi/include/opencv2/gapi/gtype_traits.hpp b/modules/gapi/include/opencv2/gapi/gtype_traits.hpp deleted file mode 100644 index c42d64a761..0000000000 --- a/modules/gapi/include/opencv2/gapi/gtype_traits.hpp +++ /dev/null @@ -1,242 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GTYPE_TRAITS_HPP -#define OPENCV_GAPI_GTYPE_TRAITS_HPP - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace cv -{ -namespace detail -{ - template - struct contains_shape_field : std::false_type {}; - - template - struct contains_shape_field> : - std::is_same::type, GShape> - {}; - - template - struct has_gshape : contains_shape_field {}; - - // FIXME: These traits and enum and possible numerous switch(kind) - // block may be replaced with a special Handler object or with - // a double dispatch - enum class ArgKind: int - { - OPAQUE_VAL, // Unknown, generic, opaque-to-GAPI data type - STATIC - // Note: OPAQUE is sometimes defined in Win sys headers -#if !defined(OPAQUE) && !defined(CV_DOXYGEN) - OPAQUE = OPAQUE_VAL, // deprecated value used for compatibility, use OPAQUE_VAL instead -#endif - GOBJREF, // reference to object - GMAT, // a cv::GMat - GMATP, // a cv::GMatP - GFRAME, // a cv::GFrame - GSCALAR, // a cv::GScalar - GARRAY, // a cv::GArrayU (note - exactly GArrayU, not GArray!) - GOPAQUE, // a cv::GOpaqueU (note - exactly GOpaqueU, not GOpaque!) - }; - - // Describe G-API types (G-types) with traits. Mostly used by - // cv::GArg to store meta information about types passed into - // operation arguments. Please note that cv::GComputation is - // defined on GProtoArgs, not GArgs! - template struct GTypeTraits; - template struct GTypeTraits - { - static constexpr const ArgKind kind = ArgKind::OPAQUE_VAL; - static constexpr const OpaqueKind op_kind = OpaqueKind::CV_UNKNOWN; - }; - template<> struct GTypeTraits - { - static constexpr const ArgKind kind = ArgKind::GMAT; - static constexpr const GShape shape = GShape::GMAT; - static constexpr const OpaqueKind op_kind = OpaqueKind::CV_UNKNOWN; - }; - template<> struct GTypeTraits - { - static constexpr const ArgKind kind = ArgKind::GMATP; - static constexpr const GShape shape = GShape::GMAT; - static constexpr const OpaqueKind op_kind = OpaqueKind::CV_UNKNOWN; - }; - template<> struct GTypeTraits - { - static constexpr const ArgKind kind = ArgKind::GFRAME; - static constexpr const GShape shape = GShape::GFRAME; - static constexpr const OpaqueKind op_kind = OpaqueKind::CV_UNKNOWN; - }; - template<> struct GTypeTraits - { - static constexpr const ArgKind kind = ArgKind::GSCALAR; - static constexpr const GShape shape = GShape::GSCALAR; - static constexpr const OpaqueKind op_kind = OpaqueKind::CV_UNKNOWN; - }; - template struct GTypeTraits > - { - static constexpr const ArgKind kind = ArgKind::GARRAY; - static constexpr const GShape shape = GShape::GARRAY; - static constexpr const OpaqueKind op_kind = GOpaqueTraits::kind; - using host_type = std::vector; - using strip_type = cv::detail::VectorRef; - static cv::detail::GArrayU wrap_value(const cv::GArray &t) { return t.strip();} - static cv::detail::VectorRef wrap_in (const std::vector &t) { return detail::VectorRef(t); } - static cv::detail::VectorRef wrap_out ( std::vector &t) { return detail::VectorRef(t); } - }; - template struct GTypeTraits > - { - static constexpr const ArgKind kind = ArgKind::GOPAQUE; - static constexpr const GShape shape = GShape::GOPAQUE; - static constexpr const OpaqueKind op_kind = GOpaqueTraits::kind; - using host_type = T; - using strip_type = cv::detail::OpaqueRef; - static cv::detail::GOpaqueU wrap_value(const cv::GOpaque &t) { return t.strip();} - static cv::detail::OpaqueRef wrap_in (const T &t) { return detail::OpaqueRef(t); } - static cv::detail::OpaqueRef wrap_out ( T &t) { return detail::OpaqueRef(t); } - }; - - // Tests if Trait for type T requires extra marshalling ("custom wrap") or not. - // If Traits has wrap_value() defined, it does. - template struct has_custom_wrap - { - template class check; - template static std::true_type test(check::wrap_value)> *); - template static std::false_type test(...); - using type = decltype(test(nullptr)); - static const constexpr bool value = std::is_same(nullptr))>::value; - }; - - // Resolve a Host type back to its associated G-Type. - // FIXME: Probably it can be avoided - // FIXME: GMatP is not present here. - // (Actually these traits is used only to check - // if associated G-type has custom wrap functions - // and GMat behavior is correct for GMatP) - template struct GTypeOf; -#if !defined(GAPI_STANDALONE) - template<> struct GTypeOf { using type = cv::GMat; }; -#endif // !defined(GAPI_STANDALONE) - template<> struct GTypeOf { using type = cv::GMat; }; - template<> struct GTypeOf { using type = cv::GMat; }; - template<> struct GTypeOf { using type = cv::GScalar; }; - template struct GTypeOf > { using type = cv::GArray; }; - template struct GTypeOf { using type = cv::GOpaque;}; - template<> struct GTypeOf { using type = cv::GFrame; }; - - // FIXME: This is not quite correct since IStreamSource may - // produce not only Mat but also MediaFrame, Scalar and vector - // data. TODO: Extend the type dispatching on these types too. - template<> struct GTypeOf { using type = cv::GMat;}; - template using g_type_of_t = typename GTypeOf::type; - - // Marshalling helper for G-types and its Host types. Helps G-API - // to store G types in internal generic containers for further - // processing. Implements the following callbacks: - // - // * wrap() - converts user-facing G-type into an internal one - // for internal storage. - // Used when G-API operation is instantiated (G::on(), - // etc) during expressing a pipeline. Mostly returns input - // value "as is" except the case when G-type is a template. For - // template G-classes, calls custom wrap() from Traits. - // The value returned by wrap() is then wrapped into GArg() and - // stored in G-API metadata. - // - // Example: - // - cv::GMat arguments are passed as-is. - // - integers, pointers, STL containers, user types are passed as-is. - // - cv::GArray is converted to cv::GArrayU. - // - // * wrap_in() / wrap_out() - convert Host type associated with - // G-type to internal representation type. - // - // - For "simple" (non-template) G-types, returns value as-is. - // Example: cv::GMat has host type cv::Mat, when user passes a - // cv::Mat, system stores it internally as cv::Mat. - // - // - For "complex" (template) G-types, utilizes custom - // wrap_in()/wrap_out() as described in Traits. - // Example: cv::GArray has host type std::vector, when - // user passes a std::vector, system stores it - // internally as VectorRef (with stripped away). - template struct WrapValue - { - static auto wrap(const T& t) -> - typename std::remove_reference::type - { - return static_cast::type>(t); - } - - template static U wrap_in (const U &u) { return u; } - template static U* wrap_out(U &u) { return &u; } - }; - template struct WrapValue::value>::type> - { - static auto wrap(const T& t) -> decltype(GTypeTraits::wrap_value(t)) - { - return GTypeTraits::wrap_value(t); - } - template static auto wrap_in (const U &u) -> typename GTypeTraits::strip_type - { - static_assert(!(cv::detail::has_gshape>::value - || cv::detail::contains::type, GAPI_OWN_TYPES_LIST>::value), - "gin/gout must not be used with G* classes or cv::gapi::own::*"); - return GTypeTraits::wrap_in(u); - } - template static auto wrap_out(U &u) -> typename GTypeTraits::strip_type - { - static_assert(!(cv::detail::has_gshape>::value - || cv::detail::contains::type, GAPI_OWN_TYPES_LIST>::value), - "gin/gout must not be used with G* classes or cv::gapi::own::*"); - return GTypeTraits::wrap_out(u); - } - }; - - template using wrap_gapi_helper = WrapValue::type>; - template using wrap_host_helper = WrapValue >::type>; - -// Union type for various user-defined type constructors (GArray, -// GOpaque, etc) -// -// TODO: Replace construct-only API with a more generic one (probably -// with bits of introspection) -// -// Not required for non-user-defined types (GMat, GScalar, etc) -using HostCtor = util::variant - < util::monostate - , detail::ConstructVec - , detail::ConstructOpaque - >; - -template struct GObtainCtor { - static HostCtor get() { return HostCtor{}; } -}; -template struct GObtainCtor > { - static HostCtor get() { return HostCtor{ConstructVec{&GArray::VCtor}}; } -}; -template struct GObtainCtor > { - static HostCtor get() { return HostCtor{ConstructOpaque{&GOpaque::Ctor}}; } -}; -} // namespace detail -} // namespace cv - -#endif // OPENCV_GAPI_GTYPE_TRAITS_HPP diff --git a/modules/gapi/include/opencv2/gapi/gtyped.hpp b/modules/gapi/include/opencv2/gapi/gtyped.hpp deleted file mode 100644 index 2acc2f7ffb..0000000000 --- a/modules/gapi/include/opencv2/gapi/gtyped.hpp +++ /dev/null @@ -1,246 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GTYPED_HPP -#define OPENCV_GAPI_GTYPED_HPP -#if !defined(GAPI_STANDALONE) - -#include - -#include -#include -#include -#include - -namespace cv { - -namespace detail -{ - // FIXME: How to prevent coolhackers from extending it by their own types? - // FIXME: ...Should we care? - template struct ProtoToParam; - template<> struct ProtoToParam { using type = cv::Mat; }; - template<> struct ProtoToParam { using type = cv::Scalar; }; - template struct ProtoToParam > { using type = std::vector; }; - template<> struct ProtoToParam> { using type = std::vector; }; - template struct ProtoToParam > { using type = U; }; - template using ProtoToParamT = typename ProtoToParam::type; - - template struct ProtoToMeta; - template<> struct ProtoToMeta { using type = cv::GMatDesc; }; - template<> struct ProtoToMeta { using type = cv::GScalarDesc; }; - template struct ProtoToMeta > { using type = cv::GArrayDesc; }; - template struct ProtoToMeta > { using type = cv::GOpaqueDesc; }; - template using ProtoToMetaT = typename ProtoToMeta::type; - - //workaround for MSVC 19.0 bug - template - auto make_default()->decltype(T{}) {return {};} -} // detail - -/** - * @brief This class is a typed wrapper over a regular GComputation. - * - * `std::function<>`-like template parameter specifies the graph - * signature so methods so the object's constructor, methods like - * `apply()` and the derived `GCompiledT::operator()` also become - * typed. - * - * There is no need to use cv::gin() or cv::gout() modifiers with - * objects of this class. Instead, all input arguments are followed - * by all output arguments in the order from the template argument - * signature. - * - * Refer to the following example. Regular (untyped) code is written this way: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp Untyped_Example - * - * Here: - * - * - cv::GComputation object is created with a lambda constructor - * where it is defined as a two-input, one-output graph. - * - * - Its method `apply()` in fact takes arbitrary number of arguments - * (as vectors) so user can pass wrong number of inputs/outputs - * here. C++ compiler wouldn't notice that since the cv::GComputation - * API is polymorphic, and only a run-time error will be generated. - * - * Now the same code written with typed API: - * - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp Typed_Example - * - * The key difference is: - * - * - Now the constructor lambda *must take* parameters and *must - * return* values as defined in the `GComputationT<>` signature. - * - Its method `apply()` does not require any extra specifiers to - * separate input arguments from the output ones - * - A `GCompiledT` (compilation product) takes input/output - * arguments with no extra specifiers as well. - */ -template class GComputationT; - -// Single return value implementation -template class GComputationT -{ -public: - typedef std::function Gen; - - class GCompiledT - { - private: - friend class GComputationT; - - cv::GCompiled m_comp; - - explicit GCompiledT(const cv::GCompiled &comp) : m_comp(comp) {} - - public: - GCompiledT() {} - - void operator()(detail::ProtoToParamT... inArgs, - detail::ProtoToParamT &outArg) - { - m_comp(cv::gin(inArgs...), cv::gout(outArg)); - } - - explicit operator bool() const - { - return static_cast(m_comp); - } - }; - -private: - typedef std::pair Captured; - - Captured capture(const Gen& g, Args... args) - { - return Captured(g(args...), cv::GIn(args...)); - } - - Captured m_capture; - cv::GComputation m_comp; - -public: - GComputationT(const Gen &generator) - : m_capture(capture(generator, detail::make_default()...)) - , m_comp(cv::GProtoInputArgs(std::move(m_capture.second)), - cv::GOut(m_capture.first)) - { - } - - void apply(detail::ProtoToParamT... inArgs, - detail::ProtoToParamT &outArg, - GCompileArgs &&args) - { - m_comp.apply(cv::gin(inArgs...), cv::gout(outArg), std::move(args)); - } - - void apply(detail::ProtoToParamT... inArgs, - detail::ProtoToParamT &outArg) - { - apply(inArgs..., outArg, GCompileArgs()); - } - - - GCompiledT compile(detail::ProtoToMetaT... inDescs) - { - GMetaArgs inMetas = { GMetaArg(inDescs)... }; - return GCompiledT(m_comp.compile(std::move(inMetas), GCompileArgs())); - } - - GCompiledT compile(detail::ProtoToMetaT... inDescs, GCompileArgs &&args) - { - GMetaArgs inMetas = { GMetaArg(inDescs)... }; - return GCompiledT(m_comp.compile(std::move(inMetas), std::move(args))); - } -}; - -// Multiple (fixed) return value implementation. FIXME: How to avoid copy-paste? -template class GComputationT(Args...)> -{ -public: - typedef std::function(Args...)> Gen; - - class GCompiledT - { - private: - friend class GComputationT(Args...)>; - - cv::GCompiled m_comp; - explicit GCompiledT(const cv::GCompiled &comp) : m_comp(comp) {} - - public: - GCompiledT() {} - - void operator()(detail::ProtoToParamT... inArgs, - detail::ProtoToParamT&... outArgs) - { - m_comp(cv::gin(inArgs...), cv::gout(outArgs...)); - } - - explicit operator bool() const - { - return static_cast(m_comp); - } - }; - -private: - typedef std::pair Captured; - - template - Captured capture(GProtoArgs &&args, const std::tuple &rr, detail::Seq) - { - return Captured(cv::GOut(std::get(rr)...).m_args, args); - } - - Captured capture(const Gen& g, Args... args) - { - return capture(cv::GIn(args...).m_args, g(args...), typename detail::MkSeq::type()); - } - - Captured m_capture; - cv::GComputation m_comp; - -public: - GComputationT(const Gen &generator) - : m_capture(capture(generator, detail::make_default()...)) - , m_comp(cv::GProtoInputArgs(std::move(m_capture.second)), - cv::GProtoOutputArgs(std::move(m_capture.first))) - { - } - - void apply(detail::ProtoToParamT... inArgs, - detail::ProtoToParamT&... outArgs, - GCompileArgs &&args) - { - m_comp.apply(cv::gin(inArgs...), cv::gout(outArgs...), std::move(args)); - } - - void apply(detail::ProtoToParamT... inArgs, - detail::ProtoToParamT&... outArgs) - { - apply(inArgs..., outArgs..., GCompileArgs()); - } - - - GCompiledT compile(detail::ProtoToMetaT... inDescs) - { - GMetaArgs inMetas = { GMetaArg(inDescs)... }; - return GCompiledT(m_comp.compile(std::move(inMetas), GCompileArgs())); - } - - GCompiledT compile(detail::ProtoToMetaT... inDescs, GCompileArgs &&args) - { - GMetaArgs inMetas = { GMetaArg(inDescs)... }; - return GCompiledT(m_comp.compile(std::move(inMetas), std::move(args))); - } -}; - -} // namespace cv -#endif // !defined(GAPI_STANDALONE) -#endif // OPENCV_GAPI_GTYPED_HPP diff --git a/modules/gapi/include/opencv2/gapi/imgproc.hpp b/modules/gapi/include/opencv2/gapi/imgproc.hpp deleted file mode 100644 index 96aaa5a447..0000000000 --- a/modules/gapi/include/opencv2/gapi/imgproc.hpp +++ /dev/null @@ -1,1769 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_IMGPROC_HPP -#define OPENCV_GAPI_IMGPROC_HPP - -#include - -#include // std::tuple - -#include -#include -#include - - -/** \defgroup gapi_imgproc G-API Image processing functionality -@{ - @defgroup gapi_filters Graph API: Image filters - @defgroup gapi_colorconvert Graph API: Converting image from one color space to another - @defgroup gapi_feature Graph API: Image Feature Detection - @defgroup gapi_shape Graph API: Image Structural Analysis and Shape Descriptors - @defgroup gapi_transform Graph API: Image and channel composition functions -@} - */ - -namespace { -void validateFindingContoursMeta(const int depth, const int chan, const int mode) -{ - GAPI_Assert(chan == 1); - switch (mode) - { - case cv::RETR_CCOMP: - GAPI_Assert(depth == CV_8U || depth == CV_32S); - break; - case cv::RETR_FLOODFILL: - GAPI_Assert(depth == CV_32S); - break; - default: - GAPI_Assert(depth == CV_8U); - break; - } -} -} // anonymous namespace - -namespace cv { namespace gapi { - -/** - * @brief This namespace contains G-API Operation Types for OpenCV - * ImgProc module functionality. - */ -namespace imgproc { - using GMat2 = std::tuple; - using GMat3 = std::tuple; // FIXME: how to avoid this? - using GFindContoursOutput = std::tuple>,GArray>; - - G_TYPED_KERNEL(GFilter2D, , "org.opencv.imgproc.filters.filter2D") { - static GMatDesc outMeta(GMatDesc in, int ddepth, Mat, Point, Scalar, int, Scalar) { - return in.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GSepFilter, , "org.opencv.imgproc.filters.sepfilter") { - static GMatDesc outMeta(GMatDesc in, int ddepth, Mat, Mat, Point, Scalar, int, Scalar) { - return in.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GBoxFilter, , "org.opencv.imgproc.filters.boxfilter") { - static GMatDesc outMeta(GMatDesc in, int ddepth, Size, Point, bool, int, Scalar) { - return in.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GBlur, , "org.opencv.imgproc.filters.blur") { - static GMatDesc outMeta(GMatDesc in, Size, Point, int, Scalar) { - return in; - } - }; - - G_TYPED_KERNEL(GGaussBlur, , "org.opencv.imgproc.filters.gaussianBlur") { - static GMatDesc outMeta(GMatDesc in, Size, double, double, int, Scalar) { - return in; - } - }; - - G_TYPED_KERNEL(GMedianBlur, , "org.opencv.imgproc.filters.medianBlur") { - static GMatDesc outMeta(GMatDesc in, int) { - return in; - } - }; - - G_TYPED_KERNEL(GErode, , "org.opencv.imgproc.filters.erode") { - static GMatDesc outMeta(GMatDesc in, Mat, Point, int, int, Scalar) { - return in; - } - }; - - G_TYPED_KERNEL(GDilate, , "org.opencv.imgproc.filters.dilate") { - static GMatDesc outMeta(GMatDesc in, Mat, Point, int, int, Scalar) { - return in; - } - }; - - G_TYPED_KERNEL(GMorphologyEx, , - "org.opencv.imgproc.filters.morphologyEx") { - static GMatDesc outMeta(const GMatDesc &in, MorphTypes, Mat, Point, int, - BorderTypes, Scalar) { - return in; - } - }; - - G_TYPED_KERNEL(GSobel, , "org.opencv.imgproc.filters.sobel") { - static GMatDesc outMeta(GMatDesc in, int ddepth, int, int, int, double, double, int, Scalar) { - return in.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL_M(GSobelXY, , "org.opencv.imgproc.filters.sobelxy") { - static std::tuple outMeta(GMatDesc in, int ddepth, int, int, double, double, int, Scalar) { - return std::make_tuple(in.withDepth(ddepth), in.withDepth(ddepth)); - } - }; - - G_TYPED_KERNEL(GLaplacian, , - "org.opencv.imgproc.filters.laplacian") { - static GMatDesc outMeta(GMatDesc in, int ddepth, int, double, double, int) { - return in.withDepth(ddepth); - } - }; - - G_TYPED_KERNEL(GBilateralFilter, , - "org.opencv.imgproc.filters.bilateralfilter") { - static GMatDesc outMeta(GMatDesc in, int, double, double, int) { - return in; - } - }; - - G_TYPED_KERNEL(GEqHist, , "org.opencv.imgproc.equalizeHist") { - static GMatDesc outMeta(GMatDesc in) { - return in.withType(CV_8U, 1); - } - }; - - G_TYPED_KERNEL(GCanny, , "org.opencv.imgproc.feature.canny") { - static GMatDesc outMeta(GMatDesc in, double, double, int, bool) { - return in.withType(CV_8U, 1); - } - }; - - G_TYPED_KERNEL(GGoodFeatures, - (GMat,int,double,double,Mat,int,bool,double)>, - "org.opencv.imgproc.feature.goodFeaturesToTrack") { - static GArrayDesc outMeta(GMatDesc, int, double, double, const Mat&, int, bool, double) { - return empty_array_desc(); - } - }; - - using RetrMode = RetrievalModes; - using ContMethod = ContourApproximationModes; - G_TYPED_KERNEL(GFindContours, >(GMat,RetrMode,ContMethod,GOpaque)>, - "org.opencv.imgproc.shape.findContours") - { - static GArrayDesc outMeta(GMatDesc in, RetrMode mode, ContMethod, GOpaqueDesc) - { - validateFindingContoursMeta(in.depth, in.chan, mode); - return empty_array_desc(); - } - }; - - // FIXME oc: make default value offset = Point() - G_TYPED_KERNEL(GFindContoursNoOffset, >(GMat,RetrMode,ContMethod)>, - "org.opencv.imgproc.shape.findContoursNoOffset") - { - static GArrayDesc outMeta(GMatDesc in, RetrMode mode, ContMethod) - { - validateFindingContoursMeta(in.depth, in.chan, mode); - return empty_array_desc(); - } - }; - - G_TYPED_KERNEL(GFindContoursH,)>, - "org.opencv.imgproc.shape.findContoursH") - { - static std::tuple - outMeta(GMatDesc in, RetrMode mode, ContMethod, GOpaqueDesc) - { - validateFindingContoursMeta(in.depth, in.chan, mode); - return std::make_tuple(empty_array_desc(), empty_array_desc()); - } - }; - - // FIXME oc: make default value offset = Point() - G_TYPED_KERNEL(GFindContoursHNoOffset,, - "org.opencv.imgproc.shape.findContoursHNoOffset") - { - static std::tuple - outMeta(GMatDesc in, RetrMode mode, ContMethod) - { - validateFindingContoursMeta(in.depth, in.chan, mode); - return std::make_tuple(empty_array_desc(), empty_array_desc()); - } - }; - - G_TYPED_KERNEL(GBoundingRectMat, (GMat)>, - "org.opencv.imgproc.shape.boundingRectMat") { - static GOpaqueDesc outMeta(GMatDesc in) { - if (in.depth == CV_8U) - { - GAPI_Assert(in.chan == 1); - } - else - { - GAPI_Assert (in.depth == CV_32S || in.depth == CV_32F); - int amount = detail::checkVector(in, 2u); - GAPI_Assert(amount != -1 && - "Input Mat can't be described as vector of 2-dimentional points"); - } - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GBoundingRectVector32S, (GArray)>, - "org.opencv.imgproc.shape.boundingRectVector32S") { - static GOpaqueDesc outMeta(GArrayDesc) { - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GBoundingRectVector32F, (GArray)>, - "org.opencv.imgproc.shape.boundingRectVector32F") { - static GOpaqueDesc outMeta(GArrayDesc) { - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GFitLine2DMat, (GMat,DistanceTypes,double,double,double)>, - "org.opencv.imgproc.shape.fitLine2DMat") { - static GOpaqueDesc outMeta(GMatDesc in,DistanceTypes,double,double,double) { - int amount = detail::checkVector(in, 2u); - GAPI_Assert(amount != -1 && - "Input Mat can't be described as vector of 2-dimentional points"); - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GFitLine2DVector32S, - (GArray,DistanceTypes,double,double,double)>, - "org.opencv.imgproc.shape.fitLine2DVector32S") { - static GOpaqueDesc outMeta(GArrayDesc,DistanceTypes,double,double,double) { - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GFitLine2DVector32F, - (GArray,DistanceTypes,double,double,double)>, - "org.opencv.imgproc.shape.fitLine2DVector32F") { - static GOpaqueDesc outMeta(GArrayDesc,DistanceTypes,double,double,double) { - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GFitLine2DVector64F, - (GArray,DistanceTypes,double,double,double)>, - "org.opencv.imgproc.shape.fitLine2DVector64F") { - static GOpaqueDesc outMeta(GArrayDesc,DistanceTypes,double,double,double) { - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GFitLine3DMat, (GMat,DistanceTypes,double,double,double)>, - "org.opencv.imgproc.shape.fitLine3DMat") { - static GOpaqueDesc outMeta(GMatDesc in,int,double,double,double) { - int amount = detail::checkVector(in, 3u); - GAPI_Assert(amount != -1 && - "Input Mat can't be described as vector of 3-dimentional points"); - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GFitLine3DVector32S, - (GArray,DistanceTypes,double,double,double)>, - "org.opencv.imgproc.shape.fitLine3DVector32S") { - static GOpaqueDesc outMeta(GArrayDesc,DistanceTypes,double,double,double) { - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GFitLine3DVector32F, - (GArray,DistanceTypes,double,double,double)>, - "org.opencv.imgproc.shape.fitLine3DVector32F") { - static GOpaqueDesc outMeta(GArrayDesc,DistanceTypes,double,double,double) { - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GFitLine3DVector64F, - (GArray,DistanceTypes,double,double,double)>, - "org.opencv.imgproc.shape.fitLine3DVector64F") { - static GOpaqueDesc outMeta(GArrayDesc,DistanceTypes,double,double,double) { - return empty_gopaque_desc(); - } - }; - - G_TYPED_KERNEL(GBGR2RGB, , "org.opencv.imgproc.colorconvert.bgr2rgb") { - static GMatDesc outMeta(GMatDesc in) { - return in; // type still remains CV_8UC3; - } - }; - - G_TYPED_KERNEL(GRGB2YUV, , "org.opencv.imgproc.colorconvert.rgb2yuv") { - static GMatDesc outMeta(GMatDesc in) { - return in; // type still remains CV_8UC3; - } - }; - - G_TYPED_KERNEL(GYUV2RGB, , "org.opencv.imgproc.colorconvert.yuv2rgb") { - static GMatDesc outMeta(GMatDesc in) { - return in; // type still remains CV_8UC3; - } - }; - - G_TYPED_KERNEL(GBGR2I420, , "org.opencv.imgproc.colorconvert.bgr2i420") { - static GMatDesc outMeta(GMatDesc in) { - GAPI_Assert(in.depth == CV_8U); - GAPI_Assert(in.chan == 3); - GAPI_Assert(in.size.height % 2 == 0); - return in.withType(in.depth, 1).withSize(Size(in.size.width, in.size.height * 3 / 2)); - } - }; - - G_TYPED_KERNEL(GRGB2I420, , "org.opencv.imgproc.colorconvert.rgb2i420") { - static GMatDesc outMeta(GMatDesc in) { - GAPI_Assert(in.depth == CV_8U); - GAPI_Assert(in.chan == 3); - GAPI_Assert(in.size.height % 2 == 0); - return in.withType(in.depth, 1).withSize(Size(in.size.width, in.size.height * 3 / 2)); - } - }; - - G_TYPED_KERNEL(GI4202BGR, , "org.opencv.imgproc.colorconvert.i4202bgr") { - static GMatDesc outMeta(GMatDesc in) { - GAPI_Assert(in.depth == CV_8U); - GAPI_Assert(in.chan == 1); - GAPI_Assert(in.size.height % 3 == 0); - return in.withType(in.depth, 3).withSize(Size(in.size.width, in.size.height * 2 / 3)); - } - }; - - G_TYPED_KERNEL(GI4202RGB, , "org.opencv.imgproc.colorconvert.i4202rgb") { - static GMatDesc outMeta(GMatDesc in) { - GAPI_Assert(in.depth == CV_8U); - GAPI_Assert(in.chan == 1); - GAPI_Assert(in.size.height % 3 == 0); - return in.withType(in.depth, 3).withSize(Size(in.size.width, in.size.height * 2 / 3)); - } - }; - - G_TYPED_KERNEL(GNV12toRGB, , "org.opencv.imgproc.colorconvert.nv12torgb") { - static GMatDesc outMeta(GMatDesc in_y, GMatDesc in_uv) { - GAPI_Assert(in_y.chan == 1); - GAPI_Assert(in_uv.chan == 2); - GAPI_Assert(in_y.depth == CV_8U); - GAPI_Assert(in_uv.depth == CV_8U); - // UV size should be aligned with Y - GAPI_Assert(in_y.size.width == 2 * in_uv.size.width); - GAPI_Assert(in_y.size.height == 2 * in_uv.size.height); - return in_y.withType(CV_8U, 3); // type will be CV_8UC3; - } - }; - - G_TYPED_KERNEL(GNV12toBGR, , "org.opencv.imgproc.colorconvert.nv12tobgr") { - static GMatDesc outMeta(GMatDesc in_y, GMatDesc in_uv) { - GAPI_Assert(in_y.chan == 1); - GAPI_Assert(in_uv.chan == 2); - GAPI_Assert(in_y.depth == CV_8U); - GAPI_Assert(in_uv.depth == CV_8U); - // UV size should be aligned with Y - GAPI_Assert(in_y.size.width == 2 * in_uv.size.width); - GAPI_Assert(in_y.size.height == 2 * in_uv.size.height); - return in_y.withType(CV_8U, 3); // type will be CV_8UC3; - } - }; - - G_TYPED_KERNEL(GRGB2Lab, , "org.opencv.imgproc.colorconvert.rgb2lab") { - static GMatDesc outMeta(GMatDesc in) { - return in; // type still remains CV_8UC3; - } - }; - - G_TYPED_KERNEL(GBGR2LUV, , "org.opencv.imgproc.colorconvert.bgr2luv") { - static GMatDesc outMeta(GMatDesc in) { - return in; // type still remains CV_8UC3; - } - }; - - G_TYPED_KERNEL(GLUV2BGR, , "org.opencv.imgproc.colorconvert.luv2bgr") { - static GMatDesc outMeta(GMatDesc in) { - return in; // type still remains CV_8UC3; - } - }; - - G_TYPED_KERNEL(GYUV2BGR, , "org.opencv.imgproc.colorconvert.yuv2bgr") { - static GMatDesc outMeta(GMatDesc in) { - return in; // type still remains CV_8UC3; - } - }; - - G_TYPED_KERNEL(GBGR2YUV, , "org.opencv.imgproc.colorconvert.bgr2yuv") { - static GMatDesc outMeta(GMatDesc in) { - return in; // type still remains CV_8UC3; - } - }; - - G_TYPED_KERNEL(GRGB2Gray, , "org.opencv.imgproc.colorconvert.rgb2gray") { - static GMatDesc outMeta(GMatDesc in) { - return in.withType(CV_8U, 1); - } - }; - - G_TYPED_KERNEL(GRGB2GrayCustom, , "org.opencv.imgproc.colorconvert.rgb2graycustom") { - static GMatDesc outMeta(GMatDesc in, float, float, float) { - return in.withType(CV_8U, 1); - } - }; - - G_TYPED_KERNEL(GBGR2Gray, , "org.opencv.imgproc.colorconvert.bgr2gray") { - static GMatDesc outMeta(GMatDesc in) { - return in.withType(CV_8U, 1); - } - }; - - G_TYPED_KERNEL(GBayerGR2RGB, , "org.opencv.imgproc.colorconvert.bayergr2rgb") { - static cv::GMatDesc outMeta(cv::GMatDesc in) { - return in.withType(CV_8U, 3); - } - }; - - G_TYPED_KERNEL(GRGB2HSV, , "org.opencv.imgproc.colorconvert.rgb2hsv") { - static cv::GMatDesc outMeta(cv::GMatDesc in) { - return in; - } - }; - - G_TYPED_KERNEL(GRGB2YUV422, , "org.opencv.imgproc.colorconvert.rgb2yuv422") { - static cv::GMatDesc outMeta(cv::GMatDesc in) { - GAPI_Assert(in.depth == CV_8U); - GAPI_Assert(in.chan == 3); - return in.withType(in.depth, 2); - } - }; - - G_TYPED_KERNEL(GNV12toRGBp, , "org.opencv.imgproc.colorconvert.nv12torgbp") { - static GMatDesc outMeta(GMatDesc inY, GMatDesc inUV) { - GAPI_Assert(inY.depth == CV_8U); - GAPI_Assert(inUV.depth == CV_8U); - GAPI_Assert(inY.chan == 1); - GAPI_Assert(inY.planar == false); - GAPI_Assert(inUV.chan == 2); - GAPI_Assert(inUV.planar == false); - GAPI_Assert(inY.size.width == 2 * inUV.size.width); - GAPI_Assert(inY.size.height == 2 * inUV.size.height); - return inY.withType(CV_8U, 3).asPlanar(); - } - }; - - G_TYPED_KERNEL(GNV12toGray, , "org.opencv.imgproc.colorconvert.nv12togray") { - static GMatDesc outMeta(GMatDesc inY, GMatDesc inUV) { - GAPI_Assert(inY.depth == CV_8U); - GAPI_Assert(inUV.depth == CV_8U); - GAPI_Assert(inY.chan == 1); - GAPI_Assert(inY.planar == false); - GAPI_Assert(inUV.chan == 2); - GAPI_Assert(inUV.planar == false); - - GAPI_Assert(inY.size.width == 2 * inUV.size.width); - GAPI_Assert(inY.size.height == 2 * inUV.size.height); - return inY.withType(CV_8U, 1); - } - }; - - G_TYPED_KERNEL(GNV12toBGRp, , "org.opencv.imgproc.colorconvert.nv12tobgrp") { - static GMatDesc outMeta(GMatDesc inY, GMatDesc inUV) { - GAPI_Assert(inY.depth == CV_8U); - GAPI_Assert(inUV.depth == CV_8U); - GAPI_Assert(inY.chan == 1); - GAPI_Assert(inY.planar == false); - GAPI_Assert(inUV.chan == 2); - GAPI_Assert(inUV.planar == false); - GAPI_Assert(inY.size.width == 2 * inUV.size.width); - GAPI_Assert(inY.size.height == 2 * inUV.size.height); - return inY.withType(CV_8U, 3).asPlanar(); - } - }; - - G_TYPED_KERNEL(GResize, , "org.opencv.imgproc.transform.resize") { - static GMatDesc outMeta(GMatDesc in, Size sz, double fx, double fy, int /*interp*/) { - if (sz.width != 0 && sz.height != 0) - { - return in.withSize(sz); - } - else - { - int outSz_w = saturate_cast(in.size.width * fx); - int outSz_h = saturate_cast(in.size.height * fy); - GAPI_Assert(outSz_w > 0 && outSz_h > 0); - return in.withSize(Size(outSz_w, outSz_h)); - } - } - }; - - G_TYPED_KERNEL(GResizeP, , "org.opencv.imgproc.transform.resizeP") { - static GMatDesc outMeta(GMatDesc in, Size sz, int interp) { - GAPI_Assert(in.depth == CV_8U); - GAPI_Assert(in.chan == 3); - GAPI_Assert(in.planar); - GAPI_Assert(interp == cv::INTER_LINEAR); - return in.withSize(sz); - } - }; - -} //namespace imgproc - -//! @addtogroup gapi_filters -//! @{ -/** @brief Applies a separable linear filter to a matrix(image). - -The function applies a separable linear filter to the matrix. That is, first, every row of src is -filtered with the 1D kernel kernelX. Then, every column of the result is filtered with the 1D -kernel kernelY. The final result is returned. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. -Output image must have the same type, size, and number of channels as the input image. -@note - - In case of floating-point computation, rounding to nearest even is procedeed -if hardware supports it (if not - to nearest value). - - Function textual ID is "org.opencv.imgproc.filters.sepfilter" -@param src Source image. -@param ddepth desired depth of the destination image (the following combinations of src.depth() and ddepth are supported: - - src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F - src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F - src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F - src.depth() = CV_64F, ddepth = -1/CV_64F - -when ddepth=-1, the output image will have the same depth as the source) -@param kernelX Coefficients for filtering each row. -@param kernelY Coefficients for filtering each column. -@param anchor Anchor position within the kernel. The default value \f$(-1,-1)\f$ means that the anchor -is at the kernel center. -@param delta Value added to the filtered results before storing them. -@param borderType Pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of constant border type -@sa boxFilter, gaussianBlur, medianBlur - */ -GAPI_EXPORTS_W GMat sepFilter(const GMat& src, int ddepth, const Mat& kernelX, const Mat& kernelY, const Point& anchor /*FIXME: = Point(-1,-1)*/, - const Scalar& delta /*FIXME = GScalar(0)*/, int borderType = BORDER_DEFAULT, - const Scalar& borderValue = Scalar(0)); - -/** @brief Convolves an image with the kernel. - -The function applies an arbitrary linear filter to an image. When -the aperture is partially outside the image, the function interpolates outlier pixel values -according to the specified border mode. - -The function does actually compute correlation, not the convolution: - -\f[\texttt{dst} (x,y) = \sum _{ \substack{0\leq x' < \texttt{kernel.cols}\\{0\leq y' < \texttt{kernel.rows}}}} \texttt{kernel} (x',y')* \texttt{src} (x+x'- \texttt{anchor.x} ,y+y'- \texttt{anchor.y} )\f] - -That is, the kernel is not mirrored around the anchor point. If you need a real convolution, flip -the kernel using flip and set the new anchor to `(kernel.cols - anchor.x - 1, kernel.rows - -anchor.y - 1)`. - -Supported matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. -Output image must have the same size and number of channels an input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.filter2D" - -@param src input image. -@param ddepth desired depth of the destination image -@param kernel convolution kernel (or rather a correlation kernel), a single-channel floating point -matrix; if you want to apply different kernels to different channels, split the image into -separate color planes using split and process them individually. -@param anchor anchor of the kernel that indicates the relative position of a filtered point within -the kernel; the anchor should lie within the kernel; default value (-1,-1) means that the anchor -is at the kernel center. -@param delta optional value added to the filtered pixels before storing them in dst. -@param borderType pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of constant border type -@sa sepFilter - */ -GAPI_EXPORTS_W GMat filter2D(const GMat& src, int ddepth, const Mat& kernel, const Point& anchor = Point(-1,-1), const Scalar& delta = Scalar(0), - int borderType = BORDER_DEFAULT, const Scalar& borderValue = Scalar(0)); - - -/** @brief Blurs an image using the box filter. - -The function smooths an image using the kernel: - -\f[\texttt{K} = \alpha \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \end{bmatrix}\f] - -where - -\f[\alpha = \begin{cases} \frac{1}{\texttt{ksize.width*ksize.height}} & \texttt{when } \texttt{normalize=true} \\1 & \texttt{otherwise} \end{cases}\f] - -Unnormalized box filter is useful for computing various integral characteristics over each pixel -neighborhood, such as covariance matrices of image derivatives (used in dense optical flow -algorithms, and so on). If you need to compute pixel sums over variable-size windows, use cv::integral. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. -Output image must have the same type, size, and number of channels as the input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.boxfilter" - -@param src Source image. -@param dtype the output image depth (-1 to set the input image data type). -@param ksize blurring kernel size. -@param anchor Anchor position within the kernel. The default value \f$(-1,-1)\f$ means that the anchor -is at the kernel center. -@param normalize flag, specifying whether the kernel is normalized by its area or not. -@param borderType Pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of constant border type -@sa sepFilter, gaussianBlur, medianBlur, integral - */ -GAPI_EXPORTS_W GMat boxFilter(const GMat& src, int dtype, const Size& ksize, const Point& anchor = Point(-1,-1), - bool normalize = true, int borderType = BORDER_DEFAULT, - const Scalar& borderValue = Scalar(0)); - -/** @brief Blurs an image using the normalized box filter. - -The function smooths an image using the kernel: - -\f[\texttt{K} = \frac{1}{\texttt{ksize.width*ksize.height}} \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \end{bmatrix}\f] - -The call `blur(src, ksize, anchor, borderType)` is equivalent to `boxFilter(src, src.type(), ksize, anchor, -true, borderType)`. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. -Output image must have the same type, size, and number of channels as the input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.blur" - -@param src Source image. -@param ksize blurring kernel size. -@param anchor anchor point; default value Point(-1,-1) means that the anchor is at the kernel -center. -@param borderType border mode used to extrapolate pixels outside of the image, see cv::BorderTypes -@param borderValue border value in case of constant border type -@sa boxFilter, bilateralFilter, GaussianBlur, medianBlur - */ -GAPI_EXPORTS_W GMat blur(const GMat& src, const Size& ksize, const Point& anchor = Point(-1,-1), - int borderType = BORDER_DEFAULT, const Scalar& borderValue = Scalar(0)); - - -//GAPI_EXPORTS_W void blur( InputArray src, OutputArray dst, - // Size ksize, Point anchor = Point(-1,-1), - // int borderType = BORDER_DEFAULT ); - - -/** @brief Blurs an image using a Gaussian filter. - -The function filter2Ds the source image with the specified Gaussian kernel. -Output image must have the same type and number of channels an input image. - -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, @ref CV_32FC1. -Output image must have the same type, size, and number of channels as the input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.gaussianBlur" - -@param src input image; -@param ksize Gaussian kernel size. ksize.width and ksize.height can differ but they both must be -positive and odd. Or, they can be zero's and then they are computed from sigma. -@param sigmaX Gaussian kernel standard deviation in X direction. -@param sigmaY Gaussian kernel standard deviation in Y direction; if sigmaY is zero, it is set to be -equal to sigmaX, if both sigmas are zeros, they are computed from ksize.width and ksize.height, -respectively (see cv::getGaussianKernel for details); to fully control the result regardless of -possible future modifications of all this semantics, it is recommended to specify all of ksize, -sigmaX, and sigmaY. -@param borderType pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of constant border type -@sa sepFilter, boxFilter, medianBlur - */ -GAPI_EXPORTS_W GMat gaussianBlur(const GMat& src, const Size& ksize, double sigmaX, double sigmaY = 0, - int borderType = BORDER_DEFAULT, const Scalar& borderValue = Scalar(0)); - -/** @brief Blurs an image using the median filter. - -The function smoothes an image using the median filter with the \f$\texttt{ksize} \times -\texttt{ksize}\f$ aperture. Each channel of a multi-channel image is processed independently. -Output image must have the same type, size, and number of channels as the input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. -The median filter uses cv::BORDER_REPLICATE internally to cope with border pixels, see cv::BorderTypes - - Function textual ID is "org.opencv.imgproc.filters.medianBlur" - -@param src input matrix (image) -@param ksize aperture linear size; it must be odd and greater than 1, for example: 3, 5, 7 ... -@sa boxFilter, gaussianBlur - */ -GAPI_EXPORTS_W GMat medianBlur(const GMat& src, int ksize); - -/** @brief Erodes an image by using a specific structuring element. - -The function erodes the source image using the specified structuring element that determines the -shape of a pixel neighborhood over which the minimum is taken: - -\f[\texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\f] - -Erosion can be applied several (iterations) times. In case of multi-channel images, each channel is processed independently. -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, and @ref CV_32FC1. -Output image must have the same type, size, and number of channels as the input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.erode" - -@param src input image -@param kernel structuring element used for erosion; if `element=Mat()`, a `3 x 3` rectangular -structuring element is used. Kernel can be created using getStructuringElement. -@param anchor position of the anchor within the element; default value (-1, -1) means that the -anchor is at the element center. -@param iterations number of times erosion is applied. -@param borderType pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of a constant border -@sa dilate, morphologyEx - */ -GAPI_EXPORTS_W GMat erode(const GMat& src, const Mat& kernel, const Point& anchor = Point(-1,-1), int iterations = 1, - int borderType = BORDER_CONSTANT, - const Scalar& borderValue = morphologyDefaultBorderValue()); - -/** @brief Erodes an image by using 3 by 3 rectangular structuring element. - -The function erodes the source image using the rectangular structuring element with rectangle center as an anchor. -Erosion can be applied several (iterations) times. In case of multi-channel images, each channel is processed independently. -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, and @ref CV_32FC1. -Output image must have the same type, size, and number of channels as the input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.erode" - -@param src input image -@param iterations number of times erosion is applied. -@param borderType pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of a constant border -@sa erode, dilate3x3 - */ -GAPI_EXPORTS_W GMat erode3x3(const GMat& src, int iterations = 1, - int borderType = BORDER_CONSTANT, - const Scalar& borderValue = morphologyDefaultBorderValue()); - -/** @brief Dilates an image by using a specific structuring element. - -The function dilates the source image using the specified structuring element that determines the -shape of a pixel neighborhood over which the maximum is taken: -\f[\texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\f] - -Dilation can be applied several (iterations) times. In case of multi-channel images, each channel is processed independently. -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, and @ref CV_32FC1. -Output image must have the same type, size, and number of channels as the input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.dilate" - -@param src input image. -@param kernel structuring element used for dilation; if elemenat=Mat(), a 3 x 3 rectangular -structuring element is used. Kernel can be created using getStructuringElement -@param anchor position of the anchor within the element; default value (-1, -1) means that the -anchor is at the element center. -@param iterations number of times dilation is applied. -@param borderType pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of a constant border -@sa erode, morphologyEx, getStructuringElement - */ -GAPI_EXPORTS_W GMat dilate(const GMat& src, const Mat& kernel, const Point& anchor = Point(-1,-1), int iterations = 1, - int borderType = BORDER_CONSTANT, - const Scalar& borderValue = morphologyDefaultBorderValue()); - -/** @brief Dilates an image by using 3 by 3 rectangular structuring element. - -The function dilates the source image using the specified structuring element that determines the -shape of a pixel neighborhood over which the maximum is taken: -\f[\texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\f] - -Dilation can be applied several (iterations) times. In case of multi-channel images, each channel is processed independently. -Supported input matrix data types are @ref CV_8UC1, @ref CV_8UC3, @ref CV_16UC1, @ref CV_16SC1, and @ref CV_32FC1. -Output image must have the same type, size, and number of channels as the input image. -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.dilate" - -@param src input image. -@param iterations number of times dilation is applied. -@param borderType pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of a constant border -@sa dilate, erode3x3 - */ - -GAPI_EXPORTS_W GMat dilate3x3(const GMat& src, int iterations = 1, - int borderType = BORDER_CONSTANT, - const Scalar& borderValue = morphologyDefaultBorderValue()); - -/** @brief Performs advanced morphological transformations. - -The function can perform advanced morphological transformations using an erosion and dilation as -basic operations. - -Any of the operations can be done in-place. In case of multi-channel images, each channel is -processed independently. - -@note - - Function textual ID is "org.opencv.imgproc.filters.morphologyEx" - - The number of iterations is the number of times erosion or dilatation operation will be -applied. For instance, an opening operation (#MORPH_OPEN) with two iterations is equivalent to -apply successively: erode -> erode -> dilate -> dilate -(and not erode -> dilate -> erode -> dilate). - -@param src Input image. -@param op Type of a morphological operation, see #MorphTypes -@param kernel Structuring element. It can be created using #getStructuringElement. -@param anchor Anchor position within the element. Both negative values mean that the anchor is at -the kernel center. -@param iterations Number of times erosion and dilation are applied. -@param borderType Pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. -@param borderValue Border value in case of a constant border. The default value has a special -meaning. -@sa dilate, erode, getStructuringElement - */ -GAPI_EXPORTS_W GMat morphologyEx(const GMat &src, const MorphTypes op, const Mat &kernel, - const Point &anchor = Point(-1,-1), - const int iterations = 1, - const BorderTypes borderType = BORDER_CONSTANT, - const Scalar &borderValue = morphologyDefaultBorderValue()); - -/** @brief Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. - -In all cases except one, the \f$\texttt{ksize} \times \texttt{ksize}\f$ separable kernel is used to -calculate the derivative. When \f$\texttt{ksize = 1}\f$, the \f$3 \times 1\f$ or \f$1 \times 3\f$ -kernel is used (that is, no Gaussian smoothing is done). `ksize = 1` can only be used for the first -or the second x- or y- derivatives. - -There is also the special value `ksize = FILTER_SCHARR (-1)` that corresponds to the \f$3\times3\f$ Scharr -filter that may give more accurate results than the \f$3\times3\f$ Sobel. The Scharr aperture is - -\f[\vecthreethree{-3}{0}{3}{-10}{0}{10}{-3}{0}{3}\f] - -for the x-derivative, or transposed for the y-derivative. - -The function calculates an image derivative by convolving the image with the appropriate kernel: - -\f[\texttt{dst} = \frac{\partial^{xorder+yorder} \texttt{src}}{\partial x^{xorder} \partial y^{yorder}}\f] - -The Sobel operators combine Gaussian smoothing and differentiation, so the result is more or less -resistant to the noise. Most often, the function is called with ( xorder = 1, yorder = 0, ksize = 3) -or ( xorder = 0, yorder = 1, ksize = 3) to calculate the first x- or y- image derivative. The first -case corresponds to a kernel of: - -\f[\vecthreethree{-1}{0}{1}{-2}{0}{2}{-1}{0}{1}\f] - -The second case corresponds to a kernel of: - -\f[\vecthreethree{-1}{-2}{-1}{0}{0}{0}{1}{2}{1}\f] - -@note - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.sobel" - -@param src input image. -@param ddepth output image depth, see @ref filter_depths "combinations"; in the case of - 8-bit input images it will result in truncated derivatives. -@param dx order of the derivative x. -@param dy order of the derivative y. -@param ksize size of the extended Sobel kernel; it must be odd. -@param scale optional scale factor for the computed derivative values; by default, no scaling is -applied (see cv::getDerivKernels for details). -@param delta optional delta value that is added to the results prior to storing them in dst. -@param borderType pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of constant border type -@sa filter2D, gaussianBlur, cartToPolar - */ -GAPI_EXPORTS_W GMat Sobel(const GMat& src, int ddepth, int dx, int dy, int ksize = 3, - double scale = 1, double delta = 0, - int borderType = BORDER_DEFAULT, - const Scalar& borderValue = Scalar(0)); - -/** @brief Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. - -In all cases except one, the \f$\texttt{ksize} \times \texttt{ksize}\f$ separable kernel is used to -calculate the derivative. When \f$\texttt{ksize = 1}\f$, the \f$3 \times 1\f$ or \f$1 \times 3\f$ -kernel is used (that is, no Gaussian smoothing is done). `ksize = 1` can only be used for the first -or the second x- or y- derivatives. - -There is also the special value `ksize = FILTER_SCHARR (-1)` that corresponds to the \f$3\times3\f$ Scharr -filter that may give more accurate results than the \f$3\times3\f$ Sobel. The Scharr aperture is - -\f[\vecthreethree{-3}{0}{3}{-10}{0}{10}{-3}{0}{3}\f] - -for the x-derivative, or transposed for the y-derivative. - -The function calculates an image derivative by convolving the image with the appropriate kernel: - -\f[\texttt{dst} = \frac{\partial^{xorder+yorder} \texttt{src}}{\partial x^{xorder} \partial y^{yorder}}\f] - -The Sobel operators combine Gaussian smoothing and differentiation, so the result is more or less -resistant to the noise. Most often, the function is called with ( xorder = 1, yorder = 0, ksize = 3) -or ( xorder = 0, yorder = 1, ksize = 3) to calculate the first x- or y- image derivative. The first -case corresponds to a kernel of: - -\f[\vecthreethree{-1}{0}{1}{-2}{0}{2}{-1}{0}{1}\f] - -The second case corresponds to a kernel of: - -\f[\vecthreethree{-1}{-2}{-1}{0}{0}{0}{1}{2}{1}\f] - -@note - - First returned matrix correspons to dx derivative while the second one to dy. - - Rounding to nearest even is procedeed if hardware supports it, if not - to nearest. - - Function textual ID is "org.opencv.imgproc.filters.sobelxy" - -@param src input image. -@param ddepth output image depth, see @ref filter_depths "combinations"; in the case of - 8-bit input images it will result in truncated derivatives. -@param order order of the derivatives. -@param ksize size of the extended Sobel kernel; it must be odd. -@param scale optional scale factor for the computed derivative values; by default, no scaling is -applied (see cv::getDerivKernels for details). -@param delta optional delta value that is added to the results prior to storing them in dst. -@param borderType pixel extrapolation method, see cv::BorderTypes -@param borderValue border value in case of constant border type -@sa filter2D, gaussianBlur, cartToPolar - */ -GAPI_EXPORTS_W std::tuple SobelXY(const GMat& src, int ddepth, int order, int ksize = 3, - double scale = 1, double delta = 0, - int borderType = BORDER_DEFAULT, - const Scalar& borderValue = Scalar(0)); - -/** @brief Calculates the Laplacian of an image. - -The function calculates the Laplacian of the source image by adding up the second x and y -derivatives calculated using the Sobel operator: - -\f[\texttt{dst} = \Delta \texttt{src} = \frac{\partial^2 \texttt{src}}{\partial x^2} + \frac{\partial^2 \texttt{src}}{\partial y^2}\f] - -This is done when `ksize > 1`. When `ksize == 1`, the Laplacian is computed by filtering the image -with the following \f$3 \times 3\f$ aperture: - -\f[\vecthreethree {0}{1}{0}{1}{-4}{1}{0}{1}{0}\f] - -@note Function textual ID is "org.opencv.imgproc.filters.laplacian" - -@param src Source image. -@param ddepth Desired depth of the destination image. -@param ksize Aperture size used to compute the second-derivative filters. See #getDerivKernels for -details. The size must be positive and odd. -@param scale Optional scale factor for the computed Laplacian values. By default, no scaling is -applied. See #getDerivKernels for details. -@param delta Optional delta value that is added to the results prior to storing them in dst . -@param borderType Pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. -@return Destination image of the same size and the same number of channels as src. -@sa Sobel, Scharr - */ -GAPI_EXPORTS_W GMat Laplacian(const GMat& src, int ddepth, int ksize = 1, - double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT); - -/** @brief Applies the bilateral filter to an image. - -The function applies bilateral filtering to the input image, as described in -http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html -bilateralFilter can reduce unwanted noise very well while keeping edges fairly sharp. However, it is -very slow compared to most filters. - -_Sigma values_: For simplicity, you can set the 2 sigma values to be the same. If they are small (\< -10), the filter will not have much effect, whereas if they are large (\> 150), they will have a very -strong effect, making the image look "cartoonish". - -_Filter size_: Large filters (d \> 5) are very slow, so it is recommended to use d=5 for real-time -applications, and perhaps d=9 for offline applications that need heavy noise filtering. - -This filter does not work inplace. - -@note Function textual ID is "org.opencv.imgproc.filters.bilateralfilter" - -@param src Source 8-bit or floating-point, 1-channel or 3-channel image. -@param d Diameter of each pixel neighborhood that is used during filtering. If it is non-positive, -it is computed from sigmaSpace. -@param sigmaColor Filter sigma in the color space. A larger value of the parameter means that -farther colors within the pixel neighborhood (see sigmaSpace) will be mixed together, resulting -in larger areas of semi-equal color. -@param sigmaSpace Filter sigma in the coordinate space. A larger value of the parameter means that -farther pixels will influence each other as long as their colors are close enough (see sigmaColor -). When d\>0, it specifies the neighborhood size regardless of sigmaSpace. Otherwise, d is -proportional to sigmaSpace. -@param borderType border mode used to extrapolate pixels outside of the image, see #BorderTypes -@return Destination image of the same size and type as src. - */ -GAPI_EXPORTS_W GMat bilateralFilter(const GMat& src, int d, double sigmaColor, double sigmaSpace, - int borderType = BORDER_DEFAULT); - -//! @} gapi_filters - -//! @addtogroup gapi_feature -//! @{ -/** @brief Finds edges in an image using the Canny algorithm. - -The function finds edges in the input image and marks them in the output map edges using the -Canny algorithm. The smallest value between threshold1 and threshold2 is used for edge linking. The -largest value is used to find initial segments of strong edges. See - - -@note Function textual ID is "org.opencv.imgproc.feature.canny" - -@param image 8-bit input image. -@param threshold1 first threshold for the hysteresis procedure. -@param threshold2 second threshold for the hysteresis procedure. -@param apertureSize aperture size for the Sobel operator. -@param L2gradient a flag, indicating whether a more accurate \f$L_2\f$ norm -\f$=\sqrt{(dI/dx)^2 + (dI/dy)^2}\f$ should be used to calculate the image gradient magnitude ( -L2gradient=true ), or whether the default \f$L_1\f$ norm \f$=|dI/dx|+|dI/dy|\f$ is enough ( -L2gradient=false ). - */ -GAPI_EXPORTS_W GMat Canny(const GMat& image, double threshold1, double threshold2, - int apertureSize = 3, bool L2gradient = false); - -/** @brief Determines strong corners on an image. - -The function finds the most prominent corners in the image or in the specified image region, as -described in @cite Shi94 - -- Function calculates the corner quality measure at every source image pixel using the - #cornerMinEigenVal or #cornerHarris . -- Function performs a non-maximum suppression (the local maximums in *3 x 3* neighborhood are - retained). -- The corners with the minimal eigenvalue less than - \f$\texttt{qualityLevel} \cdot \max_{x,y} qualityMeasureMap(x,y)\f$ are rejected. -- The remaining corners are sorted by the quality measure in the descending order. -- Function throws away each corner for which there is a stronger corner at a distance less than - maxDistance. - -The function can be used to initialize a point-based tracker of an object. - -@note - - If the function is called with different values A and B of the parameter qualityLevel , and -A \> B, the vector of returned corners with qualityLevel=A will be the prefix of the output vector -with qualityLevel=B . - - Function textual ID is "org.opencv.imgproc.feature.goodFeaturesToTrack" - -@param image Input 8-bit or floating-point 32-bit, single-channel image. -@param maxCorners Maximum number of corners to return. If there are more corners than are found, -the strongest of them is returned. `maxCorners <= 0` implies that no limit on the maximum is set -and all detected corners are returned. -@param qualityLevel Parameter characterizing the minimal accepted quality of image corners. The -parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue -(see #cornerMinEigenVal ) or the Harris function response (see #cornerHarris ). The corners with the -quality measure less than the product are rejected. For example, if the best corner has the -quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure -less than 15 are rejected. -@param minDistance Minimum possible Euclidean distance between the returned corners. -@param mask Optional region of interest. If the image is not empty (it needs to have the type -CV_8UC1 and the same size as image ), it specifies the region in which the corners are detected. -@param blockSize Size of an average block for computing a derivative covariation matrix over each -pixel neighborhood. See cornerEigenValsAndVecs . -@param useHarrisDetector Parameter indicating whether to use a Harris detector (see #cornerHarris) -or #cornerMinEigenVal. -@param k Free parameter of the Harris detector. - -@return vector of detected corners. - */ -GAPI_EXPORTS_W GArray goodFeaturesToTrack(const GMat &image, - int maxCorners, - double qualityLevel, - double minDistance, - const Mat &mask = Mat(), - int blockSize = 3, - bool useHarrisDetector = false, - double k = 0.04); - -/** @brief Equalizes the histogram of a grayscale image. - -//! @} gapi_feature - -The function equalizes the histogram of the input image using the following algorithm: - -- Calculate the histogram \f$H\f$ for src . -- Normalize the histogram so that the sum of histogram bins is 255. -- Compute the integral of the histogram: -\f[H'_i = \sum _{0 \le j < i} H(j)\f] -- Transform the image using \f$H'\f$ as a look-up table: \f$\texttt{dst}(x,y) = H'(\texttt{src}(x,y))\f$ - -The algorithm normalizes the brightness and increases the contrast of the image. -@note - - The returned image is of the same size and type as input. - - Function textual ID is "org.opencv.imgproc.equalizeHist" - -@param src Source 8-bit single channel image. - */ -GAPI_EXPORTS_W GMat equalizeHist(const GMat& src); - -//! @addtogroup gapi_shape -//! @{ -/** @brief Finds contours in a binary image. - -The function retrieves contours from the binary image using the algorithm @cite Suzuki85 . -The contours are a useful tool for shape analysis and object detection and recognition. -See squares.cpp in the OpenCV sample directory. - -@note Function textual ID is "org.opencv.imgproc.shape.findContours" - -@param src Input gray-scale image @ref CV_8UC1. Non-zero pixels are treated as 1's. Zero -pixels remain 0's, so the image is treated as binary . You can use #compare, #inRange, #threshold , -#adaptiveThreshold, #Canny, and others to create a binary image out of a grayscale or color one. -If mode equals to #RETR_CCOMP, the input can also be a 32-bit integer -image of labels ( @ref CV_32SC1 ). If #RETR_FLOODFILL then @ref CV_32SC1 is supported only. -@param mode Contour retrieval mode, see #RetrievalModes -@param method Contour approximation method, see #ContourApproximationModes -@param offset Optional offset by which every contour point is shifted. This is useful if the -contours are extracted from the image ROI and then they should be analyzed in the whole image -context. - -@return GArray of detected contours. Each contour is stored as a GArray of points. - */ -GAPI_EXPORTS GArray> -findContours(const GMat &src, const RetrievalModes mode, const ContourApproximationModes method, - const GOpaque &offset); - -// FIXME oc: make default value offset = Point() -/** @overload -@note Function textual ID is "org.opencv.imgproc.shape.findContoursNoOffset" - */ -GAPI_EXPORTS GArray> -findContours(const GMat &src, const RetrievalModes mode, const ContourApproximationModes method); - -/** @brief Finds contours and their hierarchy in a binary image. - -The function retrieves contours from the binary image using the algorithm @cite Suzuki85 -and calculates their hierarchy. -The contours are a useful tool for shape analysis and object detection and recognition. -See squares.cpp in the OpenCV sample directory. - -@note Function textual ID is "org.opencv.imgproc.shape.findContoursH" - -@param src Input gray-scale image @ref CV_8UC1. Non-zero pixels are treated as 1's. Zero -pixels remain 0's, so the image is treated as binary . You can use #compare, #inRange, #threshold , -#adaptiveThreshold, #Canny, and others to create a binary image out of a grayscale or color one. -If mode equals to #RETR_CCOMP, the input can also be a 32-bit integer -image of labels ( @ref CV_32SC1 ). If #RETR_FLOODFILL -- @ref CV_32SC1 supports only. -@param mode Contour retrieval mode, see #RetrievalModes -@param method Contour approximation method, see #ContourApproximationModes -@param offset Optional offset by which every contour point is shifted. This is useful if the -contours are extracted from the image ROI and then they should be analyzed in the whole image -context. - -@return - - GArray of detected contours. Each contour is stored as a GArray of points. - - Optional output GArray of cv::Vec4i, containing information about the image topology. -It has as many elements as the number of contours. For each i-th contour contours[i], the elements -hierarchy[i][0] , hierarchy[i][1] , hierarchy[i][2] , and hierarchy[i][3] are set to 0-based -indices in contours of the next and previous contours at the same hierarchical level, the first -child contour and the parent contour, respectively. If for the contour i there are no next, -previous, parent, or nested contours, the corresponding elements of hierarchy[i] will be negative. - */ -GAPI_EXPORTS std::tuple>,GArray> -findContoursH(const GMat &src, const RetrievalModes mode, const ContourApproximationModes method, - const GOpaque &offset); - -// FIXME oc: make default value offset = Point() -/** @overload -@note Function textual ID is "org.opencv.imgproc.shape.findContoursHNoOffset" - */ -GAPI_EXPORTS std::tuple>,GArray> -findContoursH(const GMat &src, const RetrievalModes mode, const ContourApproximationModes method); - -/** @brief Calculates the up-right bounding rectangle of a point set or non-zero pixels -of gray-scale image. - -The function calculates and returns the minimal up-right bounding rectangle for the specified -point set or non-zero pixels of gray-scale image. - -@note - - Function textual ID is "org.opencv.imgproc.shape.boundingRectMat" - - In case of a 2D points' set given, Mat should be 2-dimensional, have a single row or column -if there are 2 channels, or have 2 columns if there is a single channel. Mat should have either -@ref CV_32S or @ref CV_32F depth - -@param src Input gray-scale image @ref CV_8UC1; or input set of @ref CV_32S or @ref CV_32F -2D points stored in Mat. - */ -GAPI_EXPORTS_W GOpaque boundingRect(const GMat& src); - -/** @overload - -Calculates the up-right bounding rectangle of a point set. - -@note Function textual ID is "org.opencv.imgproc.shape.boundingRectVector32S" - -@param src Input 2D point set, stored in std::vector. - */ -GAPI_EXPORTS_W GOpaque boundingRect(const GArray& src); - -/** @overload - -Calculates the up-right bounding rectangle of a point set. - -@note Function textual ID is "org.opencv.imgproc.shape.boundingRectVector32F" - -@param src Input 2D point set, stored in std::vector. - */ -GAPI_EXPORTS_W GOpaque boundingRect(const GArray& src); - -/** @brief Fits a line to a 2D point set. - -The function fits a line to a 2D point set by minimizing \f$\sum_i \rho(r_i)\f$ where -\f$r_i\f$ is a distance between the \f$i^{th}\f$ point, the line and \f$\rho(r)\f$ is a distance -function, one of the following: -- DIST_L2 -\f[\rho (r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)}\f] -- DIST_L1 -\f[\rho (r) = r\f] -- DIST_L12 -\f[\rho (r) = 2 \cdot ( \sqrt{1 + \frac{r^2}{2}} - 1)\f] -- DIST_FAIR -\f[\rho \left (r \right ) = C^2 \cdot \left ( \frac{r}{C} - \log{\left(1 + \frac{r}{C}\right)} \right ) \quad \text{where} \quad C=1.3998\f] -- DIST_WELSCH -\f[\rho \left (r \right ) = \frac{C^2}{2} \cdot \left ( 1 - \exp{\left(-\left(\frac{r}{C}\right)^2\right)} \right ) \quad \text{where} \quad C=2.9846\f] -- DIST_HUBER -\f[\rho (r) = \fork{r^2/2}{if \(r < C\)}{C \cdot (r-C/2)}{otherwise} \quad \text{where} \quad C=1.345\f] - -The algorithm is based on the M-estimator ( ) technique -that iteratively fits the line using the weighted least-squares algorithm. After each iteration the -weights \f$w_i\f$ are adjusted to be inversely proportional to \f$\rho(r_i)\f$ . - -@note - - Function textual ID is "org.opencv.imgproc.shape.fitLine2DMat" - - In case of an N-dimentional points' set given, Mat should be 2-dimensional, have a single row -or column if there are N channels, or have N columns if there is a single channel. - -@param src Input set of 2D points stored in one of possible containers: Mat, -std::vector, std::vector, std::vector. -@param distType Distance used by the M-estimator, see #DistanceTypes. @ref DIST_USER -and @ref DIST_C are not supported. -@param param Numerical parameter ( C ) for some types of distances. If it is 0, an optimal value -is chosen. -@param reps Sufficient accuracy for the radius (distance between the coordinate origin and the -line). 1.0 would be a good default value for reps. If it is 0, a default value is chosen. -@param aeps Sufficient accuracy for the angle. 0.01 would be a good default value for aeps. -If it is 0, a default value is chosen. - -@return Output line parameters: a vector of 4 elements (like Vec4f) - (vx, vy, x0, y0), -where (vx, vy) is a normalized vector collinear to the line and (x0, y0) is a point on the line. - */ -GAPI_EXPORTS GOpaque fitLine2D(const GMat& src, const DistanceTypes distType, - const double param = 0., const double reps = 0., - const double aeps = 0.); - -/** @overload - -@note Function textual ID is "org.opencv.imgproc.shape.fitLine2DVector32S" - - */ -GAPI_EXPORTS GOpaque fitLine2D(const GArray& src, const DistanceTypes distType, - const double param = 0., const double reps = 0., - const double aeps = 0.); - -/** @overload - -@note Function textual ID is "org.opencv.imgproc.shape.fitLine2DVector32F" - - */ -GAPI_EXPORTS GOpaque fitLine2D(const GArray& src, const DistanceTypes distType, - const double param = 0., const double reps = 0., - const double aeps = 0.); - -/** @overload - -@note Function textual ID is "org.opencv.imgproc.shape.fitLine2DVector64F" - - */ -GAPI_EXPORTS GOpaque fitLine2D(const GArray& src, const DistanceTypes distType, - const double param = 0., const double reps = 0., - const double aeps = 0.); - -/** @brief Fits a line to a 3D point set. - -The function fits a line to a 3D point set by minimizing \f$\sum_i \rho(r_i)\f$ where -\f$r_i\f$ is a distance between the \f$i^{th}\f$ point, the line and \f$\rho(r)\f$ is a distance -function, one of the following: -- DIST_L2 -\f[\rho (r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)}\f] -- DIST_L1 -\f[\rho (r) = r\f] -- DIST_L12 -\f[\rho (r) = 2 \cdot ( \sqrt{1 + \frac{r^2}{2}} - 1)\f] -- DIST_FAIR -\f[\rho \left (r \right ) = C^2 \cdot \left ( \frac{r}{C} - \log{\left(1 + \frac{r}{C}\right)} \right ) \quad \text{where} \quad C=1.3998\f] -- DIST_WELSCH -\f[\rho \left (r \right ) = \frac{C^2}{2} \cdot \left ( 1 - \exp{\left(-\left(\frac{r}{C}\right)^2\right)} \right ) \quad \text{where} \quad C=2.9846\f] -- DIST_HUBER -\f[\rho (r) = \fork{r^2/2}{if \(r < C\)}{C \cdot (r-C/2)}{otherwise} \quad \text{where} \quad C=1.345\f] - -The algorithm is based on the M-estimator ( ) technique -that iteratively fits the line using the weighted least-squares algorithm. After each iteration the -weights \f$w_i\f$ are adjusted to be inversely proportional to \f$\rho(r_i)\f$ . - -@note - - Function textual ID is "org.opencv.imgproc.shape.fitLine3DMat" - - In case of an N-dimentional points' set given, Mat should be 2-dimensional, have a single row -or column if there are N channels, or have N columns if there is a single channel. - -@param src Input set of 3D points stored in one of possible containers: Mat, -std::vector, std::vector, std::vector. -@param distType Distance used by the M-estimator, see #DistanceTypes. @ref DIST_USER -and @ref DIST_C are not supported. -@param param Numerical parameter ( C ) for some types of distances. If it is 0, an optimal value -is chosen. -@param reps Sufficient accuracy for the radius (distance between the coordinate origin and the -line). 1.0 would be a good default value for reps. If it is 0, a default value is chosen. -@param aeps Sufficient accuracy for the angle. 0.01 would be a good default value for aeps. -If it is 0, a default value is chosen. - -@return Output line parameters: a vector of 6 elements (like Vec6f) - (vx, vy, vz, x0, y0, z0), -where (vx, vy, vz) is a normalized vector collinear to the line and (x0, y0, z0) is a point on -the line. - */ -GAPI_EXPORTS GOpaque fitLine3D(const GMat& src, const DistanceTypes distType, - const double param = 0., const double reps = 0., - const double aeps = 0.); - -/** @overload - -@note Function textual ID is "org.opencv.imgproc.shape.fitLine3DVector32S" - - */ -GAPI_EXPORTS GOpaque fitLine3D(const GArray& src, const DistanceTypes distType, - const double param = 0., const double reps = 0., - const double aeps = 0.); - -/** @overload - -@note Function textual ID is "org.opencv.imgproc.shape.fitLine3DVector32F" - - */ -GAPI_EXPORTS GOpaque fitLine3D(const GArray& src, const DistanceTypes distType, - const double param = 0., const double reps = 0., - const double aeps = 0.); - -/** @overload - -@note Function textual ID is "org.opencv.imgproc.shape.fitLine3DVector64F" - - */ -GAPI_EXPORTS GOpaque fitLine3D(const GArray& src, const DistanceTypes distType, - const double param = 0., const double reps = 0., - const double aeps = 0.); - -//! @} gapi_shape - -//! @addtogroup gapi_colorconvert -//! @{ -/** @brief Converts an image from BGR color space to RGB color space. - -The function converts an input image from BGR color space to RGB. -The conventional ranges for B, G, and R channel values are 0 to 255. - -Output image is 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.bgr2rgb" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@sa RGB2BGR -*/ -GAPI_EXPORTS_W GMat BGR2RGB(const GMat& src); - -/** @brief Converts an image from RGB color space to gray-scaled. - -The conventional ranges for R, G, and B channel values are 0 to 255. -Resulting gray color value computed as -\f[\texttt{dst} (I)= \texttt{0.299} * \texttt{src}(I).R + \texttt{0.587} * \texttt{src}(I).G + \texttt{0.114} * \texttt{src}(I).B \f] - -@note Function textual ID is "org.opencv.imgproc.colorconvert.rgb2gray" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC1. -@sa RGB2YUV - */ -GAPI_EXPORTS_W GMat RGB2Gray(const GMat& src); - -/** @overload -Resulting gray color value computed as -\f[\texttt{dst} (I)= \texttt{rY} * \texttt{src}(I).R + \texttt{gY} * \texttt{src}(I).G + \texttt{bY} * \texttt{src}(I).B \f] - -@note Function textual ID is "org.opencv.imgproc.colorconvert.rgb2graycustom" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC1. -@param rY float multiplier for R channel. -@param gY float multiplier for G channel. -@param bY float multiplier for B channel. -@sa RGB2YUV - */ -GAPI_EXPORTS_W GMat RGB2Gray(const GMat& src, float rY, float gY, float bY); - -/** @brief Converts an image from BGR color space to gray-scaled. - -The conventional ranges for B, G, and R channel values are 0 to 255. -Resulting gray color value computed as -\f[\texttt{dst} (I)= \texttt{0.114} * \texttt{src}(I).B + \texttt{0.587} * \texttt{src}(I).G + \texttt{0.299} * \texttt{src}(I).R \f] - -@note Function textual ID is "org.opencv.imgproc.colorconvert.bgr2gray" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC1. -@sa BGR2LUV - */ -GAPI_EXPORTS_W GMat BGR2Gray(const GMat& src); - -/** @brief Converts an image from RGB color space to YUV color space. - -The function converts an input image from RGB color space to YUV. -The conventional ranges for R, G, and B channel values are 0 to 255. - -In case of linear transformations, the range does not matter. But in case of a non-linear -transformation, an input RGB image should be normalized to the proper value range to get the correct -results, like here, at RGB \f$\rightarrow\f$ Y\*u\*v\* transformation. -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.rgb2yuv" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@sa YUV2RGB, RGB2Lab -*/ -GAPI_EXPORTS_W GMat RGB2YUV(const GMat& src); - -/** @brief Converts an image from BGR color space to I420 color space. - -The function converts an input image from BGR color space to I420. -The conventional ranges for R, G, and B channel values are 0 to 255. - -Output image must be 8-bit unsigned 1-channel image. @ref CV_8UC1. -Width of I420 output image must be the same as width of input image. -Height of I420 output image must be equal 3/2 from height of input image. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.bgr2i420" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@sa I4202BGR -*/ -GAPI_EXPORTS_W GMat BGR2I420(const GMat& src); - -/** @brief Converts an image from RGB color space to I420 color space. - -The function converts an input image from RGB color space to I420. -The conventional ranges for R, G, and B channel values are 0 to 255. - -Output image must be 8-bit unsigned 1-channel image. @ref CV_8UC1. -Width of I420 output image must be the same as width of input image. -Height of I420 output image must be equal 3/2 from height of input image. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.rgb2i420" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@sa I4202RGB -*/ -GAPI_EXPORTS_W GMat RGB2I420(const GMat& src); - -/** @brief Converts an image from I420 color space to BGR color space. - -The function converts an input image from I420 color space to BGR. -The conventional ranges for B, G, and R channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image. @ref CV_8UC3. -Width of BGR output image must be the same as width of input image. -Height of BGR output image must be equal 2/3 from height of input image. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.i4202bgr" - -@param src input image: 8-bit unsigned 1-channel image @ref CV_8UC1. -@sa BGR2I420 -*/ -GAPI_EXPORTS_W GMat I4202BGR(const GMat& src); - -/** @brief Converts an image from I420 color space to BGR color space. - -The function converts an input image from I420 color space to BGR. -The conventional ranges for B, G, and R channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image. @ref CV_8UC3. -Width of RGB output image must be the same as width of input image. -Height of RGB output image must be equal 2/3 from height of input image. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.i4202rgb" - -@param src input image: 8-bit unsigned 1-channel image @ref CV_8UC1. -@sa RGB2I420 -*/ -GAPI_EXPORTS_W GMat I4202RGB(const GMat& src); - -/** @brief Converts an image from BGR color space to LUV color space. - -The function converts an input image from BGR color space to LUV. -The conventional ranges for B, G, and R channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.bgr2luv" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@sa RGB2Lab, RGB2LUV -*/ -GAPI_EXPORTS_W GMat BGR2LUV(const GMat& src); - -/** @brief Converts an image from LUV color space to BGR color space. - -The function converts an input image from LUV color space to BGR. -The conventional ranges for B, G, and R channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.luv2bgr" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@sa BGR2LUV -*/ -GAPI_EXPORTS_W GMat LUV2BGR(const GMat& src); - -/** @brief Converts an image from YUV color space to BGR color space. - -The function converts an input image from YUV color space to BGR. -The conventional ranges for B, G, and R channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.yuv2bgr" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@sa BGR2YUV -*/ -GAPI_EXPORTS_W GMat YUV2BGR(const GMat& src); - -/** @brief Converts an image from BGR color space to YUV color space. - -The function converts an input image from BGR color space to YUV. -The conventional ranges for B, G, and R channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.bgr2yuv" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@sa YUV2BGR -*/ -GAPI_EXPORTS_W GMat BGR2YUV(const GMat& src); - -/** @brief Converts an image from RGB color space to Lab color space. - -The function converts an input image from BGR color space to Lab. -The conventional ranges for R, G, and B channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC1. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.rgb2lab" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC1. -@sa RGB2YUV, RGB2LUV -*/ -GAPI_EXPORTS_W GMat RGB2Lab(const GMat& src); - -/** @brief Converts an image from YUV color space to RGB. -The function converts an input image from YUV color space to RGB. -The conventional ranges for Y, U, and V channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.yuv2rgb" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. - -@sa RGB2Lab, RGB2YUV -*/ -GAPI_EXPORTS_W GMat YUV2RGB(const GMat& src); - -/** @brief Converts an image from NV12 (YUV420p) color space to RGB. -The function converts an input image from NV12 color space to RGB. -The conventional ranges for Y, U, and V channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.nv12torgb" - -@param src_y input image: 8-bit unsigned 1-channel image @ref CV_8UC1. -@param src_uv input image: 8-bit unsigned 2-channel image @ref CV_8UC2. - -@sa YUV2RGB, NV12toBGR -*/ -GAPI_EXPORTS_W GMat NV12toRGB(const GMat& src_y, const GMat& src_uv); - -/** @brief Converts an image from NV12 (YUV420p) color space to gray-scaled. -The function converts an input image from NV12 color space to gray-scaled. -The conventional ranges for Y, U, and V channel values are 0 to 255. - -Output image must be 8-bit unsigned 1-channel image @ref CV_8UC1. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.nv12togray" - -@param src_y input image: 8-bit unsigned 1-channel image @ref CV_8UC1. -@param src_uv input image: 8-bit unsigned 2-channel image @ref CV_8UC2. - -@sa YUV2RGB, NV12toBGR -*/ -GAPI_EXPORTS_W GMat NV12toGray(const GMat& src_y, const GMat& src_uv); - -/** @brief Converts an image from NV12 (YUV420p) color space to BGR. -The function converts an input image from NV12 color space to RGB. -The conventional ranges for Y, U, and V channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.nv12tobgr" - -@param src_y input image: 8-bit unsigned 1-channel image @ref CV_8UC1. -@param src_uv input image: 8-bit unsigned 2-channel image @ref CV_8UC2. - -@sa YUV2BGR, NV12toRGB -*/ -GAPI_EXPORTS_W GMat NV12toBGR(const GMat& src_y, const GMat& src_uv); - -/** @brief Converts an image from BayerGR color space to RGB. -The function converts an input image from BayerGR color space to RGB. -The conventional ranges for G, R, and B channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.bayergr2rgb" - -@param src_gr input image: 8-bit unsigned 1-channel image @ref CV_8UC1. - -@sa YUV2BGR, NV12toRGB -*/ -GAPI_EXPORTS_W GMat BayerGR2RGB(const GMat& src_gr); - -/** @brief Converts an image from RGB color space to HSV. -The function converts an input image from RGB color space to HSV. -The conventional ranges for R, G, and B channel values are 0 to 255. - -Output image must be 8-bit unsigned 3-channel image @ref CV_8UC3. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.rgb2hsv" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. - -@sa YUV2BGR, NV12toRGB -*/ -GAPI_EXPORTS_W GMat RGB2HSV(const GMat& src); - -/** @brief Converts an image from RGB color space to YUV422. -The function converts an input image from RGB color space to YUV422. -The conventional ranges for R, G, and B channel values are 0 to 255. - -Output image must be 8-bit unsigned 2-channel image @ref CV_8UC2. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.rgb2yuv422" - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3. - -@sa YUV2BGR, NV12toRGB -*/ -GAPI_EXPORTS_W GMat RGB2YUV422(const GMat& src); - -/** @brief Converts an image from NV12 (YUV420p) color space to RGB. -The function converts an input image from NV12 color space to RGB. -The conventional ranges for Y, U, and V channel values are 0 to 255. - -Output image must be 8-bit unsigned planar 3-channel image @ref CV_8UC1. -Planar image memory layout is three planes laying in the memory contiguously, -so the image height should be plane_height*plane_number, -image type is @ref CV_8UC1. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.nv12torgbp" - -@param src_y input image: 8-bit unsigned 1-channel image @ref CV_8UC1. -@param src_uv input image: 8-bit unsigned 2-channel image @ref CV_8UC2. - -@sa YUV2RGB, NV12toBGRp, NV12toRGB -*/ -GAPI_EXPORTS GMatP NV12toRGBp(const GMat &src_y, const GMat &src_uv); - -/** @brief Converts an image from NV12 (YUV420p) color space to BGR. -The function converts an input image from NV12 color space to BGR. -The conventional ranges for Y, U, and V channel values are 0 to 255. - -Output image must be 8-bit unsigned planar 3-channel image @ref CV_8UC1. -Planar image memory layout is three planes laying in the memory contiguously, -so the image height should be plane_height*plane_number, -image type is @ref CV_8UC1. - -@note Function textual ID is "org.opencv.imgproc.colorconvert.nv12torgbp" - -@param src_y input image: 8-bit unsigned 1-channel image @ref CV_8UC1. -@param src_uv input image: 8-bit unsigned 2-channel image @ref CV_8UC2. - -@sa YUV2RGB, NV12toRGBp, NV12toBGR -*/ -GAPI_EXPORTS GMatP NV12toBGRp(const GMat &src_y, const GMat &src_uv); - -//! @} gapi_colorconvert -//! @addtogroup gapi_transform -//! @{ -/** @brief Resizes an image. - -The function resizes the image src down to or up to the specified size. - -Output image size will have the size dsize (when dsize is non-zero) or the size computed from -src.size(), fx, and fy; the depth of output is the same as of src. - -If you want to resize src so that it fits the pre-created dst, -you may call the function as follows: -@code - // explicitly specify dsize=dst.size(); fx and fy will be computed from that. - resize(src, dst, dst.size(), 0, 0, interpolation); -@endcode -If you want to decimate the image by factor of 2 in each direction, you can call the function this -way: -@code - // specify fx and fy and let the function compute the destination image size. - resize(src, dst, Size(), 0.5, 0.5, interpolation); -@endcode -To shrink an image, it will generally look best with cv::INTER_AREA interpolation, whereas to -enlarge an image, it will generally look best with cv::INTER_CUBIC (slow) or cv::INTER_LINEAR -(faster but still looks OK). - -@note Function textual ID is "org.opencv.imgproc.transform.resize" - -@param src input image. -@param dsize output image size; if it equals zero, it is computed as: - \f[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}\f] - Either dsize or both fx and fy must be non-zero. -@param fx scale factor along the horizontal axis; when it equals 0, it is computed as -\f[\texttt{(double)dsize.width/src.cols}\f] -@param fy scale factor along the vertical axis; when it equals 0, it is computed as -\f[\texttt{(double)dsize.height/src.rows}\f] -@param interpolation interpolation method, see cv::InterpolationFlags - -@sa warpAffine, warpPerspective, remap, resizeP - */ -GAPI_EXPORTS_W GMat resize(const GMat& src, const Size& dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR); - -/** @brief Resizes a planar image. - -The function resizes the image src down to or up to the specified size. -Planar image memory layout is three planes laying in the memory contiguously, -so the image height should be plane_height*plane_number, image type is @ref CV_8UC1. - -Output image size will have the size dsize, the depth of output is the same as of src. - -@note Function textual ID is "org.opencv.imgproc.transform.resizeP" - -@param src input image, must be of @ref CV_8UC1 type; -@param dsize output image size; -@param interpolation interpolation method, only cv::INTER_LINEAR is supported at the moment - -@sa warpAffine, warpPerspective, remap, resize - */ -GAPI_EXPORTS GMatP resizeP(const GMatP& src, const Size& dsize, int interpolation = cv::INTER_LINEAR); - -//! @} gapi_transform -} //namespace gapi -} //namespace cv - -#endif // OPENCV_GAPI_IMGPROC_HPP diff --git a/modules/gapi/include/opencv2/gapi/infer.hpp b/modules/gapi/include/opencv2/gapi/infer.hpp deleted file mode 100644 index abbd32ba20..0000000000 --- a/modules/gapi/include/opencv2/gapi/infer.hpp +++ /dev/null @@ -1,717 +0,0 @@ -// 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. -// -// Copyright (C) 2019-2021 Intel Corporation - - -#ifndef OPENCV_GAPI_INFER_HPP -#define OPENCV_GAPI_INFER_HPP - -// FIXME: Inference API is currently only available in full mode -#if !defined(GAPI_STANDALONE) - -#include -#include // string -#include // tuple -#include // is_same, false_type - -#include // all_satisfy -#include // any<> -#include // GKernelType[M], GBackend -#include // GArg -#include // CompileArgTag -#include // GMetaArg - -namespace cv { - -template class GNetworkType; - -namespace detail { - -// Infer /////////////////////////////////////////////////////////////////////// -template -struct accepted_infer_types { - static constexpr const auto value = - std::is_same::type, cv::GMat>::value - || std::is_same::type, cv::GFrame>::value; -}; - -template -using valid_infer_types = all_satisfy; - -// Infer2 ////////////////////////////////////////////////////////////////////// - -template -struct valid_infer2_types; - -// Terminal case 1 (50/50 success) -template -struct valid_infer2_types< std::tuple, std::tuple > { - // By default, Nets are limited to GMat argument types only - // for infer2, every GMat argument may translate to either - // GArray or GArray. GArray<> part is stripped - // already at this point. - static constexpr const auto value = - std::is_same::type, cv::GMat>::value - || std::is_same::type, cv::Rect>::value; -}; - -// Terminal case 2 (100% failure) -template -struct valid_infer2_types< std::tuple<>, std::tuple > - : public std::false_type { -}; - -// Terminal case 3 (100% failure) -template -struct valid_infer2_types< std::tuple, std::tuple<> > - : public std::false_type { -}; - -// Recursion -- generic -template -struct valid_infer2_types< std::tuple, std::tuple > { - static constexpr const auto value = - valid_infer2_types< std::tuple, std::tuple >::value - && valid_infer2_types< std::tuple, std::tuple >::value; -}; - -// Struct stores network input/output names. -// Used by infer -struct InOutInfo -{ - std::vector in_names; - std::vector out_names; -}; - -template -class GInferOutputsTyped -{ -public: - GInferOutputsTyped() = default; - GInferOutputsTyped(std::shared_ptr call) - : m_priv(std::make_shared(std::move(call))) - { - } - - OutT at(const std::string& name) - { - auto it = m_priv->blobs.find(name); - if (it == m_priv->blobs.end()) { - // FIXME: Avoid modifying GKernel - auto shape = cv::detail::GTypeTraits::shape; - auto kind = cv::detail::GTypeTraits::op_kind; - m_priv->call->kernel().outShapes.push_back(shape); - m_priv->call->kernel().outCtors.emplace_back(cv::detail::GObtainCtor::get()); - m_priv->call->kernel().outKinds.emplace_back(kind); - auto out_idx = static_cast(m_priv->blobs.size()); - it = m_priv->blobs.emplace(name, - cv::detail::Yield::yield(*(m_priv->call), out_idx)).first; - m_priv->info->out_names.push_back(name); - } - return it->second; - } -private: - struct Priv - { - Priv(std::shared_ptr c) - : call(std::move(c)), info(cv::util::any_cast(&call->params())) - { - } - - std::shared_ptr call; - InOutInfo* info = nullptr; - std::unordered_map blobs; - }; - - std::shared_ptr m_priv; -}; - -template -class GInferInputsTyped -{ -public: - GInferInputsTyped() - : m_priv(std::make_shared()) - { - } - - template - GInferInputsTyped& setInput(const std::string& name, U in) - { - m_priv->blobs.emplace(std::piecewise_construct, - std::forward_as_tuple(name), - std::forward_as_tuple(in)); - return *this; - } - - using StorageT = cv::util::variant; - StorageT& operator[](const std::string& name) { - return m_priv->blobs[name]; - } - - using Map = std::unordered_map; - const Map& getBlobs() const { - return m_priv->blobs; - } - -private: - struct Priv - { - std::unordered_map blobs; - }; - - std::shared_ptr m_priv; -}; - -template -std::shared_ptr makeCall(const std::string &tag, - std::vector &&args, - std::vector &&names, - cv::GKinds &&kinds) { - auto call = std::make_shared(GKernel{ - InferT::id(), - tag, - InferT::getOutMeta, - {}, // outShape will be filled later - std::move(kinds), - {}, // outCtors will be filled later - {}, // outKinds will be filled later - }); - - call->setArgs(std::move(args)); - call->params() = cv::detail::InOutInfo{std::move(names), {}}; - - return call; -} - -} // namespace detail - -// TODO: maybe tuple_wrap_helper from util.hpp may help with this. -// Multiple-return-value network definition (specialized base class) -template -class GNetworkType(Args...)> > -{ -public: - using InArgs = std::tuple; - using OutArgs = std::tuple; - - using Result = OutArgs; - using API = std::function; - - using ResultL = std::tuple< cv::GArray... >; -}; - -// Single-return-value network definition (specialized base class) -template -class GNetworkType > -{ -public: - using InArgs = std::tuple; - using OutArgs = std::tuple; - - using Result = R; - using API = std::function; - - using ResultL = cv::GArray; -}; - -// InferAPI: Accepts either GMat or GFrame for very individual network's input -template -struct InferAPI { - using type = typename std::enable_if - < detail::valid_infer_types::value - && std::tuple_size::value == sizeof...(Ts) - , std::function - >::type; -}; - -// InferAPIRoi: Accepts a rectangle and either GMat or GFrame -template -struct InferAPIRoi { - using type = typename std::enable_if - < detail::valid_infer_types::value - && std::tuple_size::value == 1u - , std::function, T)> - >::type; -}; - -// InferAPIList: Accepts a list of rectangles and list of GMat/GFrames; -// crops every input. -template -struct InferAPIList { - using type = typename std::enable_if - < detail::valid_infer_types::value - && std::tuple_size::value == sizeof...(Ts) - , std::function, Ts...)> - >::type; -}; - -// APIList2 is also template to allow different calling options -// (GArray vs GArray per input) -template -struct InferAPIList2 { - using type = typename std::enable_if - < detail::valid_infer_types::value && - cv::detail::valid_infer2_types< typename Net::InArgs - , std::tuple >::value, - std::function...)> - >::type; -}; - -// Base "Infer" kernel. Note - for whatever network, kernel ID -// is always the same. Different inference calls are distinguished by -// network _tag_ (an extra field in GCall) -// -// getOutMeta is a stub callback collected by G-API kernel subsystem -// automatically. This is a rare case when this callback is defined by -// a particular backend, not by a network itself. -struct GInferBase { - static constexpr const char * id() { - return "org.opencv.dnn.infer"; // Universal stub - } - static GMetaArgs getOutMeta(const GMetaArgs &, const GArgs &) { - return GMetaArgs{}; // One more universal stub - } -}; - -// Base "InferROI" kernel. -// All notes from "Infer" kernel apply here as well. -struct GInferROIBase { - static constexpr const char * id() { - return "org.opencv.dnn.infer-roi"; // Universal stub - } - static GMetaArgs getOutMeta(const GMetaArgs &, const GArgs &) { - return GMetaArgs{}; // One more universal stub - } -}; - -// Base "Infer list" kernel. -// All notes from "Infer" kernel apply here as well. -struct GInferListBase { - static constexpr const char * id() { - return "org.opencv.dnn.infer-roi-list-1"; // Universal stub - } - static GMetaArgs getOutMeta(const GMetaArgs &, const GArgs &) { - return GMetaArgs{}; // One more universal stub - } -}; - -// Base "Infer list 2" kernel. -// All notes from "Infer" kernel apply here as well. -struct GInferList2Base { - static constexpr const char * id() { - return "org.opencv.dnn.infer-roi-list-2"; // Universal stub - } - static GMetaArgs getOutMeta(const GMetaArgs &, const GArgs &) { - return GMetaArgs{}; // One more universal stub - } -}; - -// A generic inference kernel. API (::on()) is fully defined by the Net -// template parameter. -// Acts as a regular kernel in graph (via KernelTypeMedium). -template -struct GInfer final - : public GInferBase - , public detail::KernelTypeMedium< GInfer - , typename InferAPI::type > { - using GInferBase::getOutMeta; // FIXME: name lookup conflict workaround? - - static constexpr const char* tag() { return Net::tag(); } -}; - -// A specific roi-inference kernel. API (::on()) is fixed here and -// verified against Net. -template -struct GInferROI final - : public GInferROIBase - , public detail::KernelTypeMedium< GInferROI - , typename InferAPIRoi::type > { - using GInferROIBase::getOutMeta; // FIXME: name lookup conflict workaround? - - static constexpr const char* tag() { return Net::tag(); } -}; - - -// A generic roi-list inference kernel. API (::on()) is derived from -// the Net template parameter (see more in infer<> overload). -template -struct GInferList final - : public GInferListBase - , public detail::KernelTypeMedium< GInferList - , typename InferAPIList::type > { - using GInferListBase::getOutMeta; // FIXME: name lookup conflict workaround? - - static constexpr const char* tag() { return Net::tag(); } -}; - -// An even more generic roi-list inference kernel. API (::on()) is -// derived from the Net template parameter (see more in infer<> -// overload). -// Takes an extra variadic template list to reflect how this network -// was called (with Rects or GMats as array parameters) -template -struct GInferList2 final - : public GInferList2Base - , public detail::KernelTypeMedium< GInferList2 - , typename InferAPIList2::type > { - using GInferList2Base::getOutMeta; // FIXME: name lookup conflict workaround? - - static constexpr const char* tag() { return Net::tag(); } -}; - -/** - * @brief G-API object used to collect network inputs - */ -using GInferInputs = cv::detail::GInferInputsTyped; - -/** - * @brief G-API object used to collect the list of network inputs - */ -using GInferListInputs = cv::detail::GInferInputsTyped, cv::GArray>; - -/** - * @brief G-API object used to collect network outputs - */ -using GInferOutputs = cv::detail::GInferOutputsTyped; - -/** - * @brief G-API object used to collect the list of network outputs - */ -using GInferListOutputs = cv::detail::GInferOutputsTyped>; - -namespace detail { -void inline unpackBlobs(const cv::GInferInputs::Map& blobs, - std::vector& args, - std::vector& names, - cv::GKinds& kinds) -{ - for (auto&& p : blobs) { - names.emplace_back(p.first); - switch (p.second.index()) { - case cv::GInferInputs::StorageT::index_of(): - args.emplace_back(cv::util::get(p.second)); - kinds.emplace_back(cv::detail::OpaqueKind::CV_MAT); - break; - case cv::GInferInputs::StorageT::index_of(): - args.emplace_back(cv::util::get(p.second)); - kinds.emplace_back(cv::detail::OpaqueKind::CV_UNKNOWN); - break; - default: - GAPI_Error("InternalError"); - } - } -} - -template -struct InferROITraits; - -template <> -struct InferROITraits -{ - using outType = cv::GInferOutputs; - using inType = cv::GOpaque; -}; - -template <> -struct InferROITraits -{ - using outType = cv::GInferListOutputs; - using inType = cv::GArray; -}; - -template -typename InferROITraits::outType -inferGenericROI(const std::string& tag, - const typename InferROITraits::inType& in, - const cv::GInferInputs& inputs) -{ - std::vector args; - std::vector names; - cv::GKinds kinds; - - args.emplace_back(in); - kinds.emplace_back(cv::detail::OpaqueKind::CV_RECT); - - unpackBlobs(inputs.getBlobs(), args, names, kinds); - - auto call = cv::detail::makeCall(tag, - std::move(args), - std::move(names), - std::move(kinds)); - - return {std::move(call)}; -} - -} // namespace detail -} // namespace cv - -// FIXME: Probably the signature makes a function/tuple/function round-trip -#define G_API_NET(Class, API, Tag) \ - struct Class final: public cv::GNetworkType { \ - static constexpr const char * tag() { return Tag; } \ - } - -namespace cv { -namespace gapi { - -/** @brief Calculates response for the specified network (template - * parameter) for the specified region in the source image. - * Currently expects a single-input network only. - * - * @tparam A network type defined with G_API_NET() macro. - * @param in input image where to take ROI from. - * @param roi an object describing the region of interest - * in the source image. May be calculated in the same graph dynamically. - * @return an object of return type as defined in G_API_NET(). - * If a network has multiple return values (defined with a tuple), a tuple of - * objects of appropriate type is returned. - * @sa G_API_NET() - */ -template -typename Net::Result infer(cv::GOpaque roi, T in) { - return GInferROI::on(roi, in); -} - -/** @brief Calculates responses for the specified network (template - * parameter) for every region in the source image. - * - * @tparam A network type defined with G_API_NET() macro. - * @param roi a list of rectangles describing regions of interest - * in the source image. Usually an output of object detector or tracker. - * @param args network's input parameters as specified in G_API_NET() macro. - * NOTE: verified to work reliably with 1-input topologies only. - * @return a list of objects of return type as defined in G_API_NET(). - * If a network has multiple return values (defined with a tuple), a tuple of - * GArray<> objects is returned with the appropriate types inside. - * @sa G_API_NET() - */ -template -typename Net::ResultL infer(cv::GArray roi, Args&&... args) { - return GInferList::on(roi, std::forward(args)...); -} - -/** @brief Calculates responses for the specified network (template - * parameter) for every region in the source image, extended version. - * - * @tparam A network type defined with G_API_NET() macro. - * @param image A source image containing regions of interest - * @param args GArray<> objects of cv::Rect or cv::GMat, one per every - * network input: - * - If a cv::GArray is passed, the appropriate - * regions are taken from `image` and preprocessed to this particular - * network input; - * - If a cv::GArray is passed, the underlying data traited - * as tensor (no automatic preprocessing happen). - * @return a list of objects of return type as defined in G_API_NET(). - * If a network has multiple return values (defined with a tuple), a tuple of - * GArray<> objects is returned with the appropriate types inside. - * @sa G_API_NET() - */ - -template -typename Net::ResultL infer2(T image, cv::GArray... args) { - // FIXME: Declared as "2" because in the current form it steals - // overloads from the regular infer - return GInferList2::on(image, args...); -} - -/** - * @brief Calculates response for the specified network (template - * parameter) given the input data. - * - * @tparam A network type defined with G_API_NET() macro. - * @param args network's input parameters as specified in G_API_NET() macro. - * @return an object of return type as defined in G_API_NET(). - * If a network has multiple return values (defined with a tuple), a tuple of - * objects of appropriate type is returned. - * @sa G_API_NET() - */ -template -typename Net::Result infer(Args&&... args) { - return GInfer::on(std::forward(args)...); -} - -/** - * @brief Generic network type: input and output layers are configured dynamically at runtime - * - * Unlike the network types defined with G_API_NET macro, this one - * doesn't fix number of network inputs and outputs at the compilation stage - * thus providing user with an opportunity to program them in runtime. - */ -struct Generic { }; - -/** - * @brief Calculates response for generic network - * - * @param tag a network tag - * @param inputs networks's inputs - * @return a GInferOutputs - */ -template cv::GInferOutputs -infer(const std::string& tag, const cv::GInferInputs& inputs) -{ - std::vector args; - std::vector names; - cv::GKinds kinds; - - cv::detail::unpackBlobs(inputs.getBlobs(), args, names, kinds); - - auto call = cv::detail::makeCall(tag, - std::move(args), - std::move(names), - std::move(kinds)); - - return cv::GInferOutputs{std::move(call)}; -} - -/** @brief Calculates response for the generic network - * for the specified region in the source image. - * Currently expects a single-input network only. - * - * @param tag a network tag - * @param roi a an object describing the region of interest - * in the source image. May be calculated in the same graph dynamically. - * @param inputs networks's inputs - * @return a cv::GInferOutputs - */ -template cv::GInferOutputs -infer(const std::string& tag, const cv::GOpaque& roi, const cv::GInferInputs& inputs) -{ - return cv::detail::inferGenericROI(tag, roi, inputs); -} - -/** @brief Calculates responses for the specified network - * for every region in the source image. - * - * @param tag a network tag - * @param rois a list of rectangles describing regions of interest - * in the source image. Usually an output of object detector or tracker. - * @param inputs networks's inputs - * @return a cv::GInferListOutputs - */ -template cv::GInferListOutputs -infer(const std::string& tag, const cv::GArray& rois, const cv::GInferInputs& inputs) -{ - return cv::detail::inferGenericROI(tag, rois, inputs); -} - -/** @brief Calculates responses for the specified network - * for every region in the source image, extended version. - * - * @param tag a network tag - * @param in a source image containing regions of interest. - * @param inputs networks's inputs - * @return a cv::GInferListOutputs - */ -template -typename std::enable_if::value, cv::GInferListOutputs>::type -infer2(const std::string& tag, - const Input& in, - const cv::GInferListInputs& inputs) -{ - std::vector args; - std::vector names; - cv::GKinds kinds; - - args.emplace_back(in); - auto k = cv::detail::GOpaqueTraits::kind; - kinds.emplace_back(k); - - for (auto&& p : inputs.getBlobs()) { - names.emplace_back(p.first); - switch (p.second.index()) { - case cv::GInferListInputs::StorageT::index_of>(): - args.emplace_back(cv::util::get>(p.second)); - kinds.emplace_back(cv::detail::OpaqueKind::CV_MAT); - break; - case cv::GInferListInputs::StorageT::index_of>(): - args.emplace_back(cv::util::get>(p.second)); - kinds.emplace_back(cv::detail::OpaqueKind::CV_RECT); - break; - default: - GAPI_Error("InternalError"); - } - } - - auto call = cv::detail::makeCall(tag, - std::move(args), - std::move(names), - std::move(kinds)); - - return cv::GInferListOutputs{std::move(call)}; -} - -} // namespace gapi -} // namespace cv - -#endif // GAPI_STANDALONE - -namespace cv { -namespace gapi { - -// Note: the below code _is_ part of STANDALONE build, -// just to make our compiler code compileable. - -// A type-erased form of network parameters. -// Similar to how a type-erased GKernel is represented and used. -/// @private -struct GAPI_EXPORTS_W_SIMPLE GNetParam { - std::string tag; // FIXME: const? - GBackend backend; // Specifies the execution model - util::any params; // Backend-interpreted parameter structure -}; - -/** \addtogroup gapi_compile_args - * @{ - */ -/** - * @brief A container class for network configurations. Similar to - * GKernelPackage. Use cv::gapi::networks() to construct this object. - * - * @sa cv::gapi::networks - */ -struct GAPI_EXPORTS_W_SIMPLE GNetPackage { - GAPI_WRAP GNetPackage() = default; - GAPI_WRAP explicit GNetPackage(std::vector nets); - explicit GNetPackage(std::initializer_list ii); - std::vector backends() const; - std::vector networks; -}; -/** @} gapi_compile_args */ -} // namespace gapi - -namespace detail { -template -gapi::GNetParam strip(T&& t) { - return gapi::GNetParam { t.tag() - , t.backend() - , t.params() - }; -} - -template<> struct CompileArgTag { - static const char* tag() { return "gapi.net_package"; } -}; - -} // namespace cv::detail - -namespace gapi { -template -cv::gapi::GNetPackage networks(Args&&... args) { - return cv::gapi::GNetPackage({ cv::detail::strip(args)... }); -} - -inline cv::gapi::GNetPackage& operator += ( cv::gapi::GNetPackage& lhs, - const cv::gapi::GNetPackage& rhs) { - lhs.networks.reserve(lhs.networks.size() + rhs.networks.size()); - lhs.networks.insert(lhs.networks.end(), rhs.networks.begin(), rhs.networks.end()); - return lhs; -} - -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_INFER_HPP diff --git a/modules/gapi/include/opencv2/gapi/infer/bindings_ie.hpp b/modules/gapi/include/opencv2/gapi/infer/bindings_ie.hpp deleted file mode 100644 index 94272dea55..0000000000 --- a/modules/gapi/include/opencv2/gapi/infer/bindings_ie.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - -#ifndef OPENCV_GAPI_INFER_BINDINGS_IE_HPP -#define OPENCV_GAPI_INFER_BINDINGS_IE_HPP - -#include -#include "opencv2/gapi/own/exports.hpp" // GAPI_EXPORTS -#include // GKernelPackage -#include // Params - -#include - -namespace cv { -namespace gapi { -namespace ie { - -// NB: Used by python wrapper -// This class can be marked as SIMPLE, because it's implemented as pimpl -class GAPI_EXPORTS_W_SIMPLE PyParams { -public: - GAPI_WRAP - PyParams() = default; - - GAPI_WRAP - PyParams(const std::string &tag, - const std::string &model, - const std::string &weights, - const std::string &device); - - GAPI_WRAP - PyParams(const std::string &tag, - const std::string &model, - const std::string &device); - - GAPI_WRAP - PyParams& constInput(const std::string &layer_name, - const cv::Mat &data, - TraitAs hint = TraitAs::TENSOR); - - GAPI_WRAP - PyParams& cfgNumRequests(size_t nireq); - - GAPI_WRAP - PyParams& cfgBatchSize(const size_t size); - - GBackend backend() const; - std::string tag() const; - cv::util::any params() const; - -private: - std::shared_ptr> m_priv; -}; - -GAPI_EXPORTS_W PyParams params(const std::string &tag, - const std::string &model, - const std::string &weights, - const std::string &device); - -GAPI_EXPORTS_W PyParams params(const std::string &tag, - const std::string &model, - const std::string &device); -} // namespace ie -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_INFER_BINDINGS_IE_HPP diff --git a/modules/gapi/include/opencv2/gapi/infer/bindings_onnx.hpp b/modules/gapi/include/opencv2/gapi/infer/bindings_onnx.hpp deleted file mode 100644 index f7bb259924..0000000000 --- a/modules/gapi/include/opencv2/gapi/infer/bindings_onnx.hpp +++ /dev/null @@ -1,74 +0,0 @@ -// 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_GAPI_INFER_BINDINGS_ONNX_HPP -#define OPENCV_GAPI_INFER_BINDINGS_ONNX_HPP - -#include // GKernelPackage -#include // Params -#include "opencv2/gapi/own/exports.hpp" // GAPI_EXPORTS -#include - -#include - -namespace cv { -namespace gapi { -namespace onnx { - -// NB: Used by python wrapper -// This class can be marked as SIMPLE, because it's implemented as pimpl -class GAPI_EXPORTS_W_SIMPLE PyParams { -public: - GAPI_WRAP - PyParams() = default; - - GAPI_WRAP - PyParams(const std::string& tag, const std::string& model_path); - - GAPI_WRAP - PyParams& cfgMeanStd(const std::string &layer_name, - const cv::Scalar &m, - const cv::Scalar &s); - GAPI_WRAP - PyParams& cfgNormalize(const std::string &layer_name, bool flag); - - GAPI_WRAP - PyParams& cfgAddExecutionProvider(ep::OpenVINO ep); - - GAPI_WRAP - PyParams& cfgAddExecutionProvider(ep::DirectML ep); - - GAPI_WRAP - PyParams& cfgAddExecutionProvider(ep::CoreML ep); - - GAPI_WRAP - PyParams& cfgAddExecutionProvider(ep::CUDA ep); - - GAPI_WRAP - PyParams& cfgAddExecutionProvider(ep::TensorRT ep); - - GAPI_WRAP - PyParams& cfgDisableMemPattern(); - - GAPI_WRAP - PyParams& cfgSessionOptions(const std::map& options); - - GAPI_WRAP - PyParams& cfgOptLevel(const int opt_level); - - GBackend backend() const; - std::string tag() const; - cv::util::any params() const; - -private: - std::shared_ptr> m_priv; -}; - -GAPI_EXPORTS_W PyParams params(const std::string& tag, const std::string& model_path); - -} // namespace onnx -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_INFER_BINDINGS_ONNX_HPP diff --git a/modules/gapi/include/opencv2/gapi/infer/bindings_ov.hpp b/modules/gapi/include/opencv2/gapi/infer/bindings_ov.hpp deleted file mode 100644 index 08f5c83a3f..0000000000 --- a/modules/gapi/include/opencv2/gapi/infer/bindings_ov.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// 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. -// -// Copyright (C) 2023 Intel Corporation - -#ifndef OPENCV_GAPI_INFER_BINDINGS_OV_HPP -#define OPENCV_GAPI_INFER_BINDINGS_OV_HPP - -#include -#include "opencv2/gapi/own/exports.hpp" // GAPI_EXPORTS -#include // GKernelPackage -#include // Params - -#include - -namespace cv { -namespace gapi { -namespace ov { - -// NB: Used by python wrapper -// This class can be marked as SIMPLE, because it's implemented as pimpl -class GAPI_EXPORTS_W_SIMPLE PyParams { -public: - GAPI_WRAP - PyParams() = default; - - GAPI_WRAP - PyParams(const std::string &tag, - const std::string &model_path, - const std::string &bin_path, - const std::string &device); - - GAPI_WRAP - PyParams(const std::string &tag, - const std::string &blob_path, - const std::string &device); - - GAPI_WRAP - PyParams& cfgPluginConfig( - const std::map &config); - - GAPI_WRAP - PyParams& cfgInputTensorLayout(std::string tensor_layout); - - GAPI_WRAP - PyParams& cfgInputTensorLayout( - std::map layout_map); - - GAPI_WRAP - PyParams& cfgInputModelLayout(std::string tensor_layout); - - GAPI_WRAP - PyParams& cfgInputModelLayout( - std::map layout_map); - - GAPI_WRAP - PyParams& cfgOutputTensorLayout(std::string tensor_layout); - - GAPI_WRAP - PyParams& cfgOutputTensorLayout( - std::map layout_map); - - GAPI_WRAP - PyParams& cfgOutputModelLayout(std::string tensor_layout); - - GAPI_WRAP - PyParams& cfgOutputModelLayout( - std::map layout_map); - - GAPI_WRAP - PyParams& cfgOutputTensorPrecision(int precision); - - GAPI_WRAP - PyParams& cfgOutputTensorPrecision( - std::map precision_map); - - GAPI_WRAP - PyParams& cfgReshape(std::vector new_shape); - - GAPI_WRAP - PyParams& cfgReshape( - std::map> new_shape_map); - - GAPI_WRAP - PyParams& cfgNumRequests(const size_t nireq); - - GAPI_WRAP - PyParams& cfgMean(std::vector mean_values); - - GAPI_WRAP - PyParams& cfgMean( - std::map> mean_map); - - GAPI_WRAP - PyParams& cfgScale(std::vector scale_values); - - GAPI_WRAP - PyParams& cfgScale( - std::map> scale_map); - - GAPI_WRAP - PyParams& cfgResize(int interpolation); - - GAPI_WRAP - PyParams& cfgResize(std::map interpolation); - - GBackend backend() const; - std::string tag() const; - cv::util::any params() const; - -private: - std::shared_ptr> m_priv; -}; - -GAPI_EXPORTS_W PyParams params(const std::string &tag, - const std::string &model_path, - const std::string &weights, - const std::string &device); - -GAPI_EXPORTS_W PyParams params(const std::string &tag, - const std::string &bin_path, - const std::string &device); -} // namespace ov -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_INFER_BINDINGS_OV_HPP diff --git a/modules/gapi/include/opencv2/gapi/infer/ie.hpp b/modules/gapi/include/opencv2/gapi/infer/ie.hpp deleted file mode 100644 index 9f9518d0b8..0000000000 --- a/modules/gapi/include/opencv2/gapi/infer/ie.hpp +++ /dev/null @@ -1,711 +0,0 @@ -// 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. -// -// Copyright (C) 2019-2023 Intel Corporation - -#ifndef OPENCV_GAPI_INFER_IE_HPP -#define OPENCV_GAPI_INFER_IE_HPP - -#include -#include -#include -#include -#include // tuple, tuple_size -#include - -#include -#include - -#include // GAPI_EXPORTS -#include // GKernelPackage -#include // Generic -#include // Preproc Dev & Ctx - -namespace cv { -namespace gapi { -// FIXME: introduce a new sub-namespace for NN? - -/** - * @brief This namespace contains G-API OpenVINO backend functions, - * structures, and symbols. - */ -namespace ie { - -GAPI_EXPORTS cv::gapi::GBackend backend(); - -/** - * Specifies how G-API and IE should trait input data - * - * In OpenCV, the same cv::Mat is used to represent both - * image and tensor data. Sometimes those are hardly distinguishable, - * so this extra parameter is used to give G-API a hint. - * - * This hint controls how G-API reinterprets the data when converting - * it to IE Blob format (and which layout/etc is assigned to this data). - */ -enum class TraitAs: int -{ - TENSOR, //!< G-API traits an associated cv::Mat as a raw tensor and passes dimensions as-is - IMAGE //!< G-API traits an associated cv::Mat as an image so creates an "image" blob (NCHW/NHWC, etc) -}; - -using IEConfig = std::map; - -enum InferMode {Sync, Async}; - -namespace detail { - -template -using AttrMap = std::map; -// NB: This type is used to hold in/out layers -// attributes such as precision, layout, shape etc. -// -// User can provide attributes either: -// 1. cv::util::monostate - No value specified explicitly. -// 2. Attr - value specified explicitly that should be broadcasted to all layers. -// 3. AttrMap[str->T] - map specifies value for particular layer. -template -using LayerVariantAttr = cv::util::variant< cv::util::monostate - , AttrMap - , Attr>; - -struct ParamDesc { - std::string model_path; - std::string weights_path; - std::string device_id; - - std::vector input_names; - std::vector output_names; - - using ConstInput = std::pair; - std::unordered_map const_inputs; - - std::size_t num_in; - std::size_t num_out; - - enum class Kind {Load, Import}; - Kind kind; - bool is_generic; - IEConfig config; - - std::map> reshape_table; - std::unordered_set layer_names_to_reshape; - - // NB: Number of asyncrhonious infer requests - size_t nireq; - - // NB: An optional config to setup RemoteContext for IE - cv::util::any context_config; - - // NB: batch_size can't be equal to 1 by default, because some of models - // have 2D (Layout::NC) input and if the first dimension not equal to 1 - // net.setBatchSize(1) will overwrite it. - cv::optional batch_size; - - cv::optional vpl_preproc_device; - cv::optional vpl_preproc_ctx; - - InferMode mode; - - using PrecisionT = int; - using PrecisionMapT = std::unordered_map; - // NB: This parameter can contain: - // 1. cv::util::monostate - Don't specify precision, but use default from IR/Blob. - // 2. PrecisionT (CV_8U, CV_32F, ...) - Specifies precision for all output layers. - // 3. PrecisionMapT ({{"layer0", CV_32F}, {"layer1", CV_16F}} - Specifies precision for certain output layer. - // cv::util::monostate is default value that means precision wasn't specified. - using PrecisionVariantT = cv::util::variant; - - PrecisionVariantT output_precision; - LayerVariantAttr input_layout; - LayerVariantAttr output_layout; - LayerVariantAttr interpolation; -}; -} // namespace detail - -// FIXME: this is probably a shared (reusable) thing -template -struct PortCfg { - using In = std::array - < std::string - , std::tuple_size::value >; - using Out = std::array - < std::string - , std::tuple_size::value >; -}; - -/** - * @brief This structure provides functions - * that fill inference parameters for "OpenVINO Toolkit" model. - */ -template class Params { -public: - /** @brief Class constructor. - - Constructs Params based on model information and specifies default values for other - inference description parameters. Model is loaded and compiled using "OpenVINO Toolkit". - - @param model Path to topology IR (.xml file). - @param weights Path to weights (.bin file). - @param device target device to use. - */ - Params(const std::string &model, - const std::string &weights, - const std::string &device) - : desc{ model, weights, device, {}, {}, {} - , std::tuple_size::value // num_in - , std::tuple_size::value // num_out - , detail::ParamDesc::Kind::Load - , false - , {} - , {} - , {} - , 1u - , {} - , {} - , {} - , {} - , InferMode::Async - , {} - , {} - , {} - , {} } { - } - - /** @overload - Use this constructor to work with pre-compiled network. - Model is imported from a pre-compiled blob. - - @param model Path to model. - @param device target device to use. - */ - Params(const std::string &model, - const std::string &device) - : desc{ model, {}, device, {}, {}, {} - , std::tuple_size::value // num_in - , std::tuple_size::value // num_out - , detail::ParamDesc::Kind::Import - , false - , {} - , {} - , {} - , 1u - , {} - , {} - , {} - , {} - , InferMode::Async - , {} - , {} - , {} - , {} } { - } - - /** @brief Specifies sequence of network input layers names for inference. - - The function is used to associate cv::gapi::infer<> inputs with the model inputs. - Number of names has to match the number of network inputs as defined in G_API_NET(). - In case a network has only single input layer, there is no need to specify name manually. - - @param layer_names std::array where N is the number of inputs - as defined in the @ref G_API_NET. Contains names of input layers. - @return reference to this parameter structure. - */ - Params& cfgInputLayers(const typename PortCfg::In &layer_names) { - desc.input_names.clear(); - desc.input_names.reserve(layer_names.size()); - std::copy(layer_names.begin(), layer_names.end(), - std::back_inserter(desc.input_names)); - return *this; - } - - /** @brief Specifies sequence of network output layers names for inference. - - The function is used to associate cv::gapi::infer<> outputs with the model outputs. - Number of names has to match the number of network outputs as defined in G_API_NET(). - In case a network has only single output layer, there is no need to specify name manually. - - @param layer_names std::array where N is the number of outputs - as defined in the @ref G_API_NET. Contains names of output layers. - @return reference to this parameter structure. - */ - Params& cfgOutputLayers(const typename PortCfg::Out &layer_names) { - desc.output_names.clear(); - desc.output_names.reserve(layer_names.size()); - std::copy(layer_names.begin(), layer_names.end(), - std::back_inserter(desc.output_names)); - return *this; - } - - /** @brief Specifies a constant input. - - The function is used to set a constant input. This input has to be - a preprocessed tensor if its type is TENSOR. Need to provide name of the - network layer which will receive provided data. - - @param layer_name Name of network layer. - @param data cv::Mat that contains data which will be associated with network layer. - @param hint Input type @sa cv::gapi::ie::TraitAs. - @return reference to this parameter structure. - */ - Params& constInput(const std::string &layer_name, - const cv::Mat &data, - TraitAs hint = TraitAs::TENSOR) { - desc.const_inputs[layer_name] = {data, hint}; - return *this; - } - - /** @brief Specifies OpenVINO plugin configuration. - - The function is used to set configuration for OpenVINO plugin. Some parameters - can be different for each plugin. Please follow https://docs.openvinotoolkit.org/latest/index.html - to check information about specific plugin. - - @param cfg Map of pairs: (config parameter name, config parameter value). - @return reference to this parameter structure. - */ - Params& pluginConfig(const IEConfig& cfg) { - desc.config = cfg; - return *this; - } - - /** @overload - Function with a rvalue parameter. - - @param cfg rvalue map of pairs: (config parameter name, config parameter value). - @return reference to this parameter structure. - */ - Params& pluginConfig(IEConfig&& cfg) { - desc.config = std::move(cfg); - return *this; - } - - /** @brief Specifies configuration for RemoteContext in InferenceEngine. - - When RemoteContext is configured the backend imports the networks using the context. - It also expects cv::MediaFrames to be actually remote, to operate with blobs via the context. - - @param ctx_cfg cv::util::any value which holds InferenceEngine::ParamMap. - @return reference to this parameter structure. - */ - Params& cfgContextParams(const cv::util::any& ctx_cfg) { - desc.context_config = ctx_cfg; - return *this; - } - - /** @overload - Function with an rvalue parameter. - - @param ctx_cfg cv::util::any value which holds InferenceEngine::ParamMap. - @return reference to this parameter structure. - */ - Params& cfgContextParams(cv::util::any&& ctx_cfg) { - desc.context_config = std::move(ctx_cfg); - return *this; - } - - /** @brief Specifies number of asynchronous inference requests. - - @param nireq Number of inference asynchronous requests. - @return reference to this parameter structure. - */ - Params& cfgNumRequests(size_t nireq) { - GAPI_Assert(nireq > 0 && "Number of infer requests must be greater than zero!"); - desc.nireq = nireq; - return *this; - } - - /** @brief Specifies new input shapes for the network inputs. - - The function is used to specify new input shapes for the network inputs. - Follow https://docs.openvinotoolkit.org/latest/classInferenceEngine_1_1networkNetwork.html - for additional information. - - @param reshape_table Map of pairs: name of corresponding data and its dimension. - @return reference to this parameter structure. - */ - Params& cfgInputReshape(const std::map>& reshape_table) { - desc.reshape_table = reshape_table; - return *this; - } - - /** @overload */ - Params& cfgInputReshape(std::map>&& reshape_table) { - desc.reshape_table = std::move(reshape_table); - return *this; - } - - /** @overload - - @param layer_name Name of layer. - @param layer_dims New dimensions for this layer. - @return reference to this parameter structure. - */ - Params& cfgInputReshape(const std::string& layer_name, const std::vector& layer_dims) { - desc.reshape_table.emplace(layer_name, layer_dims); - return *this; - } - - /** @overload */ - Params& cfgInputReshape(std::string&& layer_name, std::vector&& layer_dims) { - desc.reshape_table.emplace(layer_name, layer_dims); - return *this; - } - - /** @overload - - @param layer_names set of names of network layers that will be used for network reshape. - @return reference to this parameter structure. - */ - Params& cfgInputReshape(const std::unordered_set& layer_names) { - desc.layer_names_to_reshape = layer_names; - return *this; - } - - /** @overload - - @param layer_names rvalue set of the selected layers will be reshaped automatically - its input image size. - @return reference to this parameter structure. - */ - Params& cfgInputReshape(std::unordered_set&& layer_names) { - desc.layer_names_to_reshape = std::move(layer_names); - return *this; - } - - /** @brief Specifies the inference batch size. - - The function is used to specify inference batch size. - Follow https://docs.openvinotoolkit.org/latest/classInferenceEngine_1_1CNNNetwork.html#a8e9d19270a48aab50cb5b1c43eecb8e9 for additional information - - @param size batch size which will be used. - @return reference to this parameter structure. - */ - Params& cfgBatchSize(const size_t size) { - desc.batch_size = cv::util::make_optional(size); - return *this; - } - - Params& cfgPreprocessingParams(const cv::gapi::wip::onevpl::Device &device, - const cv::gapi::wip::onevpl::Context &ctx) { - desc.vpl_preproc_device = cv::util::make_optional(device); - desc.vpl_preproc_ctx = cv::util::make_optional(ctx); - return *this; - } - - /** @brief Specifies which api will be used to run inference. - - The function is used to specify mode for OpenVINO inference. - OpenVINO has two options to run inference: - 1. Asynchronous (using StartAsync: https://docs.openvino.ai/latest/classInferenceEngine_1_1InferRequest.html#doxid-class-inference-engine-1-1-infer-request-1a405293e8423d82a5b45f642a3bef0d24) - 2. Synchronous (using Infer: https://docs.openvino.ai/latest/classInferenceEngine_1_1InferRequest.html#doxid-class-inference-engine-1-1-infer-request-1a3391ce30894abde730523e9ca9371ce8) - By default asynchronous mode is used. - - @param mode Inference mode which will be used. - @return reference to this parameter structure. - */ - Params& cfgInferMode(InferMode mode) { - desc.mode = mode; - return *this; - } - - /** @brief Specifies the output precision for model. - - The function is used to set an output precision for model. - - @param precision Precision in OpenCV format (CV_8U, CV_32F, ...) - will be applied to all output layers. - @return reference to this parameter structure. - */ - Params& cfgOutputPrecision(detail::ParamDesc::PrecisionT precision) { - desc.output_precision = precision; - return *this; - } - - /** @overload - - @param precision_map Map of pairs: name of corresponding output layer - and its precision in OpenCV format (CV_8U, CV_32F, ...) - @return reference to this parameter structure. - */ - Params& - cfgOutputPrecision(detail::ParamDesc::PrecisionMapT precision_map) { - desc.output_precision = precision_map; - return *this; - } - - /** @brief Specifies the input layout for model. - - The function is used to set an input layout for model. - - @param layout Layout in string representation ("NCHW", "NHWC", etc) - will be applied to all input layers. - @return reference to this parameter structure. - */ - Params& cfgInputLayout(std::string layout) { - desc.input_layout = std::move(layout); - return *this; - } - - /** @overload - - @param layout_map Map of pairs: name of corresponding input layer - and its layout in string representation ("NCHW", "NHWC", etc) - @return reference to this parameter structure. - */ - Params& - cfgInputLayout(detail::AttrMap layout_map) { - desc.input_layout = std::move(layout_map); - return *this; - } - - /** @brief Specifies the output layout for model. - - The function is used to set an output layout for model. - - @param layout Layout in string representation ("NCHW", "NHWC", etc) - will be applied to all output layers. - @return reference to this parameter structure. - */ - Params& cfgOutputLayout(std::string layout) { - desc.output_layout = std::move(layout); - return *this; - } - - /** @overload - - @param layout_map Map of pairs: name of corresponding output layer - and its layout in string representation ("NCHW", "NHWC", etc) - @return reference to this parameter structure. - */ - Params& - cfgOutputLayout(detail::AttrMap layout_map) { - desc.output_layout = std::move(layout_map); - return *this; - } - - /** @brief Specifies resize interpolation algorithm. - * - The function is used to configure resize preprocessing for input layer. - - @param interpolation Resize interpolation algorithm. - Supported algorithms: #INTER_LINEAR, #INTER_AREA. - @return reference to this parameter structure. - */ - Params& cfgResize(int interpolation) { - desc.interpolation = interpolation; - return *this; - } - - /** @overload - - @param interpolation Map of pairs: name of corresponding input layer - and its resize algorithm. - @return reference to this parameter structure. - */ - Params& cfgResize(detail::AttrMap interpolation) { - desc.interpolation = std::move(interpolation); - return *this; - } - - // BEGIN(G-API's network parametrization API) - GBackend backend() const { return cv::gapi::ie::backend(); } - std::string tag() const { return Net::tag(); } - cv::util::any params() const { return { desc }; } - // END(G-API's network parametrization API) - -protected: - detail::ParamDesc desc; -}; - -/* -* @brief This structure provides functions for generic network type that -* fill inference parameters. -* @see struct Generic -*/ -template<> -class Params { -public: - /** @brief Class constructor. - - Constructs Params based on model information and sets default values for other - inference description parameters. Model is loaded and compiled using OpenVINO Toolkit. - - @param tag string tag of the network for which these parameters are intended. - @param model path to topology IR (.xml file). - @param weights path to weights (.bin file). - @param device target device to use. - */ - Params(const std::string &tag, - const std::string &model, - const std::string &weights, - const std::string &device) - : desc{ model, weights, device, {}, {}, {}, 0u, 0u, - detail::ParamDesc::Kind::Load, true, {}, {}, {}, 1u, - {}, {}, {}, {}, InferMode::Async, {}, {}, {}, {} }, - m_tag(tag) { - } - - /** @overload - - This constructor for pre-compiled networks. Model is imported from pre-compiled - blob. - - @param tag string tag of the network for which these parameters are intended. - @param model path to model. - @param device target device to use. - */ - Params(const std::string &tag, - const std::string &model, - const std::string &device) - : desc{ model, {}, device, {}, {}, {}, 0u, 0u, - detail::ParamDesc::Kind::Import, true, {}, {}, {}, 1u, - {}, {}, {}, {}, InferMode::Async, {}, {}, {}, {} }, - m_tag(tag) { - } - - /** @see ie::Params::pluginConfig. */ - Params& pluginConfig(const IEConfig& cfg) { - desc.config = cfg; - return *this; - } - - /** @overload */ - Params& pluginConfig(IEConfig&& cfg) { - desc.config = std::move(cfg); - return *this; - } - - /** @see ie::Params::constInput. */ - Params& constInput(const std::string &layer_name, - const cv::Mat &data, - TraitAs hint = TraitAs::TENSOR) { - desc.const_inputs[layer_name] = {data, hint}; - return *this; - } - - /** @see ie::Params::cfgNumRequests. */ - Params& cfgNumRequests(size_t nireq) { - GAPI_Assert(nireq > 0 && "Number of infer requests must be greater than zero!"); - desc.nireq = nireq; - return *this; - } - - /** @see ie::Params::cfgInputReshape */ - Params& cfgInputReshape(const std::map>&reshape_table) { - desc.reshape_table = reshape_table; - return *this; - } - - /** @overload */ - Params& cfgInputReshape(std::map> && reshape_table) { - desc.reshape_table = std::move(reshape_table); - return *this; - } - - /** @overload */ - Params& cfgInputReshape(std::string && layer_name, std::vector && layer_dims) { - desc.reshape_table.emplace(layer_name, layer_dims); - return *this; - } - - /** @overload */ - Params& cfgInputReshape(const std::string & layer_name, const std::vector&layer_dims) { - desc.reshape_table.emplace(layer_name, layer_dims); - return *this; - } - - /** @overload */ - Params& cfgInputReshape(std::unordered_set && layer_names) { - desc.layer_names_to_reshape = std::move(layer_names); - return *this; - } - - /** @overload */ - Params& cfgInputReshape(const std::unordered_set&layer_names) { - desc.layer_names_to_reshape = layer_names; - return *this; - } - - /** @see ie::Params::cfgBatchSize */ - Params& cfgBatchSize(const size_t size) { - desc.batch_size = cv::util::make_optional(size); - return *this; - } - - /** @see ie::Params::cfgInferAPI */ - Params& cfgInferMode(InferMode mode) { - desc.mode = mode; - return *this; - } - - /** @see ie::Params::cfgOutputPrecision */ - Params& cfgOutputPrecision(detail::ParamDesc::PrecisionT precision) { - desc.output_precision = precision; - return *this; - } - - /** @overload */ - Params& - cfgOutputPrecision(detail::ParamDesc::PrecisionMapT precision_map) { - desc.output_precision = precision_map; - return *this; - } - - /** @see ie::Params::cfgInputLayout */ - Params& cfgInputLayout(std::string layout) { - desc.input_layout = std::move(layout); - return *this; - } - - /** @overload */ - Params& - cfgInputLayout(detail::AttrMap layout_map) { - desc.input_layout = std::move(layout_map); - return *this; - } - - /** @see ie::Params::cfgOutputLayout */ - Params& cfgOutputLayout(std::string layout) { - desc.output_layout = std::move(layout); - return *this; - } - - /** @overload */ - Params& - cfgOutputLayout(detail::AttrMap layout_map) { - desc.output_layout = std::move(layout_map); - return *this; - } - - /** @see ie::Params::cfgResize */ - Params& cfgResize(int interpolation) { - desc.interpolation = interpolation; - return *this; - } - - /** @overload */ - Params& cfgResize(detail::AttrMap interpolation) { - desc.interpolation = std::move(interpolation); - return *this; - } - - // BEGIN(G-API's network parametrization API) - GBackend backend() const { return cv::gapi::ie::backend(); } - std::string tag() const { return m_tag; } - cv::util::any params() const { return { desc }; } - // END(G-API's network parametrization API) - -protected: - detail::ParamDesc desc; - std::string m_tag; -}; - -} // namespace ie -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_INFER_IE_HPP diff --git a/modules/gapi/include/opencv2/gapi/infer/onnx.hpp b/modules/gapi/include/opencv2/gapi/infer/onnx.hpp deleted file mode 100644 index eb6316b446..0000000000 --- a/modules/gapi/include/opencv2/gapi/infer/onnx.hpp +++ /dev/null @@ -1,759 +0,0 @@ -// 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. -// -// Copyright (C) 2020-2021 Intel Corporation - -#ifndef OPENCV_GAPI_INFER_ONNX_HPP -#define OPENCV_GAPI_INFER_ONNX_HPP - -#include -#include -#include -#include // tuple, tuple_size -#include - -#include -#include -#include - -#include // GAPI_EXPORTS -#include // GKernelPackage -#include // Generic - -namespace cv { -namespace gapi { - -/** - * @brief This namespace contains G-API ONNX Runtime backend functions, structures, and symbols. - */ -namespace onnx { - -/** - * @brief This namespace contains Execution Providers structures for G-API ONNX Runtime backend. - */ -namespace ep { - -/** - * @brief This structure provides functions - * that fill inference options for ONNX CoreML Execution Provider. - * Please follow https://onnxruntime.ai/docs/execution-providers/CoreML-ExecutionProvider.html#coreml-execution-provider - */ -struct GAPI_EXPORTS_W_SIMPLE CoreML { - /** @brief Class constructor. - - Constructs CoreML parameters. - - */ - GAPI_WRAP - CoreML() = default; - - /** @brief Limit CoreML Execution Provider to run on CPU only. - - This function is used to limit CoreML to run on CPU only. - Please follow: https://onnxruntime.ai/docs/execution-providers/CoreML-ExecutionProvider.html#coreml_flag_use_cpu_only - - @return reference to this parameter structure. - */ - GAPI_WRAP - CoreML& cfgUseCPUOnly() { - use_cpu_only = true; - return *this; - } - - /** @brief Enable CoreML EP to run on a subgraph in the body of a control flow ONNX operator (i.e. a Loop, Scan or If operator). - - This function is used to enable CoreML EP to run on - a subgraph of a control flow of ONNX operation. - Please follow: https://onnxruntime.ai/docs/execution-providers/CoreML-ExecutionProvider.html#coreml_flag_enable_on_subgraph - - @return reference to this parameter structure. - */ - GAPI_WRAP - CoreML& cfgEnableOnSubgraph() { - enable_on_subgraph = true; - return *this; - } - - /** @brief Enable CoreML EP to run only on Apple Neural Engine. - - This function is used to enable CoreML EP to run only on Apple Neural Engine. - Please follow: https://onnxruntime.ai/docs/execution-providers/CoreML-ExecutionProvider.html#coreml_flag_only_enable_device_with_ane - - @return reference to this parameter structure. - */ - GAPI_WRAP - CoreML& cfgEnableOnlyNeuralEngine() { - enable_only_ane = true; - return *this; - } - - bool use_cpu_only = false; - bool enable_on_subgraph = false; - bool enable_only_ane = false; -}; - -/** - * @brief This structure provides functions - * that fill inference options for CUDA Execution Provider. - * Please follow https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#cuda-execution-provider - */ -struct GAPI_EXPORTS_W_SIMPLE CUDA { - // NB: Used from python. - /// @private -- Exclude this constructor from OpenCV documentation - GAPI_WRAP - CUDA() = default; - - /** @brief Class constructor. - - Constructs CUDA parameters based on device type information. - - @param dev_id Target device id to use. - */ - GAPI_WRAP - explicit CUDA(const int dev_id) - : device_id(dev_id) { - } - - int device_id; -}; - -/** - * @brief This structure provides functions - * that fill inference options for TensorRT Execution Provider. - * Please follow https://onnxruntime.ai/docs/execution-providers/TensorRT-ExecutionProvider.html#tensorrt-execution-provider - */ -struct GAPI_EXPORTS_W_SIMPLE TensorRT { - // NB: Used from python. - /// @private -- Exclude this constructor from OpenCV documentation - GAPI_WRAP - TensorRT() = default; - - /** @brief Class constructor. - - Constructs TensorRT parameters based on device type information. - - @param dev_id Target device id to use. - */ - GAPI_WRAP - explicit TensorRT(const int dev_id) - : device_id(dev_id) { - } - - int device_id; -}; - -/** - * @brief This structure provides functions - * that fill inference options for ONNX OpenVINO Execution Provider. - * Please follow https://onnxruntime.ai/docs/execution-providers/OpenVINO-ExecutionProvider.html#summary-of-options - */ -struct GAPI_EXPORTS_W_SIMPLE OpenVINO { - // NB: Used from python. - /// @private -- Exclude this constructor from OpenCV documentation - GAPI_WRAP - OpenVINO() = default; - - /** @brief Class constructor. - - Constructs OpenVINO parameters based on device type information. - - @param dev_type Target device type to use. ("CPU", "GPU", "GPU.0" etc) - */ - GAPI_WRAP - explicit OpenVINO(const std::string &dev_type) - : device_type(dev_type) { - } - - /** @brief Class constructor. - - Constructs OpenVINO parameters based on map of options passed. - - * @param params A map of parameter names and their corresponding string values. - */ - GAPI_WRAP - explicit OpenVINO(const std::map& params) - : params_map(params) { - } - - /** @brief Specifies OpenVINO Execution Provider cache dir. - - This function is used to explicitly specify the path to save and load - the blobs enabling model caching feature. - - @param dir Path to the directory what will be used as cache. - @return reference to this parameter structure. - */ - GAPI_WRAP - OpenVINO& cfgCacheDir(const std::string &dir) { - if (!params_map.empty()) { - cv::util::throw_error(std::logic_error("ep::OpenVINO cannot be changed if" - "created from the parameters map.")); - } - cache_dir = dir; - return *this; - } - - /** @brief Specifies OpenVINO Execution Provider number of threads. - - This function is used to override the accelerator default value - of number of threads with this value at runtime. - - @param nthreads Number of threads. - @return reference to this parameter structure. - */ - GAPI_WRAP - OpenVINO& cfgNumThreads(size_t nthreads) { - if (!params_map.empty()) { - cv::util::throw_error(std::logic_error("ep::OpenVINO cannot be changed if" - "created from the parameters map.")); - } - num_of_threads = nthreads; - return *this; - } - - /** @brief Enables OpenVINO Execution Provider opencl throttling. - - This function is used to enable OpenCL queue throttling for GPU devices - (reduces CPU utilization when using GPU). - - @return reference to this parameter structure. - */ - GAPI_WRAP - OpenVINO& cfgEnableOpenCLThrottling() { - if (!params_map.empty()) { - cv::util::throw_error(std::logic_error("ep::OpenVINO cannot be changed if" - "created from the parameters map.")); - } - enable_opencl_throttling = true; - return *this; - } - - /** @brief Enables OpenVINO Execution Provider dynamic shapes. - - This function is used to enable OpenCL queue throttling for GPU devices - (reduces CPU utilization when using GPU). - This function is used to enable work with dynamic shaped models - whose shape will be set dynamically based on the infer input - image/data shape at run time in CPU. - - @return reference to this parameter structure. - */ - GAPI_WRAP - OpenVINO& cfgEnableDynamicShapes() { - if (!params_map.empty()) { - cv::util::throw_error(std::logic_error("ep::OpenVINO cannot be changed if" - "created from the parameters map.")); - } - enable_dynamic_shapes = true; - return *this; - } - - std::string device_type; - std::string cache_dir; - size_t num_of_threads = 0; - bool enable_opencl_throttling = false; - bool enable_dynamic_shapes = false; - std::map params_map; -}; - -/** - * @brief This structure provides functions - * that fill inference options for ONNX DirectML Execution Provider. - * Please follow https://onnxruntime.ai/docs/execution-providers/DirectML-ExecutionProvider.html#directml-execution-provider - */ -class GAPI_EXPORTS_W_SIMPLE DirectML { -public: - // NB: Used from python. - /// @private -- Exclude this constructor from OpenCV documentation - GAPI_WRAP - DirectML() = default; - - /** @brief Class constructor. - - Constructs DirectML parameters based on device id. - - @param device_id Target device id to use. ("0", "1", etc) - */ - GAPI_WRAP - explicit DirectML(const int device_id) : ddesc(device_id) { }; - - /** @brief Class constructor. - - Constructs DirectML parameters based on adapter name. - - @param adapter_name Target adapter_name to use. - */ - GAPI_WRAP - explicit DirectML(const std::string &adapter_name) : ddesc(adapter_name) { }; - - using DeviceDesc = cv::util::variant; - DeviceDesc ddesc; -}; - -using EP = cv::util::variant< cv::util::monostate - , OpenVINO - , DirectML - , CoreML - , CUDA - , TensorRT>; - -} // namespace ep - -GAPI_EXPORTS cv::gapi::GBackend backend(); - -enum class TraitAs: int { - TENSOR, //!< G-API traits an associated cv::Mat as a raw tensor - // and passes dimensions as-is - IMAGE //!< G-API traits an associated cv::Mat as an image so - // creates an "image" blob (NCHW/NHWC, etc) -}; - -using PostProc = std::function &, - std::unordered_map &)>; - -namespace detail { -/** -* @brief This structure contains description of inference parameters -* which is specific to ONNX models. -*/ -struct ParamDesc { - std::string model_path; //!< Path to model. - - // NB: nun_* may differ from topology's real input/output port numbers - // (e.g. topology's partial execution) - std::size_t num_in; //!< How many inputs are defined in the operation - std::size_t num_out; //!< How many outputs are defined in the operation - - // NB: Here order follows the `Net` API - std::vector input_names; //!< Names of input network layers. - std::vector output_names; //!< Names of output network layers. - - using ConstInput = std::pair; - std::unordered_map const_inputs; //!< Map with pair of name of network layer and ConstInput which will be associated with this. - - std::vector mean; //!< Mean values for preprocessing. - std::vector stdev; //!< Standard deviation values for preprocessing. - - std::vector out_metas; //!< Out meta information about your output (type, dimension). - PostProc custom_post_proc; //!< Post processing function. - - std::vector normalize; //!< Vector of bool values that enabled or disabled normalize of input data. - - std::vector names_to_remap; //!< Names of output layers that will be processed in PostProc function. - - bool is_generic; - - // TODO: Needs to modify the rest of ParamDesc accordingly to support - // both generic and non-generic options without duplication - // (as it was done for the OV IE backend) - // These values are pushed into the respective vector<> fields above - // when the generic infer parameters are unpacked (see GONNXBackendImpl::unpackKernel) - std::unordered_map > generic_mstd; - std::unordered_map generic_norm; - - std::map session_options; - std::vector execution_providers; - bool disable_mem_pattern; - cv::util::optional opt_level; -}; -} // namespace detail - -template -struct PortCfg { - using In = std::array - < std::string - , std::tuple_size::value >; - using Out = std::array - < std::string - , std::tuple_size::value >; - using NormCoefs = std::array - < cv::Scalar - , std::tuple_size::value >; - using Normalize = std::array - < bool - , std::tuple_size::value >; -}; - -/** - * Contains description of inference parameters and kit of functions that - * fill this parameters. - */ -template class Params { -public: - /** @brief Class constructor. - - Constructs Params based on model information and sets default values for other - inference description parameters. - - @param model Path to model (.onnx file). - */ - Params(const std::string &model) { - desc.model_path = model; - desc.num_in = std::tuple_size::value; - desc.num_out = std::tuple_size::value; - desc.is_generic = false; - desc.disable_mem_pattern = false; - } - - /** @brief Specifies sequence of network input layers names for inference. - - The function is used to associate data of graph inputs with input layers of - network topology. Number of names has to match the number of network inputs. If a network - has only one input layer, there is no need to call it as the layer is - associated with input automatically but this doesn't prevent you from - doing it yourself. Count of names has to match to number of network inputs. - - @param layer_names std::array where N is the number of inputs - as defined in the @ref G_API_NET. Contains names of input layers. - @return the reference on modified object. - */ - Params& cfgInputLayers(const typename PortCfg::In &layer_names) { - desc.input_names.assign(layer_names.begin(), layer_names.end()); - return *this; - } - - /** @brief Specifies sequence of output layers names for inference. - - The function is used to associate data of graph outputs with output layers of - network topology. If a network has only one output layer, there is no need to call it - as the layer is associated with output automatically but this doesn't prevent - you from doing it yourself. Count of names has to match to number of network - outputs or you can set your own output but for this case you have to - additionally use @ref cfgPostProc function. - - @param layer_names std::array where N is the number of outputs - as defined in the @ref G_API_NET. Contains names of output layers. - @return the reference on modified object. - */ - Params& cfgOutputLayers(const typename PortCfg::Out &layer_names) { - desc.output_names.assign(layer_names.begin(), layer_names.end()); - return *this; - } - - /** @brief Sets a constant input. - - The function is used to set constant input. This input has to be - a prepared tensor since preprocessing is disabled for this case. You should - provide name of network layer which will receive provided data. - - @param layer_name Name of network layer. - @param data cv::Mat that contains data which will be associated with network layer. - @param hint Type of input (TENSOR). - @return the reference on modified object. - */ - Params& constInput(const std::string &layer_name, - const cv::Mat &data, - TraitAs hint = TraitAs::TENSOR) { - desc.const_inputs[layer_name] = {data, hint}; - return *this; - } - - /** @brief Specifies mean value and standard deviation for preprocessing. - - The function is used to set mean value and standard deviation for preprocessing - of input data. - - @param m std::array where N is the number of inputs - as defined in the @ref G_API_NET. Contains mean values. - @param s std::array where N is the number of inputs - as defined in the @ref G_API_NET. Contains standard deviation values. - @return the reference on modified object. - */ - Params& cfgMeanStd(const typename PortCfg::NormCoefs &m, - const typename PortCfg::NormCoefs &s) { - desc.mean.assign(m.begin(), m.end()); - desc.stdev.assign(s.begin(), s.end()); - return *this; - } - - /** @brief Configures graph output and provides the post processing function from user. - - The function is used when you work with networks with dynamic outputs. - Since we can't know dimensions of inference result needs provide them for - construction of graph output. This dimensions can differ from inference result. - So you have to provide @ref PostProc function that gets information from inference - result and fill output which is constructed by dimensions from out_metas. - - @param out_metas Out meta information about your output (type, dimension). - @param remap_function Post processing function, which has two parameters. First is onnx - result, second is graph output. Both parameters is std::map that contain pair of - layer's name and cv::Mat. - @return the reference on modified object. - */ - Params& cfgPostProc(const std::vector &out_metas, - const PostProc &remap_function) { - desc.out_metas = out_metas; - desc.custom_post_proc = remap_function; - return *this; - } - - /** @overload - Function with a rvalue parameters. - - @param out_metas rvalue out meta information about your output (type, dimension). - @param remap_function rvalue post processing function, which has two parameters. First is onnx - result, second is graph output. Both parameters is std::map that contain pair of - layer's name and cv::Mat. - @return the reference on modified object. - */ - Params& cfgPostProc(std::vector &&out_metas, - PostProc &&remap_function) { - desc.out_metas = std::move(out_metas); - desc.custom_post_proc = std::move(remap_function); - return *this; - } - - /** @overload - The function has additional parameter names_to_remap. This parameter provides - information about output layers which will be used for inference and post - processing function. - - @param out_metas Out meta information. - @param remap_function Post processing function. - @param names_to_remap Names of output layers. network's inference will - be done on these layers. Inference's result will be processed in post processing - function using these names. - @return the reference on modified object. - */ - Params& cfgPostProc(const std::vector &out_metas, - const PostProc &remap_function, - const std::vector &names_to_remap) { - desc.out_metas = out_metas; - desc.custom_post_proc = remap_function; - desc.names_to_remap = names_to_remap; - return *this; - } - - /** @overload - Function with a rvalue parameters and additional parameter names_to_remap. - - @param out_metas rvalue out meta information. - @param remap_function rvalue post processing function. - @param names_to_remap rvalue names of output layers. network's inference will - be done on these layers. Inference's result will be processed in post processing - function using these names. - @return the reference on modified object. - */ - Params& cfgPostProc(std::vector &&out_metas, - PostProc &&remap_function, - std::vector &&names_to_remap) { - desc.out_metas = std::move(out_metas); - desc.custom_post_proc = std::move(remap_function); - desc.names_to_remap = std::move(names_to_remap); - return *this; - } - - /** @brief Specifies normalize parameter for preprocessing. - - The function is used to set normalize parameter for preprocessing of input data. - - @param normalizations std::array where N is the number of inputs - as defined in the @ref G_API_NET. Сontains bool values that enabled or disabled - normalize of input data. - @return the reference on modified object. - */ - Params& cfgNormalize(const typename PortCfg::Normalize &normalizations) { - desc.normalize.assign(normalizations.begin(), normalizations.end()); - return *this; - } - - /** @brief Adds execution provider for runtime. - - The function is used to add ONNX Runtime OpenVINO Execution Provider options. - - @param ep OpenVINO Execution Provider options. - @see cv::gapi::onnx::ep::OpenVINO. - - @return the reference on modified object. - */ - Params& cfgAddExecutionProvider(ep::OpenVINO&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - return *this; - } - - /** @brief Adds execution provider for runtime. - - The function is used to add ONNX Runtime DirectML Execution Provider options. - - @param ep DirectML Execution Provider options. - @see cv::gapi::onnx::ep::DirectML. - - @return the reference on modified object. - */ - Params& cfgAddExecutionProvider(ep::DirectML&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - return *this; - } - - /** @brief Adds execution provider for runtime. - - The function is used to add ONNX Runtime CoreML Execution Provider options. - - @param ep CoreML Execution Provider options. - @see cv::gapi::onnx::ep::CoreML. - - @return the reference on modified object. - */ - Params& cfgAddExecutionProvider(ep::CoreML&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - return *this; - } - - /** @brief Adds execution provider for runtime. - - The function is used to add ONNX Runtime CUDA Execution Provider options. - - @param ep CUDA Execution Provider options. - @see cv::gapi::onnx::ep::CUDA. - - @return the reference on modified object. - */ - Params& cfgAddExecutionProvider(ep::CUDA&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - return *this; - } - - /** @brief Adds execution provider for runtime. - - The function is used to add ONNX Runtime TensorRT Execution Provider options. - - @param ep TensorRT Execution Provider options. - @see cv::gapi::onnx::ep::TensorRT. - - @return the reference on modified object. - */ - Params& cfgAddExecutionProvider(ep::TensorRT&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - return *this; - } - - /** @brief Disables the memory pattern optimization. - - @return the reference on modified object. - */ - Params& cfgDisableMemPattern() { - desc.disable_mem_pattern = true; - return *this; - } - - /** @brief Configures session options for ONNX Runtime. - - This function is used to set various session options for the ONNX Runtime - session by accepting a map of key-value pairs. - - @param options A map of session option to be applied to the ONNX Runtime session. - @return the reference on modified object. - */ - Params& cfgSessionOptions(const std::map& options) { - desc.session_options.insert(options.begin(), options.end()); - return *this; - } - - /** @brief Configures optimization level for ONNX Runtime. - - @param opt_level [optimization level]: Valid values are 0 (disable), 1 (basic), 2 (extended), 99 (all). - Please see onnxruntime_c_api.h (enum GraphOptimizationLevel) for the full list of all optimization levels. - @return the reference on modified object. - */ - Params& cfgOptLevel(const int opt_level) { - desc.opt_level = cv::util::make_optional(opt_level); - return *this; - } - - // BEGIN(G-API's network parametrization API) - GBackend backend() const { return cv::gapi::onnx::backend(); } - std::string tag() const { return Net::tag(); } - cv::util::any params() const { return { desc }; } - // END(G-API's network parametrization API) - -protected: - detail::ParamDesc desc; -}; - -/* -* @brief This structure provides functions for generic network type that -* fill inference parameters. -* @see struct Generic -*/ -template<> -class Params { -public: - /** @brief Class constructor. - - Constructs Params based on input information and sets default values for other - inference description parameters. - - @param tag string tag of the network for which these parameters are intended. - @param model_path path to model file (.onnx file). - */ - Params(const std::string& tag, const std::string& model_path) - : desc{ model_path, 0u, 0u, {}, {}, {}, {}, {}, {}, {}, {}, {}, true, {}, {}, {}, {}, false, {} }, m_tag(tag) {} - - /** @see onnx::Params::cfgMeanStdDev. */ - void cfgMeanStdDev(const std::string &layer, - const cv::Scalar &m, - const cv::Scalar &s) { - desc.generic_mstd[layer] = std::make_pair(m, s); - } - - /** @see onnx::Params::cfgNormalize. */ - void cfgNormalize(const std::string &layer, bool flag) { - desc.generic_norm[layer] = flag; - } - - /** @see onnx::Params::cfgAddExecutionProvider. */ - void cfgAddExecutionProvider(ep::OpenVINO&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - } - - /** @see onnx::Params::cfgAddExecutionProvider. */ - void cfgAddExecutionProvider(ep::DirectML&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - } - - /** @see onnx::Params::cfgAddExecutionProvider. */ - void cfgAddExecutionProvider(ep::CoreML&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - } - - /** @see onnx::Params::cfgAddExecutionProvider. */ - void cfgAddExecutionProvider(ep::CUDA&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - } - - /** @see onnx::Params::cfgAddExecutionProvider. */ - void cfgAddExecutionProvider(ep::TensorRT&& ep) { - desc.execution_providers.emplace_back(std::move(ep)); - } - - /** @see onnx::Params::cfgDisableMemPattern. */ - void cfgDisableMemPattern() { - desc.disable_mem_pattern = true; - } - - /** @see onnx::Params::cfgSessionOptions. */ - void cfgSessionOptions(const std::map& options) { - desc.session_options.insert(options.begin(), options.end()); - } - -/** @see onnx::Params::cfgOptLevel. */ - void cfgOptLevel(const int opt_level) { - desc.opt_level = cv::util::make_optional(opt_level); - } - - // BEGIN(G-API's network parametrization API) - GBackend backend() const { return cv::gapi::onnx::backend(); } - std::string tag() const { return m_tag; } - cv::util::any params() const { return { desc }; } - // END(G-API's network parametrization API) -protected: - detail::ParamDesc desc; - std::string m_tag; -}; - -} // namespace onnx -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_INFER_HPP diff --git a/modules/gapi/include/opencv2/gapi/infer/ov.hpp b/modules/gapi/include/opencv2/gapi/infer/ov.hpp deleted file mode 100644 index 782792489b..0000000000 --- a/modules/gapi/include/opencv2/gapi/infer/ov.hpp +++ /dev/null @@ -1,709 +0,0 @@ -// 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. -// -// Copyright (C) 2023 Intel Corporation - -#ifndef OPENCV_GAPI_INFER_OV_HPP -#define OPENCV_GAPI_INFER_OV_HPP - -#include - -#include -#include // GAPI_EXPORTS -#include // GKernelType[M], GBackend -#include // Generic - -#include - -namespace cv { -namespace gapi { - -/** - * @brief This namespace contains G-API OpenVINO 2.0 backend functions, - * structures, and symbols. - */ -namespace ov { - -GAPI_EXPORTS cv::gapi::GBackend backend(); - -namespace detail { - -template -using AttrMap = std::map; -// NB: This type is supposed to be used to hold in/out layers -// attributes such as precision, layout, shape etc. -// -// User can provide attributes either: -// 1. cv::util::monostate - No value specified explicitly. -// 2. Attr - value specified explicitly that should be broadcasted to all layers. -// 3. AttrMap[str->T] - map specifies value for particular layer. -template -using LayerVariantAttr = cv::util::variant< cv::util::monostate - , AttrMap - , Attr>; - -struct ParamDesc { - struct Model { - - Model(const std::string &model_path_, - const std::string &bin_path_) - : model_path(model_path_), bin_path(bin_path_) { - } - - std::string model_path; - std::string bin_path; - - LayerVariantAttr input_tensor_layout; - LayerVariantAttr input_model_layout; - LayerVariantAttr output_tensor_layout; - LayerVariantAttr output_model_layout; - LayerVariantAttr output_tensor_precision; - - LayerVariantAttr> new_shapes; - - LayerVariantAttr> mean_values; - LayerVariantAttr> scale_values; - - LayerVariantAttr interpolation; - }; - - struct CompiledModel { - std::string blob_path; - }; - - using Kind = cv::util::variant; - - ParamDesc(Kind &&kind_, - const std::string &device_, - const bool is_generic_, - const size_t num_in_, - const size_t num_out_) - : kind(std::move(kind_)), device(device_), - is_generic(is_generic_), - num_in(num_in_), num_out(num_out_) { - } - - Kind kind; - - std::string device; - bool is_generic; - - std::size_t num_in; - std::size_t num_out; - - std::vector input_names; - std::vector output_names; - - using PluginConfigT = std::map; - PluginConfigT config; - - size_t nireq = 1; -}; - -// NB: Just helper to avoid code duplication. -static detail::ParamDesc::Model& -getModelToSetAttrOrThrow(detail::ParamDesc::Kind &kind, - const std::string &attr_name) { - if (cv::util::holds_alternative(kind)) { - cv::util::throw_error( - std::logic_error("Specifying " + attr_name + " isn't" - " possible for compiled model.")); - } - GAPI_Assert(cv::util::holds_alternative(kind)); - return cv::util::get(kind); -} - -} // namespace detail - -/** - * @brief This structure provides functions - * that fill inference parameters for "OpenVINO Toolkit" model. - */ -template struct Params { -public: - /** @brief Class constructor. - - Constructs Params based on model information and specifies default values for other - inference description parameters. Model is loaded and compiled using "OpenVINO Toolkit". - - @param model_path Path to a model. - @param bin_path Path to a data file. - For IR format (*.bin): - If path is empty, will try to read a bin file with the same name as xml. - If the bin file with the same name is not found, will load IR without weights. - For PDPD (*.pdmodel) and ONNX (*.onnx) formats bin_path isn't used. - @param device target device to use. - */ - Params(const std::string &model_path, - const std::string &bin_path, - const std::string &device) - : m_desc( detail::ParamDesc::Kind{detail::ParamDesc::Model{model_path, bin_path}} - , device - , false /* is generic */ - , std::tuple_size::value - , std::tuple_size::value) { - } - - /** @overload - Use this constructor to work with pre-compiled network. - Model is imported from a pre-compiled blob. - - @param blob_path path to the compiled model (*.blob). - @param device target device to use. - */ - Params(const std::string &blob_path, - const std::string &device) - : m_desc( detail::ParamDesc::Kind{detail::ParamDesc::CompiledModel{blob_path}} - , device - , false /* is generic */ - , std::tuple_size::value - , std::tuple_size::value) { - } - - /** @brief Specifies sequence of network input layers names for inference. - - The function is used to associate cv::gapi::infer<> inputs with the model inputs. - Number of names has to match the number of network inputs as defined in G_API_NET(). - In case a network has only single input layer, there is no need to specify name manually. - - @param layer_names std::array where N is the number of inputs - as defined in the @ref G_API_NET. Contains names of input layers. - @return reference to this parameter structure. - */ - Params& cfgInputLayers(const std::vector &layer_names) { - m_desc.input_names = layer_names; - return *this; - } - - /** @brief Specifies sequence of network output layers names for inference. - - The function is used to associate cv::gapi::infer<> outputs with the model outputs. - Number of names has to match the number of network outputs as defined in G_API_NET(). - In case a network has only single output layer, there is no need to specify name manually. - - @param layer_names std::array where N is the number of outputs - as defined in the @ref G_API_NET. Contains names of output layers. - @return reference to this parameter structure. - */ - Params& cfgOutputLayers(const std::vector &layer_names) { - m_desc.output_names = layer_names; - return *this; - } - - /** @brief Specifies OpenVINO plugin configuration. - - The function is used to set configuration for OpenVINO plugin. Some parameters - can be different for each plugin. Please follow https://docs.openvinotoolkit.org/latest/index.html - to check information about specific plugin. - - @param config Map of pairs: (config parameter name, config parameter value). - @return reference to this parameter structure. - */ - Params& cfgPluginConfig(const detail::ParamDesc::PluginConfigT &config) { - m_desc.config = config; - return *this; - } - - /** @brief Specifies tensor layout for an input layer. - - The function is used to set tensor layout for an input layer. - - @param layout Tensor layout ("NCHW", "NWHC", etc) - will be applied to all input layers. - @return reference to this parameter structure. - */ - Params& cfgInputTensorLayout(std::string layout) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "input tensor layout") - .input_tensor_layout = std::move(layout); - return *this; - } - - /** @overload - @param layout_map Map of pairs: name of corresponding input layer - and its tensor layout represented in std::string ("NCHW", "NHWC", etc) - @return reference to this parameter structure. - */ - Params& - cfgInputTensorLayout(detail::AttrMap layout_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "input tensor layout") - .input_tensor_layout = std::move(layout_map); - return *this; - } - - /** @brief Specifies model layout for an input layer. - - The function is used to set model layout for an input layer. - - @param layout Model layout ("NCHW", "NHWC", etc) - will be applied to all input layers. - @return reference to this parameter structure. - */ - Params& cfgInputModelLayout(std::string layout) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "input model layout") - .input_model_layout = std::move(layout); - return *this; - } - - /** @overload - @param layout_map Map of pairs: name of corresponding input layer - and its model layout ("NCHW", "NHWC", etc) - @return reference to this parameter structure. - */ - Params& - cfgInputModelLayout(detail::AttrMap layout_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "input model layout") - .input_model_layout = std::move(layout_map); - return *this; - } - - /** @brief Specifies tensor layout for an output layer. - - The function is used to set tensor layout for an output layer. - - @param layout Tensor layout ("NCHW", "NWHC", etc) - will be applied to all output layers. - @return reference to this parameter structure. - */ - Params& cfgOutputTensorLayout(std::string layout) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output tensor layout") - .output_tensor_layout = std::move(layout); - return *this; - } - - /** @overload - @param layout_map Map of pairs: name of corresponding output layer - and its tensor layout represented in std::string ("NCHW", "NHWC", etc) - @return reference to this parameter structure. - */ - Params& - cfgOutputTensorLayout(detail::AttrMap layout_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output tensor layout") - .output_tensor_layout = std::move(layout_map); - return *this; - } - - /** @brief Specifies model layout for an output layer. - - The function is used to set model layout for an output layer. - - @param layout Model layout ("NCHW", "NHWC", etc) - will be applied to all output layers. - @return reference to this parameter structure. - */ - Params& cfgOutputModelLayout(std::string layout) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output model layout") - .output_model_layout = std::move(layout); - return *this; - } - - /** @overload - @param layout_map Map of pairs: name of corresponding output layer - and its model layout ("NCHW", "NHWC", etc) - @return reference to this parameter structure. - */ - Params& - cfgOutputModelLayout(detail::AttrMap layout_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output model layout") - .output_model_layout = std::move(layout_map); - return *this; - } - - /** @brief Specifies tensor precision for an output layer. - - The function is used to set tensor precision for an output layer.. - - @param precision Precision in OpenCV format (CV_8U, CV_32F, ...) - will be applied to all output layers. - @return reference to this parameter structure. - */ - Params& cfgOutputTensorPrecision(int precision) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output tensor precision") - .output_tensor_precision = precision; - return *this; - } - - /** @overload - - @param precision_map Map of pairs: name of corresponding output layer - and its precision in OpenCV format (CV_8U, CV_32F, ...) - @return reference to this parameter structure. - */ - Params& - cfgOutputTensorPrecision(detail::AttrMap precision_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output tensor precision") - .output_tensor_precision = std::move(precision_map); - return *this; - } - - /** @brief Specifies the new shape for input layers. - - The function is used to set new shape for input layers. - - @param new_shape New shape will be applied to all input layers. - @return reference to this parameter structure. - */ - Params& - cfgReshape(std::vector new_shape) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "reshape") - .new_shapes = std::move(new_shape); - return *this; - } - - /** @overload - - @param new_shape_map Map of pairs: name of corresponding output layer - and its new shape. - @return reference to this parameter structure. - */ - Params& - cfgReshape(detail::AttrMap> new_shape_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "reshape") - .new_shapes = std::move(new_shape_map); - return *this; - } - - /** @brief Specifies number of asynchronous inference requests. - - @param nireq Number of inference asynchronous requests. - @return reference to this parameter structure. - */ - Params& cfgNumRequests(const size_t nireq) { - if (nireq == 0) { - cv::util::throw_error( - std::logic_error("Number of inference requests" - " must be greater than zero.")); - } - m_desc.nireq = nireq; - return *this; - } - - /** @brief Specifies mean values for preprocessing. - * - The function is used to set mean values for input layer preprocessing. - - @param mean_values Float vector contains mean values - @return reference to this parameter structure. - */ - Params& cfgMean(std::vector mean_values) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "mean values") - .mean_values = std::move(mean_values); - return *this; - } - - /** @overload - - @param mean_map Map of pairs: name of corresponding input layer - and its mean values. - @return reference to this parameter structure. - */ - Params& cfgMean(detail::AttrMap> mean_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "mean values") - .mean_values = std::move(mean_map); - return *this; - } - - /** @brief Specifies scale values for preprocessing. - * - The function is used to set scale values for input layer preprocessing. - - @param scale_values Float vector contains scale values - @return reference to this parameter structure. - */ - Params& cfgScale(std::vector scale_values) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "scale values") - .scale_values = std::move(scale_values); - return *this; - } - - /** @overload - - @param scale_map Map of pairs: name of corresponding input layer - and its mean values. - @return reference to this parameter structure. - */ - Params& cfgScale(detail::AttrMap> scale_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "scale values") - .scale_values = std::move(scale_map); - return *this; - } - - /** @brief Specifies resize interpolation algorithm. - * - The function is used to configure resize preprocessing for input layer. - - @param interpolation Resize interpolation algorithm. - Supported algorithms: #INTER_NEAREST, #INTER_LINEAR, #INTER_CUBIC. - @return reference to this parameter structure. - */ - Params& cfgResize(int interpolation) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "resize preprocessing") - .interpolation = std::move(interpolation); - return *this; - } - - /** @overload - - @param interpolation Map of pairs: name of corresponding input layer - and its resize algorithm. - @return reference to this parameter structure. - */ - Params& cfgResize(detail::AttrMap interpolation) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "resize preprocessing") - .interpolation = std::move(interpolation); - return *this; - } - - // BEGIN(G-API's network parametrization API) - GBackend backend() const { return cv::gapi::ov::backend(); } - std::string tag() const { return Net::tag(); } - cv::util::any params() const { return { m_desc }; } - // END(G-API's network parametrization API) - -protected: - detail::ParamDesc m_desc; -}; - -/* -* @brief This structure provides functions for generic network type that -* fill inference parameters. -* @see struct Generic -*/ -template<> -class Params { -public: - /** @brief Class constructor. - - Constructs Params based on model information and specifies default values for other - inference description parameters. Model is loaded and compiled using "OpenVINO Toolkit". - - @param tag string tag of the network for which these parameters are intended. - @param model_path Path to a model. - @param bin_path Path to a data file. - For IR format (*.bin): - If path is empty, will try to read a bin file with the same name as xml. - If the bin file with the same name is not found, will load IR without weights. - For PDPD (*.pdmodel) and ONNX (*.onnx) formats bin_path isn't used. - @param device target device to use. - */ - Params(const std::string &tag, - const std::string &model_path, - const std::string &bin_path, - const std::string &device) - : m_tag(tag), - m_desc( detail::ParamDesc::Kind{detail::ParamDesc::Model{model_path, bin_path}} - , device - , true /* is generic */ - , 0u - , 0u) { - } - - /** @overload - - This constructor for pre-compiled networks. Model is imported from pre-compiled - blob. - - @param tag string tag of the network for which these parameters are intended. - @param blob_path path to the compiled model (*.blob). - @param device target device to use. - */ - Params(const std::string &tag, - const std::string &blob_path, - const std::string &device) - : m_tag(tag), - m_desc( detail::ParamDesc::Kind{detail::ParamDesc::CompiledModel{blob_path}} - , device - , true /* is generic */ - , 0u - , 0u) { - } - - /** @see ov::Params::cfgPluginConfig. */ - Params& cfgPluginConfig(const detail::ParamDesc::PluginConfigT &config) { - m_desc.config = config; - return *this; - } - - /** @see ov::Params::cfgInputTensorLayout. */ - Params& cfgInputTensorLayout(std::string layout) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "input tensor layout") - .input_tensor_layout = std::move(layout); - return *this; - } - - /** @overload */ - Params& - cfgInputTensorLayout(detail::AttrMap layout_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "input tensor layout") - .input_tensor_layout = std::move(layout_map); - return *this; - } - - /** @see ov::Params::cfgInputModelLayout. */ - Params& cfgInputModelLayout(std::string layout) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "input model layout") - .input_model_layout = std::move(layout); - return *this; - } - - /** @overload */ - Params& - cfgInputModelLayout(detail::AttrMap layout_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "input model layout") - .input_model_layout = std::move(layout_map); - return *this; - } - - /** @see ov::Params::cfgOutputTensorLayout. */ - Params& cfgOutputTensorLayout(std::string layout) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output tensor layout") - .output_tensor_layout = std::move(layout); - return *this; - } - - /** @overload */ - Params& - cfgOutputTensorLayout(detail::AttrMap layout_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output tensor layout") - .output_tensor_layout = std::move(layout_map); - return *this; - } - - /** @see ov::Params::cfgOutputModelLayout. */ - Params& cfgOutputModelLayout(std::string layout) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output model layout") - .output_model_layout = std::move(layout); - return *this; - } - - /** @overload */ - Params& - cfgOutputModelLayout(detail::AttrMap layout_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output model layout") - .output_model_layout = std::move(layout_map); - return *this; - } - - /** @see ov::Params::cfgOutputTensorPrecision. */ - Params& cfgOutputTensorPrecision(int precision) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output tensor precision") - .output_tensor_precision = precision; - return *this; - } - - /** @overload */ - Params& - cfgOutputTensorPrecision(detail::AttrMap precision_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "output tensor precision") - .output_tensor_precision = std::move(precision_map); - return *this; - } - - /** @see ov::Params::cfgReshape. */ - Params& cfgReshape(std::vector new_shape) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "reshape") - .new_shapes = std::move(new_shape); - return *this; - } - - /** @overload */ - Params& - cfgReshape(detail::AttrMap> new_shape_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "reshape") - .new_shapes = std::move(new_shape_map); - return *this; - } - - /** @see ov::Params::cfgNumRequests. */ - Params& cfgNumRequests(const size_t nireq) { - if (nireq == 0) { - cv::util::throw_error( - std::logic_error("Number of inference requests" - " must be greater than zero.")); - } - m_desc.nireq = nireq; - return *this; - } - - /** @see ov::Params::cfgMean. */ - Params& cfgMean(std::vector mean_values) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "mean values") - .mean_values = std::move(mean_values); - return *this; - } - - /** @overload */ - Params& cfgMean(detail::AttrMap> mean_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "mean values") - .mean_values = std::move(mean_map); - return *this; - } - - /** @see ov::Params::cfgScale. */ - Params& cfgScale(std::vector scale_values) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "scale values") - .scale_values = std::move(scale_values); - return *this; - } - - /** @overload */ - Params& cfgScale(detail::AttrMap> scale_map) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "scale values") - .scale_values = std::move(scale_map); - return *this; - } - - /** @see ov::Params::cfgResize. */ - Params& cfgResize(int interpolation) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "resize preprocessing") - .interpolation = std::move(interpolation); - return *this; - } - - /** @overload */ - Params& cfgResize(detail::AttrMap interpolation) { - detail::getModelToSetAttrOrThrow(m_desc.kind, "resize preprocessing") - .interpolation = std::move(interpolation); - return *this; - } - - // BEGIN(G-API's network parametrization API) - GBackend backend() const { return cv::gapi::ov::backend(); } - std::string tag() const { return m_tag; } - cv::util::any params() const { return { m_desc }; } - // END(G-API's network parametrization API) - -protected: - std::string m_tag; - detail::ParamDesc m_desc; -}; - -} // namespace ov - -namespace wip { namespace ov { -/** - * @brief Ask G-API OpenVINO backend to run only inference of model provided. - * - * G-API OpenVINO backend will perform only the inference of the model provided - * without populating input and copying back output data. - * This mode is used to evaluate the pure inference performance of the model without - * taking into account the i/o data transfer. - */ -struct benchmark_mode { }; - -} // namespace ov -} // namespace wip - -} // namespace gapi - -namespace detail -{ - template<> struct CompileArgTag - { - static const char* tag() { return "gapi.wip.ov.benchmark_mode"; } - }; -} - -} // namespace cv - -#endif // OPENCV_GAPI_INFER_OV_HPP diff --git a/modules/gapi/include/opencv2/gapi/infer/parsers.hpp b/modules/gapi/include/opencv2/gapi/infer/parsers.hpp deleted file mode 100644 index e39d6fd4c6..0000000000 --- a/modules/gapi/include/opencv2/gapi/infer/parsers.hpp +++ /dev/null @@ -1,138 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - - -#ifndef OPENCV_GAPI_PARSERS_HPP -#define OPENCV_GAPI_PARSERS_HPP - -#include // std::tuple - -#include -#include - -namespace cv { namespace gapi { -namespace nn { -namespace parsers { - using GRects = GArray; - using GDetections = std::tuple, GArray>; - - G_TYPED_KERNEL(GParseSSDBL, , float, int)>, - "org.opencv.nn.parsers.parseSSD_BL") { - static std::tuple outMeta(const GMatDesc&, const GOpaqueDesc&, float, int) { - return std::make_tuple(empty_array_desc(), empty_array_desc()); - } - }; - - G_TYPED_KERNEL(GParseSSD, , float, bool, bool)>, - "org.opencv.nn.parsers.parseSSD") { - static GArrayDesc outMeta(const GMatDesc&, const GOpaqueDesc&, float, bool, bool) { - return empty_array_desc(); - } - }; - - G_TYPED_KERNEL(GParseYolo, , float, float, std::vector)>, - "org.opencv.nn.parsers.parseYolo") { - static std::tuple outMeta(const GMatDesc&, const GOpaqueDesc&, - float, float, const std::vector&) { - return std::make_tuple(empty_array_desc(), empty_array_desc()); - } - static const std::vector& defaultAnchors() { - static std::vector anchors { - 0.57273f, 0.677385f, 1.87446f, 2.06253f, 3.33843f, 5.47434f, 7.88282f, 3.52778f, 9.77052f, 9.16828f - }; - return anchors; - } - }; -} // namespace parsers -} // namespace nn - -/** @brief Parses output of SSD network. - -Extracts detection information (box, confidence, label) from SSD output and -filters it by given confidence and label. - -@note Function textual ID is "org.opencv.nn.parsers.parseSSD_BL" - -@param in Input CV_32F tensor with {1,1,N,7} dimensions. -@param inSz Size to project detected boxes to (size of the input image). -@param confidenceThreshold If confidence of the -detection is smaller than confidence threshold, detection is rejected. -@param filterLabel If provided (!= -1), only detections with -given label will get to the output. -@return a tuple with a vector of detected boxes and a vector of appropriate labels. -*/ -GAPI_EXPORTS_W std::tuple, GArray> parseSSD(const GMat& in, - const GOpaque& inSz, - const float confidenceThreshold = 0.5f, - const int filterLabel = -1); - -/** @brief Parses output of SSD network. - -Extracts detection information (box, confidence) from SSD output and -filters it by given confidence and by going out of bounds. - -@note Function textual ID is "org.opencv.nn.parsers.parseSSD" - -@param in Input CV_32F tensor with {1,1,N,7} dimensions. -@param inSz Size to project detected boxes to (size of the input image). -@param confidenceThreshold If confidence of the -detection is smaller than confidence threshold, detection is rejected. -@param alignmentToSquare If provided true, bounding boxes are extended to squares. -The center of the rectangle remains unchanged, the side of the square is -the larger side of the rectangle. -@param filterOutOfBounds If provided true, out-of-frame boxes are filtered. -@return a vector of detected bounding boxes. -*/ -GAPI_EXPORTS_W GArray parseSSD(const GMat& in, - const GOpaque& inSz, - const float confidenceThreshold, - const bool alignmentToSquare, - const bool filterOutOfBounds); - -/** @brief Parses output of Yolo network. - -Extracts detection information (box, confidence, label) from Yolo output, -filters it by given confidence and performs non-maximum suppression for overlapping boxes. - -@note Function textual ID is "org.opencv.nn.parsers.parseYolo" - -@param in Input CV_32F tensor with {1,13,13,N} dimensions, N should satisfy: -\f[\texttt{N} = (\texttt{num_classes} + \texttt{5}) * \texttt{5},\f] -where num_classes - a number of classes Yolo network was trained with. -@param inSz Size to project detected boxes to (size of the input image). -@param confidenceThreshold If confidence of the -detection is smaller than confidence threshold, detection is rejected. -@param nmsThreshold Non-maximum suppression threshold which controls minimum -relative box intersection area required for rejecting the box with a smaller confidence. -If 1.f, nms is not performed and no boxes are rejected. -@param anchors Anchors Yolo network was trained with. -@note The default anchor values are specified for YOLO v2 Tiny as described in Intel Open Model Zoo -documentation. -@return a tuple with a vector of detected boxes and a vector of appropriate labels. -*/ -GAPI_EXPORTS_W std::tuple, GArray> parseYolo(const GMat& in, - const GOpaque& inSz, - const float confidenceThreshold = 0.5f, - const float nmsThreshold = 0.5f, - const std::vector& anchors - = nn::parsers::GParseYolo::defaultAnchors()); - -} // namespace gapi -} // namespace cv - -// Reimport parseSSD & parseYolo under their initial namespace -namespace cv { -namespace gapi { -namespace streaming { - -using cv::gapi::parseSSD; -using cv::gapi::parseYolo; - -} // namespace streaming -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_PARSERS_HPP diff --git a/modules/gapi/include/opencv2/gapi/media.hpp b/modules/gapi/include/opencv2/gapi/media.hpp deleted file mode 100644 index 1470f00d04..0000000000 --- a/modules/gapi/include/opencv2/gapi/media.hpp +++ /dev/null @@ -1,258 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - -#ifndef OPENCV_GAPI_MEDIA_HPP -#define OPENCV_GAPI_MEDIA_HPP - -#include // unique_ptr<>, shared_ptr<> -#include // array<> -#include // function<> -#include // forward<>() - -#include -#include - -// Forward declaration -namespace cv { -namespace gapi { -namespace s11n { -struct IOStream; -struct IIStream; -} // namespace s11n -} // namespace gapi -} // namespace cv - -namespace cv { - -/** \addtogroup gapi_data_structures - * @{ - * - * @brief Extra G-API data structures used to pass input/output data - * to the graph for processing. - */ - -/** - * @brief cv::MediaFrame class represents an image/media frame - * obtained from an external source. - * - * cv::MediaFrame represents image data as specified in - * cv::MediaFormat. cv::MediaFrame is designed to be a thin wrapper over some - * external memory of buffer; the class itself provides an uniform - * interface over such types of memory. cv::MediaFrame wraps data from - * a camera driver or from a media codec and provides an abstraction - * layer over this memory to G-API. MediaFrame defines a compact interface - * to access and manage the underlying data; the implementation is - * fully defined by the associated Adapter (which is usually - * user-defined). - * - * @sa cv::RMat - */ -class GAPI_EXPORTS MediaFrame { -public: - /// This enum defines different types of cv::MediaFrame provided - /// access to the underlying data. Note that different flags can't - /// be combined in this version. - enum class Access { - R, ///< Access data for reading - W, ///< Access data for writing - }; - class IAdapter; - class View; - using AdapterPtr = std::unique_ptr; - - /** - * @brief Constructs an empty MediaFrame - * - * The constructed object has no any data associated with it. - */ - MediaFrame(); - - /** - * @brief Constructs a MediaFrame with the given - * Adapter. MediaFrame takes ownership over the passed adapter. - * - * @param p an unique pointer to instance of IAdapter derived class. - */ - explicit MediaFrame(AdapterPtr &&p); - - /** - * @overload - * @brief Constructs a MediaFrame with the given parameters for - * the Adapter. The adapter of type `T` is costructed on the fly. - * - * @param args list of arguments to construct an adapter of type - * `T`. - */ - template static cv::MediaFrame Create(Args&&... args); - - /** - * @brief Obtain access to the underlying data with the given - * mode. - * - * Depending on the associated Adapter and the data wrapped, this - * method may be cheap (e.g., the underlying memory is local) or - * costly (if the underlying memory is external or device - * memory). - * - * @param mode an access mode flag - * @return a MediaFrame::View object. The views should be handled - * carefully, refer to the MediaFrame::View documentation for details. - */ - View access(Access mode) const; - - /** - * @brief Returns a media frame descriptor -- the information - * about the media format, dimensions, etc. - * @return a cv::GFrameDesc - */ - cv::GFrameDesc desc() const; - - // FIXME: design a better solution - // Should be used only if the actual adapter provides implementation - /// @private -- exclude from the OpenCV documentation for now. - cv::util::any blobParams() const; - - /** - * @brief Casts and returns the associated MediaFrame adapter to - * the particular adapter type `T`, returns nullptr if the type is - * different. - * - * This method may be useful if the adapter type is known by the - * caller, and some lower level access to the memory is required. - * Depending on the memory type, it may be more efficient than - * access(). - * - * @return a pointer to the adapter object, nullptr if the adapter - * type is different. - */ - template T* get() const { - static_assert(std::is_base_of::value, - "T is not derived from cv::MediaFrame::IAdapter!"); - auto* adapter = getAdapter(); - GAPI_Assert(adapter != nullptr); - return dynamic_cast(adapter); - } - - /** - * @brief Serialize MediaFrame's data to a byte array. - * - * @note The actual logic is implemented by frame's adapter class. - * Does nothing by default. - * - * @param os Bytestream to store serialized MediaFrame data in. - */ - void serialize(cv::gapi::s11n::IOStream& os) const; - -private: - struct Priv; - std::shared_ptr m; - IAdapter* getAdapter() const; -}; - -template -inline cv::MediaFrame cv::MediaFrame::Create(Args&&... args) { - std::unique_ptr ptr(new T(std::forward(args)...)); - return cv::MediaFrame(std::move(ptr)); -} - -/** - * @brief Provides access to the MediaFrame's underlying data. - * - * This object contains the necessary information to access the pixel - * data of the associated MediaFrame: arrays of pointers and strides - * (distance between every plane row, in bytes) for every image - * plane, as defined in cv::MediaFormat. - * There may be up to four image planes in MediaFrame. - * - * Depending on the MediaFrame::Access flag passed in - * MediaFrame::access(), a MediaFrame::View may be read- or - * write-only. - * - * Depending on the MediaFrame::IAdapter implementation associated - * with the parent MediaFrame, writing to memory with - * MediaFrame::Access::R flag may have no effect or lead to - * undefined behavior. Same applies to reading the memory with - * MediaFrame::Access::W flag -- again, depending on the IAdapter - * implementation, the host-side buffer the view provides access to - * may have no current data stored in (so in-place editing of the - * buffer contents may not be possible). - * - * MediaFrame::View objects must be handled carefully, as an external - * resource associated with MediaFrame may be locked for the time the - * MediaFrame::View object exists. Obtaining MediaFrame::View should - * be seen as "map" and destroying it as "unmap" in the "map/unmap" - * idiom (applicable to OpenCL, device memory, remote - * memory). - * - * When a MediaFrame buffer is accessed for writing, and the memory - * under MediaFrame::View::Ptrs is altered, the data synchronization - * of a host-side and device/remote buffer is not guaranteed until the - * MediaFrame::View is destroyed. In other words, the real data on the - * device or in a remote target may be updated at the MediaFrame::View - * destruction only -- but it depends on the associated - * MediaFrame::IAdapter implementation. - */ -class GAPI_EXPORTS MediaFrame::View final { -public: - static constexpr const size_t MAX_PLANES = 4; - using Ptrs = std::array; - using Strides = std::array; // in bytes - using Callback = std::function; - - /// @private - View(Ptrs&& ptrs, Strides&& strs, Callback &&cb = [](){}); - - /// @private - View(const View&) = delete; - - /// @private - View(View&&) = default; - - /// @private - View& operator = (const View&) = delete; - - ~View(); - - Ptrs ptr; ///< Array of image plane pointers - Strides stride; ///< Array of image plane strides, in bytes. - -private: - Callback m_cb; -}; - -/** - * @brief An interface class for MediaFrame data adapters. - * - * Implement this interface to wrap media data in the MediaFrame. It - * makes sense to implement this class if there is a custom - * cv::gapi::wip::IStreamSource defined -- in this case, a stream - * source can produce MediaFrame objects with this adapter and the - * media data may be passed to graph without any copy. For example, a - * GStreamer-based stream source can implement an adapter over - * `GstBuffer` and G-API will transparently use it in the graph. - */ -class GAPI_EXPORTS MediaFrame::IAdapter { -public: - virtual ~IAdapter() = 0; - virtual cv::GFrameDesc meta() const = 0; - virtual MediaFrame::View access(MediaFrame::Access) = 0; - // FIXME: design a better solution - // The default implementation does nothing - virtual cv::util::any blobParams() const; - virtual void serialize(cv::gapi::s11n::IOStream&) { - GAPI_Error("Generic serialize method of MediaFrame::IAdapter does nothing by default. " - "Please, implement it in derived class to properly serialize the object."); - } - virtual void deserialize(cv::gapi::s11n::IIStream&) { - GAPI_Error("Generic deserialize method of MediaFrame::IAdapter does nothing by default. " - "Please, implement it in derived class to properly deserialize the object."); - } -}; -/** @} */ - -} //namespace cv - -#endif // OPENCV_GAPI_MEDIA_HPP diff --git a/modules/gapi/include/opencv2/gapi/oak/infer.hpp b/modules/gapi/include/opencv2/gapi/oak/infer.hpp deleted file mode 100644 index 4a1b9f6db6..0000000000 --- a/modules/gapi/include/opencv2/gapi/oak/infer.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// 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. -// -// Copyright (C) 2022 Intel Corporation - -#ifndef OPENCV_GAPI_OAK_INFER_HPP -#define OPENCV_GAPI_OAK_INFER_HPP - -#include -#include -#include -#include - -#include -#include - -#include // GAPI_EXPORTS -#include // GKernelPackage - -namespace cv { -namespace gapi { -namespace oak { - -namespace detail { -/** -* @brief This structure contains description of inference parameters -* which is specific to OAK models. -*/ -struct ParamDesc { - std::string blob_file; -}; -} // namespace detail - -/** - * Contains description of inference parameters and kit of functions that - * fill this parameters. - */ -template class Params { -public: - /** @brief Class constructor. - - Constructs Params based on model information and sets default values for other - inference description parameters. - - @param model Path to model (.blob file) - */ - explicit Params(const std::string &model) { - desc.blob_file = model; - }; - - // BEGIN(G-API's network parametrization API) - GBackend backend() const { return cv::gapi::oak::backend(); } - std::string tag() const { return Net::tag(); } - cv::util::any params() const { return { desc }; } - // END(G-API's network parametrization API) - -protected: - detail::ParamDesc desc; -}; - -} // namespace oak -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_OAK_INFER_HPP diff --git a/modules/gapi/include/opencv2/gapi/oak/oak.hpp b/modules/gapi/include/opencv2/gapi/oak/oak.hpp deleted file mode 100644 index 8b56b8a365..0000000000 --- a/modules/gapi/include/opencv2/gapi/oak/oak.hpp +++ /dev/null @@ -1,158 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_OAK_HPP -#define OPENCV_GAPI_OAK_HPP - -#include // IStreamSource -#include // GKernelPackage -#include // GOptRunArgsP - -namespace cv { -namespace gapi { -namespace oak { - -// FIXME: copypasted from dai library -struct EncoderConfig { - /** - * Rate control mode specifies if constant or variable bitrate should be used (H264 / H265) - */ - enum class RateControlMode: int { CBR, VBR }; - - /** - * Encoding profile, H264, H265 or MJPEG - */ - enum class Profile: int { H264_BASELINE, H264_HIGH, H264_MAIN, H265_MAIN, MJPEG }; - /** - * Specifies preferred bitrate (kb) of compressed output bitstream - */ - std::int32_t bitrate = 8000; - /** - * Every x number of frames a keyframe will be inserted - */ - std::int32_t keyframeFrequency = 30; - /** - * Specifies maximum bitrate (kb) of compressed output bitstream - */ - std::int32_t maxBitrate = 8000; - /** - * Specifies number of B frames to be inserted - */ - std::int32_t numBFrames = 0; - /** - * This options specifies how many frames are available in this nodes pool (can help if - * receiver node is slow at consuming - */ - std::uint32_t numFramesPool = 4; - /** - * Encoding profile, H264, H265 or MJPEG - */ - Profile profile = Profile::H265_MAIN; - /** - * Value between 0-100% (approximates quality) - */ - std::int32_t quality = 80; - /** - * Lossless mode ([M]JPEG only) - */ - bool lossless = false; - /** - * Rate control mode specifies if constant or variable bitrate should be used (H264 / H265) - */ - RateControlMode rateCtrlMode = RateControlMode::CBR; - /** - * Input and compressed output frame width - */ - std::int32_t width = 1920; - /** - * Input and compressed output frame height - */ - std::int32_t height = 1080; - /** - * Frame rate - */ - float frameRate = 30.0f; -}; - -G_API_OP(GEncFrame, (GFrame, EncoderConfig)>, "org.opencv.oak.enc_frame") { - static GArrayDesc outMeta(const GFrameDesc&, const EncoderConfig&) { - return cv::empty_array_desc(); - } -}; - -G_API_OP(GSobelXY, , "org.opencv.oak.sobelxy") { - static GFrameDesc outMeta(const GFrameDesc& in, const cv::Mat&, const cv::Mat&) { - return in; - } -}; - -G_API_OP(GCopy, , "org.opencv.oak.copy") { - static GFrameDesc outMeta(const GFrameDesc& in) { - return in; - } -}; - -// FIXME: add documentation on operations below - -GAPI_EXPORTS GArray encode(const GFrame& in, const EncoderConfig&); - -GAPI_EXPORTS GFrame sobelXY(const GFrame& in, - const cv::Mat& hk, - const cv::Mat& vk); - -GAPI_EXPORTS GFrame copy(const GFrame& in); - -// OAK backend & kernels //////////////////////////////////////////////////////// -GAPI_EXPORTS cv::gapi::GBackend backend(); -GAPI_EXPORTS cv::gapi::GKernelPackage kernels(); - -// Camera object /////////////////////////////////////////////////////////////// - -struct GAPI_EXPORTS ColorCameraParams { - /** - * Format of the frame one gets from the camera - */ - bool interleaved = false; - - // FIXME: extend - enum class BoardSocket: int { RGB, BGR }; - - BoardSocket board_socket = BoardSocket::RGB; - - // FIXME: extend - enum class Resolution: int { THE_1080_P }; - - Resolution resolution = Resolution::THE_1080_P; -}; - -class GAPI_EXPORTS ColorCamera: public cv::gapi::wip::IStreamSource { - cv::MediaFrame m_dummy; - ColorCameraParams m_params; - - virtual bool pull(cv::gapi::wip::Data &data) override; - virtual GMetaArg descr_of() const override; - -public: - ColorCamera(); - explicit ColorCamera(const ColorCameraParams& params); -}; - -} // namespace oak -} // namespace gapi - -namespace detail { -template<> struct CompileArgTag { - static const char* tag() { return "gapi.oak.colorCameraParams"; } -}; - -template<> struct CompileArgTag { - static const char* tag() { return "gapi.oak.encoderConfig"; } -}; -} // namespace detail - -} // namespace cv - -#endif // OPENCV_GAPI_OAK_HPP diff --git a/modules/gapi/include/opencv2/gapi/ocl/core.hpp b/modules/gapi/include/opencv2/gapi/ocl/core.hpp deleted file mode 100644 index b79aace0ca..0000000000 --- a/modules/gapi/include/opencv2/gapi/ocl/core.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_OCL_CORE_API_HPP -#define OPENCV_GAPI_OCL_CORE_API_HPP - -#include // GAPI_EXPORTS -#include // GKernelPackage - -namespace cv { -namespace gapi { -namespace core { -namespace ocl { - -GAPI_EXPORTS_W cv::GKernelPackage kernels(); - -} // namespace ocl -} // namespace core -} // namespace gapi -} // namespace cv - - -#endif // OPENCV_GAPI_OCL_CORE_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/ocl/goclkernel.hpp b/modules/gapi/include/opencv2/gapi/ocl/goclkernel.hpp deleted file mode 100644 index b09082282f..0000000000 --- a/modules/gapi/include/opencv2/gapi/ocl/goclkernel.hpp +++ /dev/null @@ -1,260 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GOCLKERNEL_HPP -#define OPENCV_GAPI_GOCLKERNEL_HPP - -#include -#include -#include -#include - -#include -#include -#include -#include - -// FIXME: namespace scheme for backends? -namespace cv { - -namespace gimpl -{ - // Forward-declare an internal class - class GOCLExecutable; -} // namespace gimpl - -namespace gapi -{ -/** - * @brief This namespace contains G-API OpenCL backend functions, structures, and symbols. - */ -namespace ocl -{ - /** - * \addtogroup gapi_std_backends G-API Standard Backends - * @{ - */ - /** - * @brief Get a reference to OCL backend. - * - * At the moment, the OCL backend is built atop of OpenCV - * "Transparent API" (T-API), see cv::UMat for details. - * - * @sa gapi_std_backends - */ - GAPI_EXPORTS cv::gapi::GBackend backend(); - /** @} */ -} // namespace ocl -} // namespace gapi - - -// Represents arguments which are passed to a wrapped OCL function -// FIXME: put into detail? -class GAPI_EXPORTS GOCLContext -{ -public: - // Generic accessor API - template - const T& inArg(int input) { return m_args.at(input).get(); } - - // Syntax sugar - const cv::UMat& inMat(int input); - cv::UMat& outMatR(int output); // FIXME: Avoid cv::Mat m = ctx.outMatR() - - const cv::Scalar& inVal(int input); - cv::Scalar& outValR(int output); // FIXME: Avoid cv::Scalar s = ctx.outValR() - template std::vector& outVecR(int output) // FIXME: the same issue - { - return outVecRef(output).wref(); - } - template T& outOpaqueR(int output) // FIXME: the same issue - { - return outOpaqueRef(output).wref(); - } - -protected: - detail::VectorRef& outVecRef(int output); - detail::OpaqueRef& outOpaqueRef(int output); - - std::vector m_args; - std::unordered_map m_results; - - - friend class gimpl::GOCLExecutable; -}; - -class GAPI_EXPORTS GOCLKernel -{ -public: - // This function is kernel's execution entry point (does the processing work) - using F = std::function; - - GOCLKernel(); - explicit GOCLKernel(const F& f); - - void apply(GOCLContext &ctx); - -protected: - F m_f; -}; - -// FIXME: This is an ugly ad-hoc implementation. TODO: refactor - -namespace detail -{ -template struct ocl_get_in; -template<> struct ocl_get_in -{ - static cv::UMat get(GOCLContext &ctx, int idx) { return ctx.inMat(idx); } -}; -template<> struct ocl_get_in -{ - static cv::Scalar get(GOCLContext &ctx, int idx) { return ctx.inVal(idx); } -}; -template struct ocl_get_in > -{ - static const std::vector& get(GOCLContext &ctx, int idx) { return ctx.inArg(idx).rref(); } -}; -template<> struct ocl_get_in -{ - static cv::MediaFrame get(GOCLContext &ctx, int idx) { return ctx.inArg(idx); } -}; -template struct ocl_get_in > -{ - static const U& get(GOCLContext &ctx, int idx) { return ctx.inArg(idx).rref(); } -}; -template struct ocl_get_in -{ - static T get(GOCLContext &ctx, int idx) { return ctx.inArg(idx); } -}; - -struct tracked_cv_umat{ - //TODO Think if T - API could reallocate UMat to a proper size - how do we handle this ? - //tracked_cv_umat(cv::UMat& m) : r{(m)}, original_data{m.getMat(ACCESS_RW).data} {} - tracked_cv_umat(cv::UMat& m) : r(m), original_data{ nullptr } {} - cv::UMat &r; // FIXME: It was a value (not a reference) before. - // Actually OCL backend should allocate its internal data! - uchar* original_data; - - operator cv::UMat& (){ return r;} - void validate() const{ - //if (r.getMat(ACCESS_RW).data != original_data) - //{ - // util::throw_error - // (std::logic_error - // ("OpenCV kernel output parameter was reallocated. \n" - // "Incorrect meta data was provided ?")); - //} - - } -}; - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4702) // unreachable code -#endif -template -void postprocess_ocl(Outputs&... outs) -{ - struct - { - void operator()(tracked_cv_umat* bm) { bm->validate(); } - void operator()(...) { } - - } validate; - //dummy array to unfold parameter pack - int dummy[] = { 0, (validate(&outs), 0)... }; - cv::util::suppress_unused_warning(dummy); -} -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -template struct ocl_get_out; -template<> struct ocl_get_out -{ - static tracked_cv_umat get(GOCLContext &ctx, int idx) - { - auto& r = ctx.outMatR(idx); - return{ r }; - } -}; -template<> struct ocl_get_out -{ - static cv::Scalar& get(GOCLContext &ctx, int idx) - { - return ctx.outValR(idx); - } -}; -template struct ocl_get_out > -{ - static std::vector& get(GOCLContext &ctx, int idx) { return ctx.outVecR(idx); } -}; -template struct ocl_get_out > -{ - static U& get(GOCLContext &ctx, int idx) { return ctx.outOpaqueR(idx); } -}; - -template -struct OCLCallHelper; - -// FIXME: probably can be simplified with std::apply or analogue. -template -struct OCLCallHelper, std::tuple > -{ - template - struct call_and_postprocess - { - template - static void call(Inputs&&... ins, Outputs&&... outs) - { - //not using a std::forward on outs is deliberate in order to - //cause compilation error, by trying to bind rvalue references to lvalue references - Impl::run(std::forward(ins)..., outs...); - - postprocess_ocl(outs...); - } - }; - - template - static void call_impl(GOCLContext &ctx, detail::Seq, detail::Seq) - { - //TODO: Make sure that OpenCV kernels do not reallocate memory for output parameters - //by comparing it's state (data ptr) before and after the call. - //Convert own::Scalar to cv::Scalar before call kernel and run kernel - //convert cv::Scalar to own::Scalar after call kernel and write back results - call_and_postprocess::get(ctx, IIs))...>::call(ocl_get_in::get(ctx, IIs)..., ocl_get_out::get(ctx, OIs)...); - } - - static void call(GOCLContext &ctx) - { - call_impl(ctx, - typename detail::MkSeq::type(), - typename detail::MkSeq::type()); - } -}; - -} // namespace detail - -template -class GOCLKernelImpl: public cv::detail::OCLCallHelper, - public cv::detail::KernelTag -{ - using P = detail::OCLCallHelper; - -public: - using API = K; - - static cv::gapi::GBackend backend() { return cv::gapi::ocl::backend(); } - static cv::GOCLKernel kernel() { return GOCLKernel(&P::call); } -}; - -#define GAPI_OCL_KERNEL(Name, API) struct Name: public cv::GOCLKernelImpl - -} // namespace cv - -#endif // OPENCV_GAPI_GOCLKERNEL_HPP diff --git a/modules/gapi/include/opencv2/gapi/ocl/imgproc.hpp b/modules/gapi/include/opencv2/gapi/ocl/imgproc.hpp deleted file mode 100644 index 1bb5911b18..0000000000 --- a/modules/gapi/include/opencv2/gapi/ocl/imgproc.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_OCL_IMGPROC_API_HPP -#define OPENCV_GAPI_OCL_IMGPROC_API_HPP - -#include // GAPI_EXPORTS -#include // GKernelPackage - -namespace cv { -namespace gapi { -namespace imgproc { -namespace ocl { - - GAPI_EXPORTS GKernelPackage kernels(); - -} // namespace ocl -} // namespace imgproc -} // namespace gapi -} // namespace cv - - -#endif // OPENCV_GAPI_OCL_IMGPROC_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/opencv_includes.hpp b/modules/gapi/include/opencv2/gapi/opencv_includes.hpp deleted file mode 100644 index 7c2c42d8a2..0000000000 --- a/modules/gapi/include/opencv2/gapi/opencv_includes.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_OPENCV_INCLUDES_HPP -#define OPENCV_GAPI_OPENCV_INCLUDES_HPP - -#if !defined(GAPI_STANDALONE) -# include -# include -# include -# include -#define GAPI_OWN_TYPES_LIST cv::gapi::own::Rect, \ - cv::gapi::own::Size, \ - cv::gapi::own::Point, \ - cv::gapi::own::Point2f, \ - cv::gapi::own::Scalar, \ - cv::gapi::own::Mat -#else // Without OpenCV -# include -# include // cv::gapi::own::Rect/Size/Point -# include // cv::gapi::own::Scalar -# include -// replacement of cv's structures: -namespace cv { - using Rect = gapi::own::Rect; - using Size = gapi::own::Size; - using Point = gapi::own::Point; - using Point2f = gapi::own::Point2f; - using Point3f = gapi::own::Point3f; - using Scalar = gapi::own::Scalar; - using Mat = gapi::own::Mat; -} // namespace cv -#define GAPI_OWN_TYPES_LIST cv::gapi::own::VoidType - -#endif // !defined(GAPI_STANDALONE) - -#endif // OPENCV_GAPI_OPENCV_INCLUDES_HPP diff --git a/modules/gapi/include/opencv2/gapi/operators.hpp b/modules/gapi/include/opencv2/gapi/operators.hpp deleted file mode 100644 index 6794b44b6e..0000000000 --- a/modules/gapi/include/opencv2/gapi/operators.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_OPERATORS_HPP -#define OPENCV_GAPI_OPERATORS_HPP - -#include -#include - -namespace cv -{ -GAPI_EXPORTS cv::GMat operator+(const cv::GMat& lhs, const cv::GMat& rhs); - -GAPI_EXPORTS cv::GMat operator+(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator+(const cv::GScalar& lhs, const cv::GMat& rhs); - -GAPI_EXPORTS cv::GMat operator-(const cv::GMat& lhs, const cv::GMat& rhs); - -GAPI_EXPORTS cv::GMat operator-(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator-(const cv::GScalar& lhs, const cv::GMat& rhs); - -GAPI_EXPORTS cv::GMat operator*(const cv::GMat& lhs, float rhs); -GAPI_EXPORTS cv::GMat operator*(float lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator*(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator*(const cv::GScalar& lhs, const cv::GMat& rhs); - -GAPI_EXPORTS cv::GMat operator/(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator/(const cv::GScalar& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator/(const cv::GMat& lhs, const cv::GMat& rhs); - -GAPI_EXPORTS cv::GMat operator&(const cv::GMat& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator|(const cv::GMat& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator^(const cv::GMat& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator~(const cv::GMat& lhs); - -GAPI_EXPORTS cv::GMat operator&(const cv::GScalar& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator|(const cv::GScalar& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator^(const cv::GScalar& lhs, const cv::GMat& rhs); - -GAPI_EXPORTS cv::GMat operator&(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator|(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator^(const cv::GMat& lhs, const cv::GScalar& rhs); - -GAPI_EXPORTS cv::GMat operator>(const cv::GMat& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator>=(const cv::GMat& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator<(const cv::GMat& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator<=(const cv::GMat& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator==(const cv::GMat& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator!=(const cv::GMat& lhs, const cv::GMat& rhs); - -GAPI_EXPORTS cv::GMat operator>(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator>=(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator<(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator<=(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator==(const cv::GMat& lhs, const cv::GScalar& rhs); -GAPI_EXPORTS cv::GMat operator!=(const cv::GMat& lhs, const cv::GScalar& rhs); - -GAPI_EXPORTS cv::GMat operator>(const cv::GScalar& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator>=(const cv::GScalar& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator<(const cv::GScalar& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator<=(const cv::GScalar& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator==(const cv::GScalar& lhs, const cv::GMat& rhs); -GAPI_EXPORTS cv::GMat operator!=(const cv::GScalar& lhs, const cv::GMat& rhs); -} // cv - -#endif // OPENCV_GAPI_OPERATORS_HPP diff --git a/modules/gapi/include/opencv2/gapi/ot.hpp b/modules/gapi/include/opencv2/gapi/ot.hpp deleted file mode 100644 index b73d7e6ee0..0000000000 --- a/modules/gapi/include/opencv2/gapi/ot.hpp +++ /dev/null @@ -1,194 +0,0 @@ -// 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. -// -// Copyright (C) 2023 Intel Corporation - -#ifndef OPENCV_GAPI_OT_HPP -#define OPENCV_GAPI_OT_HPP - -#include -#include -#include - -namespace cv { -namespace gapi { -/** - * @brief This namespace contains G-API Operation Types for - * VAS Object Tracking module functionality. - */ -namespace ot { - -/** - * @enum TrackingStatus - * - * Tracking status twin for vas::ot::TrackingStatus - */ -enum TrackingStatus -{ - NEW = 0, /**< The object is newly added. */ - TRACKED, /**< The object is being tracked. */ - LOST /**< The object gets lost now. The object can be tracked again - by specifying detected object manually. */ -}; - -struct GAPI_EXPORTS_W_SIMPLE ObjectTrackerParams -{ - /** - * Maximum number of trackable objects in a frame. - * Valid range: 1 <= max_num_objects. Or it can be -1 if there is no limitation - * of maximum number in X86. KMB/TBH has limitation up to 1024. - * Default value is -1 which means there is no limitation in X86. KMB/TBH is -1 means 200. - */ - GAPI_PROP_RW int32_t max_num_objects = -1; - - /** - * Input color format. Supports 0(BGR), 1(NV12), 2(BGRX) and 4(I420) - */ - GAPI_PROP_RW int32_t input_image_format = 0; - - /** - * Specifies whether tracker to use detection class for keeping id of an object. - * If it is true, new detection will be associated from previous tracking only when - * those two have same class. - * class id of an object is fixed across video frames. - * If it is false, new detection can be associated across different-class objects. - * In this case, the class id of an object may change across video frames depending on the tracker input. - * It is recommended to turn this option off when it is likely that detector confuses the class of object. - * For example, when detector confuses bicycle and motorbike. Turning this option off will increase - * the tracking reliability as tracker will ignore the class label of detector. - * @n - * Default value is true. - */ - GAPI_PROP_RW bool tracking_per_class = true; - - bool operator==(const ObjectTrackerParams& other) const - { - return max_num_objects == other.max_num_objects - && input_image_format == other.input_image_format - && tracking_per_class == other.tracking_per_class; - } -}; - -using GTrackedInfo = std::tuple, cv::GArray, cv::GArray, cv::GArray>; - -G_API_OP(GTrackFromMat, , cv::GArray, float)>, "com.intel.track_from_mat") -{ - static std::tuple outMeta(cv::GMatDesc, cv::GArrayDesc, cv::GArrayDesc, float) - { - return std::make_tuple(cv::empty_array_desc(), cv::empty_array_desc(), - cv::empty_array_desc(), cv::empty_array_desc()); - } -}; - -G_API_OP(GTrackFromFrame, , cv::GArray, float)>, "com.intel.track_from_frame") -{ - static std::tuple outMeta(cv::GFrameDesc, cv::GArrayDesc, cv::GArrayDesc, float) - { - return std::make_tuple(cv::empty_array_desc(), cv::empty_array_desc(), - cv::empty_array_desc(), cv::empty_array_desc()); - } -}; - -/** - * @brief Tracks objects with video frames. - * If a detected object is overlapped enough with one of tracked object, the tracked object's - * informationis updated with the input detected object. - * On the other hand, if a detected object is overlapped with none of tracked objects, - * the detected object is newly added and ObjectTracker starts to track the object. - * In zero term tracking type, ObjectTracker clears tracked objects in case that empty - * list of detected objects is passed in. - * - * @param mat Input frame. - * @param detected_rects Detected objects rectangles in the input frame. - * @param detected_class_labels Detected objects class labels in the input frame. - * @param delta Frame_delta_t Delta time between two consecutive tracking in seconds. - * The valid range is [0.005 ~ 0.5]. - * @return Tracking results of target objects. - * cv::GArray Array of rectangles for tracked objects. - * cv::GArray Array of detected objects labels. - * cv::GArray Array of tracking IDs for objects. - * Numbering sequence starts from 1. - * The value 0 means the tracking ID of this object has - * not been assigned. - * cv::GArray Array of tracking statuses for objects. - */ -GAPI_EXPORTS_W std::tuple, - cv::GArray, - cv::GArray, - cv::GArray> - track(const cv::GMat& mat, - const cv::GArray& detected_rects, - const cv::GArray& detected_class_labels, - float delta); - - -/** - @overload - * @brief Tracks objects with video frames. Overload of track(...) for frame as GFrame. - * - * @param frame Input frame. - * @param detected_rects Detected objects rectangles in the input frame. - * @param detected_class_labels Detected objects class labels in the input frame. - * @param delta Frame_delta_t Delta time between two consecutive tracking in seconds. - * The valid range is [0.005 ~ 0.5]. - * @return Tracking results of target objects. - * @return Tracking results of target objects. - * cv::GArray Array of rectangles for tracked objects. - * cv::GArray Array of detected objects labels. - * cv::GArray Array of tracking IDs for objects. - * Numbering sequence starts from 1. - * The value 0 means the tracking ID of this object has - * not been assigned. - * cv::GArray Array of tracking statuses for objects. - */ -GAPI_EXPORTS_W std::tuple, - cv::GArray, - cv::GArray, - cv::GArray> - track(const cv::GFrame& frame, - const cv::GArray& detected_rects, - const cv::GArray& detected_class_labels, - float delta); -} // namespace ot -} // namespace gapi -} // namespace cv - -// FIXME: move to a separate file? -namespace cv -{ -namespace detail -{ -template<> struct CompileArgTag -{ - static const char* tag() - { - return "cv.gapi.ot.object_tracker_params"; - } -}; -} // namespace detail - -namespace gapi -{ -namespace s11n -{ -namespace detail -{ -template<> struct S11N { - static void serialize(IOStream &os, const cv::gapi::ot::ObjectTrackerParams &p) { - os << p. max_num_objects << p.input_image_format << p.tracking_per_class; - } - static cv::gapi::ot::ObjectTrackerParams deserialize(IIStream &is) { - cv::gapi::ot::ObjectTrackerParams p; - is >> p. max_num_objects >> p.input_image_format >> p.tracking_per_class; - return p; - } -}; -} // namespace detail -} // namespace s11n -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_OT_HPP diff --git a/modules/gapi/include/opencv2/gapi/own/assert.hpp b/modules/gapi/include/opencv2/gapi/own/assert.hpp deleted file mode 100644 index ab2fb896f1..0000000000 --- a/modules/gapi/include/opencv2/gapi/own/assert.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_OWN_ASSERT_HPP -#define OPENCV_GAPI_OWN_ASSERT_HPP - -#include - -#define GAPI_DbgAssertNoOp(expr) { \ - constexpr bool _assert_tmp = false && (expr); \ - cv::util::suppress_unused_warning(_assert_tmp); \ -} - -#if !defined(GAPI_STANDALONE) -#include -#define GAPI_Assert CV_Assert - -#if defined _DEBUG || defined CV_STATIC_ANALYSIS -# define GAPI_DbgAssert CV_DbgAssert -#else -# define GAPI_DbgAssert(expr) GAPI_DbgAssertNoOp(expr) -#endif - -#define GAPI_Error(msg) CV_Error(cv::Error::StsError, msg) - -#else -#include -#include -#include - -namespace detail -{ - [[noreturn]] inline void assert_abort(const char* str, int line, const char* file, const char* func) - { - std::stringstream ss; - ss << file << ":" << line << ": Assertion " << str << " in function " << func << " failed\n"; - cv::util::throw_error(std::logic_error(ss.str())); - } -} - -#define GAPI_Assert(expr) \ -{ if (!(expr)) ::detail::assert_abort(#expr, __LINE__, __FILE__, __func__); } - -#ifdef NDEBUG -# define GAPI_DbgAssert(expr) GAPI_DbgAssertNoOp(expr) -#else -# define GAPI_DbgAssert(expr) GAPI_Assert(expr) -#endif - -#define GAPI_Error(msg) { \ - ::detail::assert_abort(msg, __LINE__, __FILE__, __func__); \ -} - -#endif // GAPI_STANDALONE - -#endif // OPENCV_GAPI_OWN_ASSERT_HPP diff --git a/modules/gapi/include/opencv2/gapi/own/convert.hpp b/modules/gapi/include/opencv2/gapi/own/convert.hpp deleted file mode 100644 index 7bebec9cf0..0000000000 --- a/modules/gapi/include/opencv2/gapi/own/convert.hpp +++ /dev/null @@ -1,55 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_OWN_CONVERT_HPP -#define OPENCV_GAPI_OWN_CONVERT_HPP - -#if !defined(GAPI_STANDALONE) - -#include -#include - -namespace cv -{ - template - std::vector to_own(const cv::MatSize &sz) { - std::vector result(sz.dims()); - for (int i = 0; i < sz.dims(); i++) { - // Note: cv::MatSize is not iterable - result[i] = static_cast(sz[i]); - } - return result; - } - - cv::gapi::own::Mat to_own(Mat&&) = delete; - - inline cv::gapi::own::Mat to_own(Mat const& m) { - return (m.dims <= 2) - ? cv::gapi::own::Mat{m.rows, m.cols, m.type(), m.data, m.step} - : cv::gapi::own::Mat{to_own(m.size), m.type(), m.data}; - } - -namespace gapi -{ -namespace own -{ - - inline cv::Mat to_ocv(Mat const& m) { - return m.dims.empty() - ? cv::Mat{m.rows, m.cols, m.type(), m.data, m.step} - : cv::Mat{m.dims, m.type(), m.data}; - } - - cv::Mat to_ocv(Mat&&) = delete; - -} // namespace own -} // namespace gapi -} // namespace cv - -#endif // !defined(GAPI_STANDALONE) - -#endif // OPENCV_GAPI_OWN_CONVERT_HPP diff --git a/modules/gapi/include/opencv2/gapi/own/cvdefs.hpp b/modules/gapi/include/opencv2/gapi/own/cvdefs.hpp deleted file mode 100644 index d3bef98e98..0000000000 --- a/modules/gapi/include/opencv2/gapi/own/cvdefs.hpp +++ /dev/null @@ -1,166 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_CV_DEFS_HPP -#define OPENCV_GAPI_CV_DEFS_HPP - -#if defined(GAPI_STANDALONE) -// Simulate OpenCV definitions taken from various -// OpenCV interface headers if G-API is built in a -// standalone mode. - -// interface.h: - -typedef unsigned char uchar; -typedef char schar; - -typedef unsigned short ushort; - -#define CV_USRTYPE1 (void)"CV_USRTYPE1 support has been dropped in OpenCV 4.0" - -#define CV_CN_MAX 512 -#define CV_CN_SHIFT 3 -#define CV_DEPTH_MAX (1 << CV_CN_SHIFT) - -#define CV_8U 0 -#define CV_8S 1 -#define CV_16U 2 -#define CV_16S 3 -#define CV_32S 4 -#define CV_32F 5 -#define CV_64F 6 -#define CV_16F 7 - -#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1) -#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK) - -#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT)) -#define CV_MAKE_TYPE CV_MAKETYPE - -#define CV_8UC1 CV_MAKETYPE(CV_8U,1) -#define CV_8UC2 CV_MAKETYPE(CV_8U,2) -#define CV_8UC3 CV_MAKETYPE(CV_8U,3) -#define CV_8UC4 CV_MAKETYPE(CV_8U,4) -#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) - -#define CV_8SC1 CV_MAKETYPE(CV_8S,1) -#define CV_8SC2 CV_MAKETYPE(CV_8S,2) -#define CV_8SC3 CV_MAKETYPE(CV_8S,3) -#define CV_8SC4 CV_MAKETYPE(CV_8S,4) -#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) - -#define CV_16UC1 CV_MAKETYPE(CV_16U,1) -#define CV_16UC2 CV_MAKETYPE(CV_16U,2) -#define CV_16UC3 CV_MAKETYPE(CV_16U,3) -#define CV_16UC4 CV_MAKETYPE(CV_16U,4) -#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) - -#define CV_16SC1 CV_MAKETYPE(CV_16S,1) -#define CV_16SC2 CV_MAKETYPE(CV_16S,2) -#define CV_16SC3 CV_MAKETYPE(CV_16S,3) -#define CV_16SC4 CV_MAKETYPE(CV_16S,4) -#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) - -#define CV_32SC1 CV_MAKETYPE(CV_32S,1) -#define CV_32SC2 CV_MAKETYPE(CV_32S,2) -#define CV_32SC3 CV_MAKETYPE(CV_32S,3) -#define CV_32SC4 CV_MAKETYPE(CV_32S,4) -#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) - -#define CV_16FC1 CV_MAKETYPE(CV_16F,1) -#define CV_16FC2 CV_MAKETYPE(CV_16F,2) -#define CV_16FC3 CV_MAKETYPE(CV_16F,3) -#define CV_16FC4 CV_MAKETYPE(CV_16F,4) -#define CV_16FC(n) CV_MAKETYPE(CV_16F,(n)) - -#define CV_32FC1 CV_MAKETYPE(CV_32F,1) -#define CV_32FC2 CV_MAKETYPE(CV_32F,2) -#define CV_32FC3 CV_MAKETYPE(CV_32F,3) -#define CV_32FC4 CV_MAKETYPE(CV_32F,4) -#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) - -#define CV_64FC1 CV_MAKETYPE(CV_64F,1) -#define CV_64FC2 CV_MAKETYPE(CV_64F,2) -#define CV_64FC3 CV_MAKETYPE(CV_64F,3) -#define CV_64FC4 CV_MAKETYPE(CV_64F,4) -#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n)) - -// cvdef.h: - -#ifndef CV_ALWAYS_INLINE -# if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -# define CV_ALWAYS_INLINE inline __attribute__((always_inline)) -# elif defined(_MSC_VER) -# define CV_ALWAYS_INLINE __forceinline -# else -# define CV_ALWAYS_INLINE inline -# endif -#endif - -#define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT) -#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1) -#define CV_MAT_TYPE_MASK (CV_DEPTH_MAX*CV_CN_MAX - 1) -#define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK) -#define CV_MAT_CONT_FLAG_SHIFT 14 -#define CV_MAT_CONT_FLAG (1 << CV_MAT_CONT_FLAG_SHIFT) -#define CV_IS_MAT_CONT(flags) ((flags) & CV_MAT_CONT_FLAG) -#define CV_IS_CONT_MAT CV_IS_MAT_CONT -#define CV_SUBMAT_FLAG_SHIFT 15 -#define CV_SUBMAT_FLAG (1 << CV_SUBMAT_FLAG_SHIFT) -#define CV_IS_SUBMAT(flags) ((flags) & CV_MAT_SUBMAT_FLAG) - -//** Size of each channel item, -// 0x8442211 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */ -#define CV_ELEM_SIZE1(type) \ - ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15) - -#define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK) - -/** 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */ -#define CV_ELEM_SIZE(type) \ - (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3)) - -#ifndef CV_OVERRIDE -# define CV_OVERRIDE override -#endif - -// base.h: -namespace cv -{ -enum BorderTypes { - BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i` - BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh` - BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb` - BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg` - BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba` - BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno` - - BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101 - BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101 - BORDER_ISOLATED = 16 //!< do not look outside of ROI -}; -// imgproc.hpp: -enum InterpolationFlags{ - INTER_NEAREST = 0, - INTER_LINEAR = 1, - INTER_CUBIC = 2, - INTER_AREA = 3, - INTER_LANCZOS4 = 4, - INTER_LINEAR_EXACT = 5, - INTER_MAX = 7, -}; -} // namespace cv - -static inline int cvFloor( double value ) -{ - int i = (int)value; - return i - (i > value); -} - -#endif // defined(GAPI_STANDALONE) - -#endif // OPENCV_GAPI_CV_DEFS_HPP diff --git a/modules/gapi/include/opencv2/gapi/own/exports.hpp b/modules/gapi/include/opencv2/gapi/own/exports.hpp deleted file mode 100644 index c36f4003d0..0000000000 --- a/modules/gapi/include/opencv2/gapi/own/exports.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_OWN_TYPES_HPP -#define OPENCV_GAPI_OWN_TYPES_HPP - -# if defined(__OPENCV_BUILD) -# include -# define GAPI_EXPORTS CV_EXPORTS - /* special informative macros for wrapper generators */ -# define GAPI_PROP CV_PROP -# define GAPI_PROP_RW CV_PROP_RW -# define GAPI_WRAP CV_WRAP -# define GAPI_EXPORTS_W_SIMPLE CV_EXPORTS_W_SIMPLE -# define GAPI_EXPORTS_W CV_EXPORTS_W -# else -# define GAPI_PROP -# define GAPI_PROP_RW -# define GAPI_WRAP -# define GAPI_EXPORTS -# define GAPI_EXPORTS_W_SIMPLE -# define GAPI_EXPORTS_W - -#if 0 // Note: the following version currently is not needed for non-OpenCV build -# if defined _WIN32 -# define GAPI_EXPORTS __declspec(dllexport) -# elif defined __GNUC__ && __GNUC__ >= 4 -# define GAPI_EXPORTS __attribute__ ((visibility ("default"))) -# endif - -# ifndef GAPI_EXPORTS -# define GAPI_EXPORTS -# endif -#endif - -# endif - -#endif // OPENCV_GAPI_OWN_TYPES_HPP diff --git a/modules/gapi/include/opencv2/gapi/own/mat.hpp b/modules/gapi/include/opencv2/gapi/own/mat.hpp deleted file mode 100644 index ce9c0bf362..0000000000 --- a/modules/gapi/include/opencv2/gapi/own/mat.hpp +++ /dev/null @@ -1,354 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_OWN_MAT_HPP -#define OPENCV_GAPI_OWN_MAT_HPP - -#include -#include -#include -#include -#include - -#include //std::shared_ptr -#include //std::memcpy -#include //std::accumulate -#include -#include - -namespace cv { namespace gapi { namespace own { - namespace detail { - template - void assign_row(void* ptr, int cols, Scalar const& s) - { - auto p = static_cast(ptr); - for (int c = 0; c < cols; c++) - { - for (int ch = 0; ch < channels; ch++) - { - p[c * channels + ch] = saturate(s[ch], roundd); - } - } - } - - inline size_t default_step(int type, int cols) - { - return CV_ELEM_SIZE(type) * cols; - } - //Matrix header, i.e. fields that are unique to each Mat object. - //Devoted class is needed to implement custom behavior on move (erasing state of moved from object) - struct MatHeader{ - enum { AUTO_STEP = 0}; - enum { TYPE_MASK = 0x00000FFF }; - - MatHeader() = default; - - MatHeader(int _rows, int _cols, int type, void* _data, size_t _step) - : flags((type & TYPE_MASK)), rows(_rows), cols(_cols), data((uchar*)_data), step(_step == AUTO_STEP ? detail::default_step(type, _cols) : _step) - {} - - MatHeader(const std::vector &_dims, int type, void* _data) - : flags((type & TYPE_MASK)), data((uchar*)_data), step(0), dims(_dims) - {} - - MatHeader(const MatHeader& ) = default; - MatHeader(MatHeader&& src) : MatHeader(src) // reuse copy constructor here - { - MatHeader empty; //give it a name to call copy(not move) assignment below - src = empty; - } - MatHeader& operator=(const MatHeader& ) = default; - MatHeader& operator=(MatHeader&& src) - { - *this = src; //calling a copy assignment here, not move one - MatHeader empty; //give it a name to call copy(not move) assignment below - src = empty; - return *this; - } - /*! includes several bit-fields: - - depth - - number of channels - */ - int flags = 0; - - //! the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions - int rows = 0, cols = 0; - //! pointer to the data - uchar* data = nullptr; - size_t step = 0; - //! dimensions (ND-case) - std::vector dims; - }; - } // namespace detail - //concise version of cv::Mat suitable for GAPI needs (used when no dependence on OpenCV is required) - class Mat : public detail::MatHeader{ - public: - - Mat() = default; - - /** @overload - @param _rows Number of rows in a 2D array. - @param _cols Number of columns in a 2D array. - @param _type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or - CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. - @param _data Pointer to the user data. Matrix constructors that take data and step parameters do not - allocate matrix data. Instead, they just initialize the matrix header that points to the specified - data, which means that no data is copied. This operation is very efficient and can be used to - process external data using OpenCV functions. The external data is not automatically deallocated, so - you should take care of it. - @param _step Number of bytes each matrix row occupies. The value should include the padding bytes at - the end of each row, if any. If the parameter is missing (set to AUTO_STEP ), no padding is assumed - and the actual step is calculated as cols*elemSize(). See Mat::elemSize. - */ - Mat(int _rows, int _cols, int _type, void* _data, size_t _step = AUTO_STEP) - : MatHeader (_rows, _cols, _type, _data, _step) - {} - - Mat(const std::vector &_dims, int _type, void* _data) - : MatHeader (_dims, _type, _data) - {} - - Mat(std::vector &&_dims, int _type, void* _data) - : MatHeader (std::move(_dims), _type, _data) - {} - - Mat(Mat const& src, const Rect& roi ) - : Mat(src) - { - rows = roi.height; - cols = roi.width; - data = ptr(roi.y, roi.x); - } - - Mat(Mat const& ) = default; - Mat(Mat&& ) = default; - - Mat& operator=(Mat const& ) = default; - Mat& operator=(Mat&& ) = default; - - /** @brief Sets all or some of the array elements to the specified value. - @param s Assigned scalar converted to the actual array type. - */ - Mat& operator = (const Scalar& s) - { - constexpr unsigned max_channels = 4; //Scalar can't fit more than 4 - using func_p_t = void (*)(void*, int, Scalar const&); - using detail::assign_row; - #define TABLE_ENTRY(type) {assign_row, assign_row, assign_row, assign_row} - static constexpr func_p_t func_tbl[][max_channels] = { - TABLE_ENTRY(uchar), - TABLE_ENTRY(schar), - TABLE_ENTRY(ushort), - TABLE_ENTRY(short), - TABLE_ENTRY(int), - TABLE_ENTRY(float), - TABLE_ENTRY(double) - }; - #undef TABLE_ENTRY - - static_assert(CV_8U == 0 && CV_8S == 1 && CV_16U == 2 && CV_16S == 3 - && CV_32S == 4 && CV_32F == 5 && CV_64F == 6, - "OCV type ids used as indexes to array, thus exact numbers are important!" - ); - - const auto depth = static_cast(this->depth()); - GAPI_Assert(depth < sizeof(func_tbl)/sizeof(func_tbl[0])); - - if (dims.empty()) - { - const auto channels = static_cast(this->channels()); - GAPI_Assert(channels <= max_channels); - - auto* f = func_tbl[depth][channels - 1]; - for (int r = 0; r < rows; ++r) - { - (*f)(static_cast(ptr(r)), cols, s ); - } - } - else - { - auto* f = func_tbl[depth][0]; - // FIXME: better to refactor assign_row to use std::size_t by default - (*f)(static_cast(data), static_cast(total()), s); - } - return *this; - } - - /** @brief Returns the matrix element size in bytes. - - The method returns the matrix element size in bytes. For example, if the matrix type is CV_16SC3 , - the method returns 3\*sizeof(short) or 6. - */ - size_t elemSize() const - { - return CV_ELEM_SIZE(type()); - } - /** @brief Returns the type of a matrix element. - - The method returns a matrix element type. This is an identifier compatible with the CvMat type - system, like CV_16SC3 or 16-bit signed 3-channel array, and so on. - */ - int type() const {return CV_MAT_TYPE(flags);} - - /** @brief Returns the depth of a matrix element. - - The method returns the identifier of the matrix element depth (the type of each individual channel). - For example, for a 16-bit signed element array, the method returns CV_16S . A complete list of - matrix types contains the following values: - - CV_8U - 8-bit unsigned integers ( 0..255 ) - - CV_8S - 8-bit signed integers ( -128..127 ) - - CV_16U - 16-bit unsigned integers ( 0..65535 ) - - CV_16S - 16-bit signed integers ( -32768..32767 ) - - CV_32S - 32-bit signed integers ( -2147483648..2147483647 ) - - CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN ) - - CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN ) - */ - int depth() const {return CV_MAT_DEPTH(flags);} - - /** @brief Returns the number of matrix channels. - - The method returns the number of matrix channels. - If matrix is N-dimensional, -1 is returned. - */ - int channels() const {return dims.empty() ? CV_MAT_CN(flags) : -1;} - - /** - @param _rows New number of rows. - @param _cols New number of columns. - @param _type New matrix type. - */ - void create(int _rows, int _cols, int _type) - { - create(Size{_cols, _rows}, _type); - } - /** @overload - @param _size Alternative new matrix size specification: Size(cols, rows) - @param _type New matrix type. - */ - void create(Size _size, int _type) - { - GAPI_Assert(_size.height >= 0 && _size.width >= 0); - if (_size != Size{cols, rows} ) - { - Mat tmp{_size.height, _size.width, _type, nullptr}; - tmp.memory.reset(new uchar[ tmp.step * tmp.rows], [](uchar * p){delete[] p;}); - tmp.data = tmp.memory.get(); - - *this = std::move(tmp); - } - } - - void create(const std::vector &_dims, int _type) - { - // FIXME: make a proper reallocation-on-demands - // WARNING: no tensor views, so no strides - Mat tmp{_dims, _type, nullptr}; - // FIXME: this accumulate duplicates a lot - const auto sz = std::accumulate(_dims.begin(), _dims.end(), 1, std::multiplies()); - tmp.memory.reset(new uchar[CV_ELEM_SIZE(_type)*sz], [](uchar * p){delete[] p;}); - tmp.data = tmp.memory.get(); - *this = std::move(tmp); - } - - /** @brief Creates a full copy of the matrix and the underlying data. - - The method creates a full copy of the matrix. The original step[] is not taken into account. - So, the copy has a continuous buffer occupying total() * elemSize() bytes. - */ - Mat clone() const - { - Mat m; - copyTo(m); - return m; - } - - /** @brief Copies the matrix to another one. - - The method copies the matrix data to another matrix. Before copying the data, the method invokes : - @code - m.create(this->size(), this->type()); - @endcode - so that the destination matrix is reallocated if needed. While m.copyTo(m); works flawlessly, the - function does not handle the case of a partial overlap between the source and the destination - matrices. - */ - void copyTo(Mat& dst) const - { - if (dims.empty()) - { - dst.create(rows, cols, type()); - for (int r = 0; r < rows; ++r) - { - std::copy_n(ptr(r), detail::default_step(type(),cols), dst.ptr(r)); - } - } - else - { - dst.create(dims, depth()); - std::copy_n(data, total()*elemSize(), data); - } - } - - /** @brief Returns true if the array has no elements. - - The method returns true if Mat::total() is 0 or if Mat::data is NULL. Because of pop_back() and - resize() methods `M.total() == 0` does not imply that `M.data == NULL`. - */ - bool empty() const - { - return data == 0 || total() == 0; - } - - /** @brief Returns the total number of array elements. - - The method returns the number of array elements (a number of pixels if the array represents an - image). - */ - size_t total() const - { - return dims.empty() - ? (static_cast(rows) * cols) - : std::accumulate(dims.begin(), dims.end(), static_cast(1), std::multiplies()); - } - - /** @overload - @param roi Extracted submatrix specified as a rectangle. - */ - Mat operator()( const Rect& roi ) const - { - return Mat{*this, roi}; - } - - - /** @brief Returns a pointer to the specified matrix row. - - The methods return `uchar*` or typed pointer to the specified matrix row. See the sample in - Mat::isContinuous to know how to use these methods. - @param row Index along the dimension 0 - @param col Index along the dimension 1 - */ - uchar* ptr(int row, int col = 0) - { - return const_cast(const_cast(this)->ptr(row,col)); - } - /** @overload */ - const uchar* ptr(int row, int col = 0) const - { - return data + step * row + CV_ELEM_SIZE(type()) * col; - } - - - private: - //actual memory allocated for storage, or nullptr if object is non owning view to over memory - std::shared_ptr memory; - }; - -} //namespace own -} //namespace gapi -} //namespace cv - -#endif /* OPENCV_GAPI_OWN_MAT_HPP */ diff --git a/modules/gapi/include/opencv2/gapi/own/saturate.hpp b/modules/gapi/include/opencv2/gapi/own/saturate.hpp deleted file mode 100644 index 74eaecf57e..0000000000 --- a/modules/gapi/include/opencv2/gapi/own/saturate.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_OWN_SATURATE_HPP -#define OPENCV_GAPI_OWN_SATURATE_HPP - -#include - -#include - -#include -#include - -namespace cv { namespace gapi { namespace own { -//----------------------------- -// -// Numeric cast with saturation -// -//----------------------------- - -template::value && - std::is_integral::value && - std::is_integral::value> > -static CV_ALWAYS_INLINE DST saturate(SRC x) -{ - if (sizeof(DST) > sizeof(SRC)) - return static_cast(x); - - // compiler must recognize this saturation, - // so compile saturate(a + b) with adds - // instruction (e.g.: _mm_adds_epi16 if x86) - return x < std::numeric_limits::min()? - std::numeric_limits::min(): - x > std::numeric_limits::max()? - std::numeric_limits::max(): - static_cast(x); -} -template -static CV_ALWAYS_INLINE T saturate(T x) -{ - return x; -} - -template::value, bool> = true > -static CV_ALWAYS_INLINE DST saturate(SRC x, R) -{ - return static_cast(x); -} -template::value && - std::is_integral::value , bool> = true > -static CV_ALWAYS_INLINE DST saturate(SRC x, R) -{ - return saturate(x); -} -// Note, that OpenCV rounds differently: -// - like std::round() for add, subtract -// - like std::rint() for multiply, divide -template::value && - std::is_floating_point::value, bool> = true > -static CV_ALWAYS_INLINE DST saturate(SRC x, R round) -{ - int ix = static_cast(round(x)); - return saturate(ix); -} - -// explicit suffix 'd' for double type -inline double ceild(double x) { return ceil(x); } -inline double floord(double x) { return floor(x); } -inline double roundd(double x) { return round(x); } -inline double rintd(double x) { return rint(x); } - -} //namespace own -} //namespace gapi -} //namespace cv -#endif /* OPENCV_GAPI_OWN_SATURATE_HPP */ diff --git a/modules/gapi/include/opencv2/gapi/own/scalar.hpp b/modules/gapi/include/opencv2/gapi/own/scalar.hpp deleted file mode 100644 index 3b107befcc..0000000000 --- a/modules/gapi/include/opencv2/gapi/own/scalar.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_GAPI_OWN_SCALAR_HPP -#define OPENCV_GAPI_GAPI_OWN_SCALAR_HPP - -#include - -namespace cv -{ -namespace gapi -{ -namespace own -{ - -class GAPI_EXPORTS Scalar -{ -public: - Scalar() = default; - explicit Scalar(double v0) { val[0] = v0; } - Scalar(double v0, double v1, double v2 = 0, double v3 = 0) - : val{v0, v1, v2, v3} - { - } - - const double& operator[](int i) const { return val[i]; } - double& operator[](int i) { return val[i]; } - - static Scalar all(double v0) { return Scalar(v0, v0, v0, v0); } - - double val[4] = {0}; -}; - -inline bool operator==(const Scalar& lhs, const Scalar& rhs) -{ - return std::equal(std::begin(lhs.val), std::end(lhs.val), std::begin(rhs.val)); -} - -} // namespace own -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_GAPI_OWN_SCALAR_HPP diff --git a/modules/gapi/include/opencv2/gapi/own/types.hpp b/modules/gapi/include/opencv2/gapi/own/types.hpp deleted file mode 100644 index 211b5c85ff..0000000000 --- a/modules/gapi/include/opencv2/gapi/own/types.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_TYPES_HPP -#define OPENCV_GAPI_TYPES_HPP - -#include // std::max, std::min -#include - -namespace cv -{ -namespace gapi -{ - -/** - * @brief This namespace contains G-API own data structures used in - * its standalone mode build. - */ -namespace own -{ - -class Point -{ -public: - Point() = default; - Point(int _x, int _y) : x(_x), y(_y) {} - - int x = 0; - int y = 0; -}; - -class Point2f -{ -public: - Point2f() = default; - Point2f(float _x, float _y) : x(_x), y(_y) {} - - float x = 0.f; - float y = 0.f; -}; - -class Point3f -{ -public: - Point3f() = default; - Point3f(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} - - float x = 0.f; - float y = 0.f; - float z = 0.f; -}; - -class Rect -{ -public: - Rect() = default; - Rect(int _x, int _y, int _width, int _height) : x(_x), y(_y), width(_width), height(_height) {} -#if !defined(GAPI_STANDALONE) - Rect(const cv::Rect& other) : x(other.x), y(other.y), width(other.width), height(other.height) {} - inline Rect& operator=(const cv::Rect& other) - { - x = other.x; - y = other.x; - width = other.width; - height = other.height; - return *this; - } -#endif // !defined(GAPI_STANDALONE) - - int x = 0; //!< x coordinate of the top-left corner - int y = 0; //!< y coordinate of the top-left corner - int width = 0; //!< width of the rectangle - int height = 0; //!< height of the rectangle -}; - -inline bool operator==(const Rect& lhs, const Rect& rhs) -{ - return lhs.x == rhs.x && lhs.y == rhs.y && lhs.width == rhs.width && lhs.height == rhs.height; -} - -inline bool operator!=(const Rect& lhs, const Rect& rhs) -{ - return !(lhs == rhs); -} - -inline Rect& operator&=(Rect& lhs, const Rect& rhs) -{ - int x1 = std::max(lhs.x, rhs.x); - int y1 = std::max(lhs.y, rhs.y); - lhs.width = std::min(lhs.x + lhs.width, rhs.x + rhs.width) - x1; - lhs.height = std::min(lhs.y + lhs.height, rhs.y + rhs.height) - y1; - lhs.x = x1; - lhs.y = y1; - if( lhs.width <= 0 || lhs.height <= 0 ) - lhs = Rect(); - return lhs; -} - -inline Rect operator&(const Rect& lhs, const Rect& rhs) -{ - Rect result = lhs; - return result &= rhs; -} - -inline std::ostream& operator<<(std::ostream& o, const Rect& rect) -{ - return o << "[" << rect.width << " x " << rect.height << " from (" << rect.x << ", " << rect.y << ")]"; -} - -class Size -{ -public: - Size() = default; - Size(int _width, int _height) : width(_width), height(_height) {} -#if !defined(GAPI_STANDALONE) - Size(const cv::Size& other) : width(other.width), height(other.height) {} - inline Size& operator=(const cv::Size& rhs) - { - width = rhs.width; - height = rhs.height; - return *this; - } -#endif // !defined(GAPI_STANDALONE) - - int width = 0; - int height = 0; -}; - -inline Size& operator+=(Size& lhs, const Size& rhs) -{ - lhs.width += rhs.width; - lhs.height += rhs.height; - return lhs; -} - -inline bool operator==(const Size& lhs, const Size& rhs) -{ - return lhs.width == rhs.width && lhs.height == rhs.height; -} - -inline bool operator!=(const Size& lhs, const Size& rhs) -{ - return !(lhs == rhs); -} - - -inline std::ostream& operator<<(std::ostream& o, const Size& s) -{ - o << "[" << s.width << " x " << s.height << "]"; - return o; -} - -struct VoidType {}; -} // namespace own -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_TYPES_HPP diff --git a/modules/gapi/include/opencv2/gapi/plaidml/core.hpp b/modules/gapi/include/opencv2/gapi/plaidml/core.hpp deleted file mode 100644 index 20e8812b3a..0000000000 --- a/modules/gapi/include/opencv2/gapi/plaidml/core.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - - -#ifndef OPENCV_GAPI_PLAIDML_CORE_HPP -#define OPENCV_GAPI_PLAIDML_CORE_HPP - -#include // GKernelPackage -#include // GAPI_EXPORTS - -namespace cv { namespace gapi { namespace core { namespace plaidml { - -GAPI_EXPORTS cv::GKernelPackage kernels(); - -}}}} - -#endif // OPENCV_GAPI_PLAIDML_CORE_HPP diff --git a/modules/gapi/include/opencv2/gapi/plaidml/gplaidmlkernel.hpp b/modules/gapi/include/opencv2/gapi/plaidml/gplaidmlkernel.hpp deleted file mode 100644 index e22ecc7211..0000000000 --- a/modules/gapi/include/opencv2/gapi/plaidml/gplaidmlkernel.hpp +++ /dev/null @@ -1,140 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation -// - - -#ifndef OPENCV_GAPI_GPLAIDMLKERNEL_HPP -#define OPENCV_GAPI_GPLAIDMLKERNEL_HPP - -#include -#include - -namespace plaidml -{ -namespace edsl -{ - class Tensor; -} // namespace edsl -} // namespace plaidml - -namespace cv -{ -namespace gapi -{ -namespace plaidml -{ - -GAPI_EXPORTS cv::gapi::GBackend backend(); - -} // namespace plaidml -} // namespace gapi - -struct GPlaidMLContext -{ - // Generic accessor API - template - const T& inArg(int input) { return m_args.at(input).get(); } - - // Syntax sugar - const plaidml::edsl::Tensor& inTensor(int input) - { - return inArg(input); - } - - plaidml::edsl::Tensor& outTensor(int output) - { - return *(m_results.at(output).get()); - } - - std::vector m_args; - std::unordered_map m_results; -}; - -class GAPI_EXPORTS GPlaidMLKernel -{ -public: - using F = std::function; - - GPlaidMLKernel() = default; - explicit GPlaidMLKernel(const F& f) : m_f(f) {} - - void apply(GPlaidMLContext &ctx) const - { - GAPI_Assert(m_f); - m_f(ctx); - } - -protected: - F m_f; -}; - - -namespace detail -{ - -template struct plaidml_get_in; -template<> struct plaidml_get_in -{ - static const plaidml::edsl::Tensor& get(GPlaidMLContext& ctx, int idx) - { - return ctx.inTensor(idx); - } -}; - -template struct plaidml_get_in -{ - static T get(GPlaidMLContext &ctx, int idx) { return ctx.inArg(idx); } -}; - -template struct plaidml_get_out; -template<> struct plaidml_get_out -{ - static plaidml::edsl::Tensor& get(GPlaidMLContext& ctx, int idx) - { - return ctx.outTensor(idx); - } -}; - -template -struct PlaidMLCallHelper; - -template -struct PlaidMLCallHelper, std::tuple > -{ - template - static void call_impl(GPlaidMLContext &ctx, detail::Seq, detail::Seq) - { - Impl::run(plaidml_get_in::get(ctx, IIs)..., plaidml_get_out::get(ctx, OIs)...); - } - - static void call(GPlaidMLContext& ctx) - { - call_impl(ctx, - typename detail::MkSeq::type(), - typename detail::MkSeq::type()); - } -}; - -} // namespace detail - -template -class GPlaidMLKernelImpl: public cv::detail::PlaidMLCallHelper, - public cv::detail::KernelTag -{ - using P = detail::PlaidMLCallHelper; - -public: - using API = K; - - static cv::gapi::GBackend backend() { return cv::gapi::plaidml::backend(); } - static cv::GPlaidMLKernel kernel() { return GPlaidMLKernel(&P::call); } -}; - -#define GAPI_PLAIDML_KERNEL(Name, API) struct Name: public cv::GPlaidMLKernelImpl - -} // namespace cv - -#endif // OPENCV_GAPI_GPLAIDMLKERNEL_HPP diff --git a/modules/gapi/include/opencv2/gapi/plaidml/plaidml.hpp b/modules/gapi/include/opencv2/gapi/plaidml/plaidml.hpp deleted file mode 100644 index 3207a8cb2e..0000000000 --- a/modules/gapi/include/opencv2/gapi/plaidml/plaidml.hpp +++ /dev/null @@ -1,53 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - - -#ifndef OPENCV_GAPI_PLAIDML_PLAIDML_HPP -#define OPENCV_GAPI_PLAIDML_PLAIDML_HPP - -#include -#include // CompileArgTag - -namespace cv -{ -namespace gapi -{ - -/** - * @brief This namespace contains G-API PlaidML backend functions, - * structures, and symbols. - */ -namespace plaidml -{ - -/** \addtogroup gapi_compile_args - * @{ - */ -/** - * @brief This structure represents the basic parameters for the experimental - * PlaidML backend. - */ -struct config -{ - std::string dev_id; //!< Device ID. Refer to PlaidML documentation for details. - std::string trg_id; //!< Target ID. Refer to PlaidML documentation for details. -}; -/** @} gapi_compile_args */ - -} // namespace plaidml -} // namespace gapi - -namespace detail -{ - template<> struct CompileArgTag - { - static const char* tag() { return "gapi.plaidml.config"; } - }; -} // namespace detail - -} // namespace cv - -#endif // OPENCV_GAPI_PLAIDML_PLAIDML_HPP diff --git a/modules/gapi/include/opencv2/gapi/python/python.hpp b/modules/gapi/include/opencv2/gapi/python/python.hpp deleted file mode 100644 index 1857a938d5..0000000000 --- a/modules/gapi/include/opencv2/gapi/python/python.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - - -#ifndef OPENCV_GAPI_PYTHON_API_HPP -#define OPENCV_GAPI_PYTHON_API_HPP - -#include // GKernelPackage -#include // GAPI_EXPORTS - -namespace cv { -namespace gapi { - -/** - * @brief This namespace contains G-API Python backend functions, - * structures, and symbols. - * - * This functionality is required to enable G-API custom operations - * and kernels when using G-API from Python, no need to use it in the - * C++ form. - */ -namespace python { - -GAPI_EXPORTS cv::gapi::GBackend backend(); - -struct GPythonContext -{ - const cv::GArgs &ins; - const cv::GMetaArgs &in_metas; - const cv::GTypesInfo &out_info; - - cv::optional m_state; -}; - -using Impl = std::function; -using Setup = std::function; - -class GAPI_EXPORTS GPythonKernel -{ -public: - GPythonKernel() = default; - GPythonKernel(Impl run, Setup setup); - - Impl run; - Setup setup = nullptr; - bool is_stateful = false; -}; - -class GAPI_EXPORTS GPythonFunctor : public cv::gapi::GFunctor -{ -public: - using Meta = cv::GKernel::M; - - GPythonFunctor(const char* id, const Meta& meta, const Impl& impl, - const Setup& setup = nullptr); - - GKernelImpl impl() const override; - gapi::GBackend backend() const override; - -private: - GKernelImpl impl_; -}; - -} // namespace python -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_PYTHON_API_HPP diff --git a/modules/gapi/include/opencv2/gapi/render.hpp b/modules/gapi/include/opencv2/gapi/render.hpp deleted file mode 100644 index 52e55b0d80..0000000000 --- a/modules/gapi/include/opencv2/gapi/render.hpp +++ /dev/null @@ -1,14 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - -#ifndef OPENCV_GAPI_RENDER_ROOT_HPP -#define OPENCV_GAPI_RENDER_ROOT_HPP - -// This file is just a shortcut to render/render.hpp - -#include - -#endif // OPENCV_GAPI_RENDER_ROOT_HPP diff --git a/modules/gapi/include/opencv2/gapi/render/render.hpp b/modules/gapi/include/opencv2/gapi/render/render.hpp deleted file mode 100644 index 8d93a6efc0..0000000000 --- a/modules/gapi/include/opencv2/gapi/render/render.hpp +++ /dev/null @@ -1,196 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2020 Intel Corporation - - -#ifndef OPENCV_GAPI_RENDER_HPP -#define OPENCV_GAPI_RENDER_HPP - -#include - -#include - -/** \defgroup gapi_draw G-API Drawing and composition functionality - * @{ - * - * @brief Functions for in-graph drawing. - * - * @note This is a Work in Progress functionality and APIs may - * change in the future releases. - * - * G-API can do some in-graph drawing with a generic operations and a - * set of [rendering primitives](@ref gapi_draw_prims). - * In contrast with traditional OpenCV, in G-API user need to form a - * *rendering list* of primitives to draw. This list can be built - * manually or generated within a graph. This list is passed to - * [special operations or functions](@ref gapi_draw_api) where all - * primitives are interpreted and applied to the image. - * - * For example, in a complex pipeline a list of detected objects - * can be translated in-graph to a list of cv::gapi::wip::draw::Rect - * primitives to highlight those with bounding boxes, or a list of - * detected faces can be translated in-graph to a list of - * cv::gapi::wip::draw::Mosaic primitives to hide sensitive content - * or protect privacy. - * - * Like any other operations, rendering in G-API can be reimplemented - * by different backends. Currently only an OpenCV-based backend is - * available. - * - * In addition to the graph-level operations, there are also regular - * (immediate) OpenCV-like functions are available -- see - * cv::gapi::wip::draw::render(). These functions are just wrappers - * over regular G-API and build the rendering graphs on the fly, so - * take compilation arguments as parameters. - * - * Currently this API is more machine-oriented than human-oriented. - * The main purpose is to translate a set of domain-specific objects - * to a list of primitives to draw. For example, in order to generate - * a picture like this: - * - * ![](modules/gapi/doc/pics/render_example.png) - * - * Rendering list needs to be generated as follows: - * - * @include modules/gapi/samples/draw_example.cpp - * - * @defgroup gapi_draw_prims Drawing primitives - * @defgroup gapi_draw_api Drawing operations and functions - * @} - */ - -namespace cv -{ -namespace gapi -{ -namespace wip -{ -namespace draw -{ - -using GMat2 = std::tuple; -using GMatDesc2 = std::tuple; - -//! @addtogroup gapi_draw_api -//! @{ -/** @brief The function renders on the input image passed drawing primitivies - -@param bgr input image: 8-bit unsigned 3-channel image @ref CV_8UC3. -@param prims vector of drawing primitivies -@param args graph compile time parameters -*/ -void GAPI_EXPORTS_W render(cv::Mat& bgr, - const Prims& prims, - cv::GCompileArgs&& args = {}); - -/** @brief The function renders on two NV12 planes passed drawing primitivies - -@param y_plane input image: 8-bit unsigned 1-channel image @ref CV_8UC1. -@param uv_plane input image: 8-bit unsigned 2-channel image @ref CV_8UC2. -@param prims vector of drawing primitivies -@param args graph compile time parameters -*/ -void GAPI_EXPORTS_W render(cv::Mat& y_plane, - cv::Mat& uv_plane, - const Prims& prims, - cv::GCompileArgs&& args = {}); - -/** @brief The function renders on the input media frame passed drawing primitivies - -@param frame input Media Frame : @ref cv::MediaFrame. -@param prims vector of drawing primitivies -@param args graph compile time parameters -*/ -void GAPI_EXPORTS render(cv::MediaFrame& frame, - const Prims& prims, - cv::GCompileArgs&& args = {}); - - -G_TYPED_KERNEL_M(GRenderNV12, )>, "org.opencv.render.nv12") -{ - static GMatDesc2 outMeta(GMatDesc y_plane, GMatDesc uv_plane, GArrayDesc) - { - return std::make_tuple(y_plane, uv_plane); - } -}; - -G_TYPED_KERNEL(GRenderBGR, )>, "org.opencv.render.bgr") -{ - static GMatDesc outMeta(GMatDesc bgr, GArrayDesc) - { - return bgr; - } -}; - -G_TYPED_KERNEL(GRenderFrame, )>, "org.opencv.render.frame") -{ - static GFrameDesc outMeta(GFrameDesc desc, GArrayDesc) - { - return desc; - } -}; - -/** @brief Renders on 3 channels input - -Output image must be 8-bit unsigned planar 3-channel image - -@param src input image: 8-bit unsigned 3-channel image @ref CV_8UC3 -@param prims draw primitives -*/ -GAPI_EXPORTS_W GMat render3ch(const GMat& src, const GArray& prims); - -/** @brief Renders on two planes - -Output y image must be 8-bit unsigned planar 1-channel image @ref CV_8UC1 -uv image must be 8-bit unsigned planar 2-channel image @ref CV_8UC2 - -@param y input image: 8-bit unsigned 1-channel image @ref CV_8UC1 -@param uv input image: 8-bit unsigned 2-channel image @ref CV_8UC2 -@param prims draw primitives -*/ -GAPI_EXPORTS_W GMat2 renderNV12(const GMat& y, - const GMat& uv, - const GArray& prims); - -/** @brief Renders Media Frame - -Output media frame frame cv::MediaFrame - -@param m_frame input image: cv::MediaFrame @ref cv::MediaFrame -@param prims draw primitives -*/ -GAPI_EXPORTS GFrame renderFrame(const GFrame& m_frame, - const GArray& prims); - -//! @} gapi_draw_api - -} // namespace draw -} // namespace wip - -/** - * @brief This namespace contains G-API CPU rendering backend functions, - * structures, and symbols. See @ref gapi_draw for details. - */ -namespace render -{ -namespace ocv -{ - GAPI_EXPORTS_W cv::GKernelPackage kernels(); - -} // namespace ocv -} // namespace render -} // namespace gapi - -namespace detail -{ - template<> struct CompileArgTag - { - static const char* tag() { return "gapi.freetype_font"; } - }; -} // namespace detail - -} // namespace cv - -#endif // OPENCV_GAPI_RENDER_HPP diff --git a/modules/gapi/include/opencv2/gapi/render/render_types.hpp b/modules/gapi/include/opencv2/gapi/render/render_types.hpp deleted file mode 100644 index 6d70e3a877..0000000000 --- a/modules/gapi/include/opencv2/gapi/render/render_types.hpp +++ /dev/null @@ -1,359 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - - -#ifndef OPENCV_GAPI_RENDER_TYPES_HPP -#define OPENCV_GAPI_RENDER_TYPES_HPP - -#include -#include - -#include -#include -#include - -namespace cv -{ -namespace gapi -{ -namespace wip -{ -namespace draw -{ - -/** - * @brief This structure specifies which FreeType font to use by FText primitives. - */ -struct freetype_font -{ - /*@{*/ - std::string path; //!< The path to the font file (.ttf) - /*@{*/ -}; - -//! @addtogroup gapi_draw_prims -//! @{ -/** - * @brief This structure represents a text string to draw. - * - * Parameters match cv::putText(). - */ -struct GAPI_EXPORTS_W_SIMPLE Text -{ - /** - * @brief Text constructor - * - * @param text_ The text string to be drawn - * @param org_ The bottom-left corner of the text string in the image - * @param ff_ The font type, see #HersheyFonts - * @param fs_ The font scale factor that is multiplied by the font-specific base size - * @param color_ The text color - * @param thick_ The thickness of the lines used to draw a text - * @param lt_ The line type. See #LineTypes - * @param bottom_left_origin_ When true, the image data origin is at the bottom-left corner. Otherwise, it is at the top-left corner - */ - GAPI_WRAP - Text(const std::string& text_, - const cv::Point& org_, - int ff_, - double fs_, - const cv::Scalar& color_, - int thick_ = 1, - int lt_ = 8, - bool bottom_left_origin_ = false) : - text(text_), org(org_), ff(ff_), fs(fs_), - color(color_), thick(thick_), lt(lt_), bottom_left_origin(bottom_left_origin_) - { - } - - GAPI_WRAP - Text() = default; - - /*@{*/ - GAPI_PROP_RW std::string text; //!< The text string to be drawn - GAPI_PROP_RW cv::Point org; //!< The bottom-left corner of the text string in the image - GAPI_PROP_RW int ff; //!< The font type, see #HersheyFonts - GAPI_PROP_RW double fs; //!< The font scale factor that is multiplied by the font-specific base size - GAPI_PROP_RW cv::Scalar color; //!< The text color - GAPI_PROP_RW int thick; //!< The thickness of the lines used to draw a text - GAPI_PROP_RW int lt; //!< The line type. See #LineTypes - GAPI_PROP_RW bool bottom_left_origin; //!< When true, the image data origin is at the bottom-left corner. Otherwise, it is at the top-left corner - /*@{*/ -}; - -/** - * @brief This structure represents a text string to draw using - * FreeType renderer. - * - * If OpenCV is built without FreeType support, this primitive will - * fail at the execution stage. - */ -struct FText -{ - /** - * @brief FText constructor - * - * @param text_ The text string to be drawn - * @param org_ The bottom-left corner of the text string in the image - * @param fh_ The height of text - * @param color_ The text color - */ - FText(const std::wstring& text_, - const cv::Point& org_, - int fh_, - const cv::Scalar& color_) : - text(text_), org(org_), fh(fh_), color(color_) - { - } - - FText() = default; - - /*@{*/ - std::wstring text; //!< The text string to be drawn - cv::Point org; //!< The bottom-left corner of the text string in the image - int fh; //!< The height of text - cv::Scalar color; //!< The text color - /*@{*/ -}; - -/** - * @brief This structure represents a rectangle to draw. - * - * Parameters match cv::rectangle(). - */ -struct GAPI_EXPORTS_W_SIMPLE Rect -{ - /** - * @brief Rect constructor - * - * @param rect_ Coordinates of the rectangle - * @param color_ The bottom-left corner of the text string in the image - * @param thick_ The thickness of lines that make up the rectangle. Negative values, like #FILLED, mean that the function has to draw a filled rectangle - * @param lt_ The type of the line. See #LineTypes - * @param shift_ The number of fractional bits in the point coordinates - */ - Rect(const cv::Rect& rect_, - const cv::Scalar& color_, - int thick_ = 1, - int lt_ = 8, - int shift_ = 0) : - rect(rect_), color(color_), thick(thick_), lt(lt_), shift(shift_) - { - } - - GAPI_WRAP - Rect() = default; - - /*@{*/ - GAPI_PROP_RW cv::Rect rect; //!< Coordinates of the rectangle - GAPI_PROP_RW cv::Scalar color; //!< The rectangle color or brightness (grayscale image) - GAPI_PROP_RW int thick; //!< The thickness of lines that make up the rectangle. Negative values, like #FILLED, mean that the function has to draw a filled rectangle - GAPI_PROP_RW int lt; //!< The type of the line. See #LineTypes - GAPI_PROP_RW int shift; //!< The number of fractional bits in the point coordinates - /*@{*/ -}; - -/** - * @brief This structure represents a circle to draw. - * - * Parameters match cv::circle(). - */ -struct GAPI_EXPORTS_W_SIMPLE Circle -{ - /** - * @brief Circle constructor - * - * @param center_ The center of the circle - * @param radius_ The radius of the circle - * @param color_ The color of the circle - * @param thick_ The thickness of the circle outline, if positive. Negative values, like #FILLED, mean that a filled circle is to be drawn - * @param lt_ The Type of the circle boundary. See #LineTypes - * @param shift_ The Number of fractional bits in the coordinates of the center and in the radius value - */ - GAPI_WRAP - Circle(const cv::Point& center_, - int radius_, - const cv::Scalar& color_, - int thick_ = 1, - int lt_ = 8, - int shift_ = 0) : - center(center_), radius(radius_), color(color_), thick(thick_), lt(lt_), shift(shift_) - { - } - - GAPI_WRAP - Circle() = default; - - /*@{*/ - GAPI_PROP_RW cv::Point center; //!< The center of the circle - GAPI_PROP_RW int radius; //!< The radius of the circle - GAPI_PROP_RW cv::Scalar color; //!< The color of the circle - GAPI_PROP_RW int thick; //!< The thickness of the circle outline, if positive. Negative values, like #FILLED, mean that a filled circle is to be drawn - GAPI_PROP_RW int lt; //!< The Type of the circle boundary. See #LineTypes - GAPI_PROP_RW int shift; //!< The Number of fractional bits in the coordinates of the center and in the radius value - /*@{*/ -}; - -/** - * @brief This structure represents a line to draw. - * - * Parameters match cv::line(). - */ -struct GAPI_EXPORTS_W_SIMPLE Line -{ - /** - * @brief Line constructor - * - * @param pt1_ The first point of the line segment - * @param pt2_ The second point of the line segment - * @param color_ The line color - * @param thick_ The thickness of line - * @param lt_ The Type of the line. See #LineTypes - * @param shift_ The number of fractional bits in the point coordinates - */ - GAPI_WRAP - Line(const cv::Point& pt1_, - const cv::Point& pt2_, - const cv::Scalar& color_, - int thick_ = 1, - int lt_ = 8, - int shift_ = 0) : - pt1(pt1_), pt2(pt2_), color(color_), thick(thick_), lt(lt_), shift(shift_) - { - } - - GAPI_WRAP - Line() = default; - - /*@{*/ - GAPI_PROP_RW cv::Point pt1; //!< The first point of the line segment - GAPI_PROP_RW cv::Point pt2; //!< The second point of the line segment - GAPI_PROP_RW cv::Scalar color; //!< The line color - GAPI_PROP_RW int thick; //!< The thickness of line - GAPI_PROP_RW int lt; //!< The Type of the line. See #LineTypes - GAPI_PROP_RW int shift; //!< The number of fractional bits in the point coordinates - /*@{*/ -}; - -/** - * @brief This structure represents a mosaicing operation. - * - * Mosaicing is a very basic method to obfuscate regions in the image. - */ -struct GAPI_EXPORTS_W_SIMPLE Mosaic -{ - /** - * @brief Mosaic constructor - * - * @param mos_ Coordinates of the mosaic - * @param cellSz_ Cell size (same for X, Y) - * @param decim_ Decimation (0 stands for no decimation) - */ - Mosaic(const cv::Rect& mos_, - int cellSz_, - int decim_) : - mos(mos_), cellSz(cellSz_), decim(decim_) - { - } - - GAPI_WRAP - Mosaic() : cellSz(0), decim(0) {} - - /*@{*/ - GAPI_PROP_RW cv::Rect mos; //!< Coordinates of the mosaic - GAPI_PROP_RW int cellSz; //!< Cell size (same for X, Y) - GAPI_PROP_RW int decim; //!< Decimation (0 stands for no decimation) - /*@{*/ -}; - -/** - * @brief This structure represents an image to draw. - * - * Image is blended on a frame using the specified mask. - */ -struct GAPI_EXPORTS_W_SIMPLE Image -{ - /** - * @brief Mosaic constructor - * - * @param org_ The bottom-left corner of the image - * @param img_ Image to draw - * @param alpha_ Alpha channel for image to draw (same size and number of channels) - */ - GAPI_WRAP - Image(const cv::Point& org_, - const cv::Mat& img_, - const cv::Mat& alpha_) : - org(org_), img(img_), alpha(alpha_) - { - } - - GAPI_WRAP - Image() = default; - - /*@{*/ - GAPI_PROP_RW cv::Point org; //!< The bottom-left corner of the image - GAPI_PROP_RW cv::Mat img; //!< Image to draw - GAPI_PROP_RW cv::Mat alpha; //!< Alpha channel for image to draw (same size and number of channels) - /*@{*/ -}; - -/** - * @brief This structure represents a polygon to draw. - */ -struct GAPI_EXPORTS_W_SIMPLE Poly -{ - /** - * @brief Mosaic constructor - * - * @param points_ Points to connect - * @param color_ The line color - * @param thick_ The thickness of line - * @param lt_ The Type of the line. See #LineTypes - * @param shift_ The number of fractional bits in the point coordinate - */ - GAPI_WRAP - Poly(const std::vector& points_, - const cv::Scalar& color_, - int thick_ = 1, - int lt_ = 8, - int shift_ = 0) : - points(points_), color(color_), thick(thick_), lt(lt_), shift(shift_) - { - } - - GAPI_WRAP - Poly() = default; - - /*@{*/ - GAPI_PROP_RW std::vector points; //!< Points to connect - GAPI_PROP_RW cv::Scalar color; //!< The line color - GAPI_PROP_RW int thick; //!< The thickness of line - GAPI_PROP_RW int lt; //!< The Type of the line. See #LineTypes - GAPI_PROP_RW int shift; //!< The number of fractional bits in the point coordinate - /*@{*/ -}; - -using Prim = util::variant - < Text - , FText - , Rect - , Circle - , Line - , Mosaic - , Image - , Poly - >; - -using Prims = std::vector; -//! @} gapi_draw_prims - -} // namespace draw -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_RENDER_TYPES_HPP diff --git a/modules/gapi/include/opencv2/gapi/rmat.hpp b/modules/gapi/include/opencv2/gapi/rmat.hpp deleted file mode 100644 index ed456f901e..0000000000 --- a/modules/gapi/include/opencv2/gapi/rmat.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - -#ifndef OPENCV_GAPI_RMAT_HPP -#define OPENCV_GAPI_RMAT_HPP - -#include -#include - -// Forward declaration -namespace cv { -namespace gapi { -namespace s11n { -struct IOStream; -struct IIStream; -} // namespace s11n -} // namespace gapi -} // namespace cv - -namespace cv { - -// "Remote Mat", a general class which provides an abstraction layer over the data -// storage and placement (host, remote device etc) and allows to access this data. -// -// The device specific implementation is hidden in the RMat::IAdapter class -// -// The basic flow is the following: -// * Backend which is aware of the remote device: -// - Implements own AdapterT class which is derived from RMat::IAdapter -// - Wraps device memory into RMat via make_rmat utility function: -// cv::RMat rmat = cv::make_rmat(args); -// -// * End user: -// - Writes the code which works with RMats without any knowledge of the remote device: -// void func(const cv::RMat& in_rmat, cv::RMat& out_rmat) { -// // Fetch input data from the device, get mapped memory for output -// cv::RMat::View in_view = in_rmat.access(Access::R); -// cv::RMat::View out_view = out_rmat.access(Access::W); -// performCalculations(in_view, out_view); -// // data from out_view is transferred to the device when out_view is destroyed -// } -/** \addtogroup gapi_data_structures - * @{ - */ -class GAPI_EXPORTS RMat -{ -public: - // A lightweight wrapper on image data: - // - Doesn't own the memory; - // - Doesn't implement copy semantics (it's assumed that a view is created each time - // wrapped data is being accessed); - // - Has an optional callback which is called when the view is destroyed. - class GAPI_EXPORTS View - { - public: - using DestroyCallback = std::function; - using stepsT = std::vector; - - View() = default; - View(const GMatDesc& desc, uchar* data, const stepsT& steps = {}, DestroyCallback&& cb = nullptr); - View(const GMatDesc& desc, uchar* data, size_t step, DestroyCallback&& cb = nullptr); - - View(const View&) = delete; - View& operator=(const View&) = delete; - View(View&&) = default; - View& operator=(View&& v); - ~View() { if (m_cb) m_cb(); } - - cv::Size size() const { return m_desc.size; } - const std::vector& dims() const { return m_desc.dims; } - int cols() const { return m_desc.size.width; } - int rows() const { return m_desc.size.height; } - int type() const; - int depth() const { return m_desc.depth; } - int chan() const { return m_desc.chan; } - size_t elemSize() const { return CV_ELEM_SIZE(type()); } - - template T* ptr(int y = 0) { - return reinterpret_cast(m_data + step()*y); - } - template const T* ptr(int y = 0) const { - return reinterpret_cast(m_data + step()*y); - } - template T* ptr(int y, int x) { - return reinterpret_cast(m_data + step()*y + step(1)*x); - } - template const T* ptr(int y, int x) const { - return reinterpret_cast(m_data + step()*y + step(1)*x); - } - size_t step(size_t i = 0) const { - GAPI_DbgAssert(i; - - RMat() = default; - RMat(AdapterP&& a) : m_adapter(std::move(a)) {} - GMatDesc desc() const { return m_adapter->desc(); } - - // Note: When accessed for write there is no guarantee that returned view - // will contain actual snapshot of the mapped device memory - // (no guarantee that fetch from a device is performed). The only - // guaranty is that when the view is destroyed, its data will be - // transferred to the device - View access(Access a) const { return m_adapter->access(a); } - - // Cast underlying RMat adapter to the particular adapter type, - // return nullptr if underlying type is different - template T* get() const - { - static_assert(std::is_base_of::value, "T is not derived from IAdapter!"); - GAPI_Assert(m_adapter != nullptr); - return dynamic_cast(m_adapter.get()); - } - - void serialize(cv::gapi::s11n::IOStream& os) const { - m_adapter->serialize(os); - } - -private: - AdapterP m_adapter = nullptr; -}; - -template -RMat make_rmat(Ts&&... args) { return { std::make_shared(std::forward(args)...) }; } -/** @} */ - -} //namespace cv - -#endif /* OPENCV_GAPI_RMAT_HPP */ diff --git a/modules/gapi/include/opencv2/gapi/s11n.hpp b/modules/gapi/include/opencv2/gapi/s11n.hpp deleted file mode 100644 index a94f55c249..0000000000 --- a/modules/gapi/include/opencv2/gapi/s11n.hpp +++ /dev/null @@ -1,513 +0,0 @@ -// 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. -// -// Copyright (C) 2020-2021 Intel Corporation - -#ifndef OPENCV_GAPI_S11N_HPP -#define OPENCV_GAPI_S11N_HPP - -#include -#include -#include -#include -#include -#include -#include -#include - -// FIXME: caused by deserialize_runarg -#if defined _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4702) -#endif - -namespace cv { -namespace gapi { - -/** -* \addtogroup gapi_serialization -* @{ -*/ - -namespace detail { - GAPI_EXPORTS cv::GComputation getGraph(const std::vector &bytes); - - GAPI_EXPORTS cv::GMetaArgs getMetaArgs(const std::vector &bytes); - - GAPI_EXPORTS cv::GRunArgs getRunArgs(const std::vector &bytes); - - GAPI_EXPORTS std::vector getVectorOfStrings(const std::vector &bytes); - - template - cv::GCompileArgs getCompileArgs(const std::vector &bytes); - - template - cv::GRunArgs getRunArgsWithAdapters(const std::vector &bytes); -} // namespace detail - -/** @brief Serialize a graph represented by GComputation into an array of bytes. - * - * Check different overloads for more examples. - * @param c GComputation to serialize. - * @return serialized vector of bytes. - */ -GAPI_EXPORTS std::vector serialize(const cv::GComputation &c); - -/** @overload - * @param ca GCompileArgs to serialize. - */ -GAPI_EXPORTS std::vector serialize(const cv::GCompileArgs& ca); - -/** @overload - * @param ma GMetaArgs to serialize. - */ -GAPI_EXPORTS std::vector serialize(const cv::GMetaArgs& ma); - -/** @overload - * @param ra GRunArgs to serialize. - */ -GAPI_EXPORTS std::vector serialize(const cv::GRunArgs& ra); - -/** @overload - * @param vs std::vector to serialize. - */ -GAPI_EXPORTS std::vector serialize(const std::vector& vs); - -/** - * @private - */ -template static inline -T deserialize(const std::vector &bytes); - -/** @brief Deserialize GComputation from a byte array. - * - * Check different overloads for more examples. - * @param bytes serialized vector of bytes. - * @return deserialized GComputation object. - */ -template<> inline -cv::GComputation deserialize(const std::vector &bytes) { - return detail::getGraph(bytes); -} - -/** @brief Deserialize GMetaArgs from a byte array. - * - * Check different overloads for more examples. - * @param bytes serialized vector of bytes. - * @return deserialized GMetaArgs object. - */ -template<> inline -cv::GMetaArgs deserialize(const std::vector &bytes) { - return detail::getMetaArgs(bytes); -} - -/** @brief Deserialize GRunArgs from a byte array. - * - * Check different overloads for more examples. - * @param bytes serialized vector of bytes. - * @return deserialized GRunArgs object. - */ -template<> inline -cv::GRunArgs deserialize(const std::vector &bytes) { - return detail::getRunArgs(bytes); -} - -/** @brief Deserialize std::vector from a byte array. - * - * Check different overloads for more examples. - * @param bytes serialized vector of bytes. - * @return deserialized std::vector object. - */ -template<> inline -std::vector deserialize(const std::vector &bytes) { - return detail::getVectorOfStrings(bytes); -} - -/** - * @brief Deserialize GCompileArgs which types were specified in the template from a byte array. - * - * @note cv::gapi::s11n::detail::S11N template specialization must be provided to make a custom type - * in GCompileArgs deserializable. - * - * @param bytes vector of bytes to deserialize GCompileArgs object from. - * @return GCompileArgs object. - * @see GCompileArgs cv::gapi::s11n::detail::S11N - */ -template inline -typename std::enable_if::value, GCompileArgs>:: -type deserialize(const std::vector &bytes) { - return detail::getCompileArgs(bytes); -} - -/** - * @brief Deserialize GRunArgs including RMat and MediaFrame objects if any from a byte array. - * - * Adapter types are specified in the template. - * @note To be used properly specified adapter types must overload their deserialize() method. - * @param bytes vector of bytes to deserialize GRunArgs object from. - * @return GRunArgs including RMat and MediaFrame objects if any. - * @see RMat MediaFrame - */ -template inline -typename std::enable_if::value, GRunArgs>:: -type deserialize(const std::vector &bytes) { - return detail::getRunArgsWithAdapters(bytes); -} -} // namespace gapi -} // namespace cv - -namespace cv { -namespace gapi { -namespace s11n { - -/** @brief This structure is an interface for serialization routines. - * - * It's main purpose is to provide multiple overloads for operator<<() - * with basic C++ in addition to OpenCV/G-API types. - * - * This sctructure can be inherited and further extended with additional types. - * - * For example, it is utilized in cv::gapi::s11n::detail::S11N as input parameter - * in serialize() method. - */ -struct GAPI_EXPORTS IOStream { - virtual ~IOStream() = default; - // Define the native support for basic C++ types at the API level: - virtual IOStream& operator<< (bool) = 0; - virtual IOStream& operator<< (char) = 0; - virtual IOStream& operator<< (unsigned char) = 0; - virtual IOStream& operator<< (short) = 0; - virtual IOStream& operator<< (unsigned short) = 0; - virtual IOStream& operator<< (int) = 0; - virtual IOStream& operator<< (uint32_t) = 0; - virtual IOStream& operator<< (uint64_t) = 0; - virtual IOStream& operator<< (float) = 0; - virtual IOStream& operator<< (double) = 0; - virtual IOStream& operator<< (const std::string&) = 0; -}; - -/** @brief This structure is an interface for deserialization routines. - * - * It's main purpose is to provide multiple overloads for operator>>() - * with basic C++ in addition to OpenCV/G-API types. - * - * This structure can be inherited and further extended with additional types. - * - * For example, it is utilized in cv::gapi::s11n::detail::S11N as input parameter - * in deserialize() method. - */ -struct GAPI_EXPORTS IIStream { - virtual ~IIStream() = default; - virtual IIStream& operator>> (bool &) = 0; - virtual IIStream& operator>> (std::vector::reference) = 0; - virtual IIStream& operator>> (char &) = 0; - virtual IIStream& operator>> (unsigned char &) = 0; - virtual IIStream& operator>> (short &) = 0; - virtual IIStream& operator>> (unsigned short &) = 0; - virtual IIStream& operator>> (int &) = 0; - virtual IIStream& operator>> (float &) = 0; - virtual IIStream& operator>> (double &) = 0; - virtual IIStream& operator >> (uint32_t &) = 0; - virtual IIStream& operator >> (uint64_t &) = 0; - virtual IIStream& operator>> (std::string &) = 0; -}; - -namespace detail { -GAPI_EXPORTS std::unique_ptr getInStream(const std::vector &bytes); -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// S11N operators -// Note: operators for basic types are defined in IIStream/IOStream - -// OpenCV types //////////////////////////////////////////////////////////////// - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::Point &pt); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::Point &pt); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::Point2f &pt); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::Point2f &pt); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::Point3f &pt); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::Point3f &pt); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::Size &sz); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::Size &sz); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::Rect &rc); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::Rect &rc); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::Scalar &s); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::Scalar &s); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::Mat &m); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::Mat &m); - -// FIXME: for GRunArgs serialization -#if !defined(GAPI_STANDALONE) -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::UMat & um); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::UMat & um); -#endif // !defined(GAPI_STANDALONE) - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::RMat &r); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::RMat &r); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::gapi::wip::IStreamSource::Ptr &issptr); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::gapi::wip::IStreamSource::Ptr &issptr); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::detail::VectorRef &vr); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::detail::VectorRef &vr); - -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::detail::OpaqueRef &opr); -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::detail::OpaqueRef &opr); - -/// @private -- Exclude this function from OpenCV documentation -GAPI_EXPORTS IOStream& operator<< (IOStream& os, const cv::MediaFrame &mf); -/// @private -- Exclude this function from OpenCV documentation -GAPI_EXPORTS IIStream& operator>> (IIStream& is, cv::MediaFrame &mf); - -// Generic STL types //////////////////////////////////////////////////////////////// -template -IOStream& operator<< (IOStream& os, const std::map &m) { - const uint32_t sz = static_cast(m.size()); - os << sz; - for (const auto& it : m) os << it.first << it.second; - return os; -} -template -IIStream& operator>> (IIStream& is, std::map &m) { - m.clear(); - uint32_t sz = 0u; - is >> sz; - for (std::size_t i = 0; i < sz; ++i) { - K k{}; - V v{}; - is >> k >> v; - m[k] = v; - } - return is; -} - -template -IOStream& operator<< (IOStream& os, const std::unordered_map &m) { - const uint32_t sz = static_cast(m.size()); - os << sz; - for (auto &&it : m) os << it.first << it.second; - return os; -} -template -IIStream& operator>> (IIStream& is, std::unordered_map &m) { - m.clear(); - uint32_t sz = 0u; - is >> sz; - for (std::size_t i = 0; i < sz; ++i) { - K k{}; - V v{}; - is >> k >> v; - m[k] = v; - } - return is; -} - -template -IOStream& operator<< (IOStream& os, const std::vector &ts) { - const uint32_t sz = static_cast(ts.size()); - os << sz; - for (auto &&v : ts) os << v; - return os; -} -template -IIStream& operator>> (IIStream& is, std::vector &ts) { - uint32_t sz = 0u; - is >> sz; - if (sz == 0u) { - ts.clear(); - } - else { - ts.resize(sz); - for (std::size_t i = 0; i < sz; ++i) is >> ts[i]; - } - return is; -} - -// Generic: variant serialization -namespace detail { -template -IOStream& put_v(IOStream&, const V&, std::size_t) { - GAPI_Error("variant>>: requested index is invalid"); -} - -template -IOStream& put_v(IOStream& os, const V& v, std::size_t x) { - return (x == 0u) - ? os << cv::util::get(v) - : put_v(os, v, x-1); -} - -template -IIStream& get_v(IIStream&, V&, std::size_t, std::size_t) { - GAPI_Error("variant<<: requested index is invalid"); -} - -template -IIStream& get_v(IIStream& is, V& v, std::size_t i, std::size_t gi) { - if (i == gi) { - X x{}; - is >> x; - v = V{std::move(x)}; - return is; - } else return get_v(is, v, i+1, gi); -} -} // namespace detail - -//! @overload -template -IOStream& operator<< (IOStream& os, const cv::util::variant &v) { - os << static_cast(v.index()); - return detail::put_v, Ts...>(os, v, v.index()); -} -//! @overload -template -IIStream& operator>> (IIStream& is, cv::util::variant &v) { - int idx = -1; - is >> idx; - GAPI_Assert(idx >= 0 && idx < (int)sizeof...(Ts)); - return detail::get_v, Ts...>(is, v, 0u, idx); -} - -// FIXME: consider a better solution -/// @private -- Exclude this function from OpenCV documentation -template -void getRunArgByIdx (IIStream& is, cv::util::variant &v, uint32_t idx) { - is = detail::get_v, Ts...>(is, v, 0u, idx); -} -} // namespace s11n - -namespace detail -{ -template struct try_deserialize_comparg; - -template<> struct try_deserialize_comparg> { -static cv::util::optional exec(const std::string&, cv::gapi::s11n::IIStream&) { - return { }; - } -}; - -template -struct try_deserialize_comparg> { -static cv::util::optional exec(const std::string& tag, cv::gapi::s11n::IIStream& is) { - if (tag == cv::detail::CompileArgTag::tag()) { - static_assert(cv::gapi::s11n::detail::has_S11N_spec::value, - "cv::gapi::deserialize expects Types to have S11N " - "specializations with deserialization callbacks!"); - return cv::util::optional( - GCompileArg { cv::gapi::s11n::detail::S11N::deserialize(is) }); - } - return try_deserialize_comparg>::exec(tag, is); -} -}; - -template -struct deserialize_arg_with_adapter; - -template -struct deserialize_arg_with_adapter { -static GRunArg exec(cv::gapi::s11n::IIStream& is) { - std::unique_ptr ptr(new TA); - ptr->deserialize(is); - return GRunArg { RA(std::move(ptr)) }; -} -}; - -template -struct deserialize_arg_with_adapter { -static GRunArg exec(cv::gapi::s11n::IIStream&) { - GAPI_Error("No suitable adapter class found during RMat/MediaFrame deserialization. " - "Please, make sure you've passed them in cv::gapi::deserialize() template"); - return GRunArg{}; -} -}; - -template -struct deserialize_runarg { -static GRunArg exec(cv::gapi::s11n::IIStream& is, uint32_t idx) { - if (idx == GRunArg::index_of()) { - // Type or void (if not found) - using TA = typename cv::util::find_adapter_impl::type; - return deserialize_arg_with_adapter::exec(is); - } else if (idx == GRunArg::index_of()) { - // Type or void (if not found) - using TA = typename cv::util::find_adapter_impl::type; - return deserialize_arg_with_adapter::exec(is); - } else { // not an adapter holding type runarg - use default deserialization - GRunArg arg; - getRunArgByIdx(is, arg, idx); - return arg; - } -} -}; - -template -inline cv::util::optional tryDeserializeCompArg(const std::string& tag, - const std::vector& sArg) { - std::unique_ptr pArgIs = cv::gapi::s11n::detail::getInStream(sArg); - return try_deserialize_comparg>::exec(tag, *pArgIs); -} - -template -cv::GCompileArgs getCompileArgs(const std::vector &sArgs) { - cv::GCompileArgs args; - - std::unique_ptr pIs = cv::gapi::s11n::detail::getInStream(sArgs); - cv::gapi::s11n::IIStream& is = *pIs; - - uint32_t sz = 0; - is >> sz; - for (uint32_t i = 0; i < sz; ++i) { - std::string tag; - is >> tag; - - std::vector sArg; - is >> sArg; - - cv::util::optional dArg = - cv::gapi::detail::tryDeserializeCompArg(tag, sArg); - - if (dArg.has_value()) - { - args.push_back(dArg.value()); - } - } - - return args; -} - -template -cv::GRunArgs getRunArgsWithAdapters(const std::vector &bytes) { - std::unique_ptr pIs = cv::gapi::s11n::detail::getInStream(bytes); - cv::gapi::s11n::IIStream& is = *pIs; - cv::GRunArgs args; - - uint32_t sz = 0; - is >> sz; - for (uint32_t i = 0; i < sz; ++i) { - uint32_t idx = 0; - is >> idx; - args.push_back(cv::gapi::detail::deserialize_runarg::exec(is, idx)); - } - - return args; -} -} // namespace detail -/** @} */ - -} // namespace gapi -} // namespace cv - -#if defined _MSC_VER -#pragma warning(pop) -#endif - -#endif // OPENCV_GAPI_S11N_HPP diff --git a/modules/gapi/include/opencv2/gapi/s11n/base.hpp b/modules/gapi/include/opencv2/gapi/s11n/base.hpp deleted file mode 100644 index 760e8515f6..0000000000 --- a/modules/gapi/include/opencv2/gapi/s11n/base.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// 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. -// -// Copyright (C) 2020-2021 Intel Corporation - -#ifndef OPENCV_GAPI_S11N_BASE_HPP -#define OPENCV_GAPI_S11N_BASE_HPP - -#include -#include - -namespace cv { -namespace gapi { - -/** - * @brief This namespace contains G-API serialization and - * deserialization functions and data structures. - */ -namespace s11n { -struct IOStream; -struct IIStream; - -namespace detail { - -//! @addtogroup gapi_serialization -//! @{ - -struct NotImplemented { -}; - -/** @brief This structure allows to implement serialization routines for custom types. - * - * The default S11N for custom types is not implemented. - * - * @note When providing an overloaded implementation for S11N with your type - * don't inherit it from NotImplemented structure. - * - * @note There are lots of overloaded >> and << operators for basic and OpenCV/G-API types - * which can be utilized when serializing a custom type. - * - * Example of usage: - * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/api_ref_snippets.cpp S11N usage - * - */ -template -struct S11N: public NotImplemented { - /** - * @brief This function allows user to serialize their custom type. - * - * @note The default overload throws an exception if called. User need to - * properly overload the function to use it. - */ - static void serialize(IOStream &, const T &) { - GAPI_Error("No serialization routine is provided!"); - } - /** - * @brief This function allows user to deserialize their custom type. - * - * @note The default overload throws an exception if called. User need to - * properly overload the function to use it. - */ - static T deserialize(IIStream &) { - GAPI_Error("No deserialization routine is provided!"); - } -}; - -/// @private -- Exclude this struct from OpenCV documentation -template struct has_S11N_spec { - static constexpr bool value = !std::is_base_of::type>>::value; -}; -//! @} gapi_serialization - -} // namespace detail -} // namespace s11n -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_S11N_BASE_HPP diff --git a/modules/gapi/include/opencv2/gapi/stereo.hpp b/modules/gapi/include/opencv2/gapi/stereo.hpp deleted file mode 100644 index 9b00267082..0000000000 --- a/modules/gapi/include/opencv2/gapi/stereo.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// 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 distereoibution and at http://opencv.org/license.html. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_STEREO_HPP -#define OPENCV_GAPI_STEREO_HPP - -#include -#include -#include - -namespace cv { -namespace gapi { - -/** - * The enum specified format of result that you get from @ref cv::gapi::stereo. - */ -enum class StereoOutputFormat { - DEPTH_FLOAT16, ///< Floating point 16 bit value, CV_16FC1. - ///< This identifier is deprecated, use DEPTH_16F instead. - DEPTH_FLOAT32, ///< Floating point 32 bit value, CV_32FC1 - ///< This identifier is deprecated, use DEPTH_16F instead. - DISPARITY_FIXED16_11_5, ///< 16 bit signed: first bit for sign, - ///< 10 bits for integer part, - ///< 5 bits for fractional part. - ///< This identifier is deprecated, - ///< use DISPARITY_16Q_10_5 instead. - DISPARITY_FIXED16_12_4, ///< 16 bit signed: first bit for sign, - ///< 11 bits for integer part, - ///< 4 bits for fractional part. - ///< This identifier is deprecated, - ///< use DISPARITY_16Q_11_4 instead. - DEPTH_16F = DEPTH_FLOAT16, ///< Same as DEPTH_FLOAT16 - DEPTH_32F = DEPTH_FLOAT32, ///< Same as DEPTH_FLOAT32 - DISPARITY_16Q_10_5 = DISPARITY_FIXED16_11_5, ///< Same as DISPARITY_FIXED16_11_5 - DISPARITY_16Q_11_4 = DISPARITY_FIXED16_12_4 ///< Same as DISPARITY_FIXED16_12_4 -}; - - -/** - * @brief This namespace contains G-API Operation Types for Stereo and - * related functionality. - */ -namespace calib3d { - -G_TYPED_KERNEL(GStereo, , "org.opencv.stereo") { - static GMatDesc outMeta(const GMatDesc &left, const GMatDesc &right, const StereoOutputFormat of) { - GAPI_Assert(left.chan == 1); - GAPI_Assert(left.depth == CV_8U); - - GAPI_Assert(right.chan == 1); - GAPI_Assert(right.depth == CV_8U); - - switch(of) { - case StereoOutputFormat::DEPTH_FLOAT16: - return left.withDepth(CV_16FC1); - case StereoOutputFormat::DEPTH_FLOAT32: - return left.withDepth(CV_32FC1); - case StereoOutputFormat::DISPARITY_FIXED16_11_5: - case StereoOutputFormat::DISPARITY_FIXED16_12_4: - return left.withDepth(CV_16SC1); - default: - GAPI_Error("Unknown output format!"); - } - } -}; - -} // namespace calib3d - -/** @brief Computes disparity/depth map for the specified stereo-pair. -The function computes disparity or depth map depending on passed StereoOutputFormat argument. - -@param left 8-bit single-channel left image of @ref CV_8UC1 type. -@param right 8-bit single-channel right image of @ref CV_8UC1 type. -@param of enum to specified output kind: depth or disparity and corresponding type -*/ -GAPI_EXPORTS GMat stereo(const GMat& left, - const GMat& right, - const StereoOutputFormat of = StereoOutputFormat::DEPTH_FLOAT32); -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STEREO_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/cap.hpp b/modules/gapi/include/opencv2/gapi/streaming/cap.hpp deleted file mode 100644 index 9c2185c1ab..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/cap.hpp +++ /dev/null @@ -1,149 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_CAP_HPP -#define OPENCV_GAPI_STREAMING_CAP_HPP - -/** - * YOUR ATTENTION PLEASE! - * - * This is a header-only implementation of cv::VideoCapture-based - * Stream source. It is not built by default with G-API as G-API - * doesn't depend on videoio module. - * - * If you want to use it in your application, please make sure - * videioio is available in your OpenCV package and is linked to your - * application. - * - * Note for developers: please don't put videoio dependency in G-API - * because of this file. - */ -#include -#include - -#include -#include -#include - -namespace cv { -namespace gapi { -namespace wip { - -/** - * @brief OpenCV's VideoCapture-based streaming source. - * - * This class implements IStreamSource interface. - * Its constructor takes the same parameters as cv::VideoCapture does. - * - * Please make sure that videoio OpenCV module is available before using - * this in your application (G-API doesn't depend on it directly). - * - * @note stream sources are passed to G-API via shared pointers, so - * please gapi::make_src<> to create objects and ptr() to pass a - * GCaptureSource to cv::gin(). - */ -class GCaptureSource: public IStreamSource -{ -public: - explicit GCaptureSource(int id, const std::map &properties = {}) - : cap(id) { prep(properties); } - - explicit GCaptureSource(const std::string &path, - const std::map &properties = {}) - : cap(path) { prep(properties); } - - void set(int propid, double value) { - cap.set(propid, value); - } - - // TODO: Add more constructor overloads to make it - // fully compatible with VideoCapture's interface. - -protected: - cv::VideoCapture cap; - cv::Mat first; - bool first_pulled = false; - int64_t counter = 0; - - void prep(const std::map &properties) - { - for (const auto &it : properties) { - cap.set(it.first, it.second); - } - - // Prepare first frame to report its meta to engine - // when needed - GAPI_Assert(first.empty()); - cv::Mat tmp; - if (!cap.read(tmp)) - { - GAPI_Error("Couldn't grab the very first frame"); - } - // NOTE: Some decode/media VideoCapture backends continue - // owning the video buffer under cv::Mat so in order to - // process it safely in a highly concurrent pipeline, clone() - // is the only right way. - first = tmp.clone(); - } - - virtual bool pull(cv::gapi::wip::Data &data) override - { - if (!first_pulled) - { - GAPI_Assert(!first.empty()); - first_pulled = true; - data = first; // no need to clone here since it was cloned already - } - else - { - if (!cap.isOpened()) return false; - - cv::Mat frame; - if (!cap.read(frame)) - { - // end-of-stream happened - return false; - } - // Same reason to clone as in prep() - data = frame.clone(); - } - // Tag data with seq_id/ts - const auto now = std::chrono::system_clock::now(); - const auto dur = std::chrono::duration_cast - (now.time_since_epoch()); - data.meta[cv::gapi::streaming::meta_tag::timestamp] = int64_t{dur.count()}; - data.meta[cv::gapi::streaming::meta_tag::seq_id] = int64_t{counter++}; - return true; - } - - virtual GMetaArg descr_of() const override - { - GAPI_Assert(!first.empty()); - return cv::GMetaArg{cv::descr_of(first)}; - } -}; - -// NB: Overload for using from python -GAPI_EXPORTS_W cv::Ptr -inline make_capture_src(const std::string& path, - const std::map& properties = {}) -{ - return make_src(path, properties); -} - -// NB: Overload for using from python -GAPI_EXPORTS_W cv::Ptr -inline make_capture_src(const int id, - const std::map& properties = {}) -{ - return make_src(id, properties); -} - -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_CAP_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/desync.hpp b/modules/gapi/include/opencv2/gapi/streaming/desync.hpp deleted file mode 100644 index 0e04f5beb9..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/desync.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// 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. -// -// Copyright (C) 2020-2021 Intel Corporation - - -#ifndef OPENCV_GAPI_GSTREAMING_DESYNC_HPP -#define OPENCV_GAPI_GSTREAMING_DESYNC_HPP - -#include - -#include -#include -#include -#include -#include - -namespace cv { -namespace gapi { -namespace streaming { - -namespace detail { -struct GDesync { - static const char *id() { - return "org.opencv.streaming.desync"; - } - - // An universal yield for desync. - // Yields output objects according to the input Types... - // Reuses gkernel machinery. - // FIXME: This function can be generic and declared in gkernel.hpp - // (it is there already, but a part of GKernelType[M] - template - static std::tuple yield(cv::GCall &call, cv::detail::Seq) { - return std::make_tuple(cv::detail::Yield::yield(call, IIs)...); - } -}; - -template -G desync(const G &g) { - cv::GKernel k{ - GDesync::id() // kernel id - , "" // kernel tag - , [](const GMetaArgs &a, const GArgs &) {return a;} // outMeta callback - , {cv::detail::GTypeTraits::shape} // output Shape - , {cv::detail::GTypeTraits::op_kind} // input data kinds - , {cv::detail::GObtainCtor::get()} // output template ctors - , {cv::detail::GTypeTraits::op_kind} // output data kinds - }; - cv::GCall call(std::move(k)); - call.pass(g); - return std::get<0>(GDesync::yield(call, cv::detail::MkSeq<1>::type())); -} -} // namespace detail - -/** - * @brief Starts a desynchronized branch in the graph. - * - * This operation takes a single G-API data object and returns a - * graph-level "duplicate" of this object. - * - * Operations which use this data object can be desynchronized - * from the rest of the graph. - * - * This operation has no effect when a GComputation is compiled with - * regular cv::GComputation::compile(), since cv::GCompiled objects - * always produce their full output vectors. - * - * This operation only makes sense when a GComputation is compiled in - * streaming mode with cv::GComputation::compileStreaming(). If this - * operation is used and there are desynchronized outputs, the user - * should use a special version of cv::GStreamingCompiled::pull() - * which produces an array of cv::util::optional<> objects. - * - * @note This feature is highly experimental now and is currently - * limited to a single GMat/GFrame argument only. - */ -GAPI_EXPORTS GMat desync(const GMat &g); -GAPI_EXPORTS GFrame desync(const GFrame &f); - -} // namespace streaming -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_GSTREAMING_DESYNC_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/format.hpp b/modules/gapi/include/opencv2/gapi/streaming/format.hpp deleted file mode 100644 index 739a3852a6..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/format.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - -#ifndef OPENCV_GAPI_GSTREAMING_FORMAT_HPP -#define OPENCV_GAPI_GSTREAMING_FORMAT_HPP - -#include // GKernelPackage - -namespace cv { -namespace gapi { -namespace streaming { - -GAPI_EXPORTS cv::GKernelPackage kernels(); - -G_API_OP(GBGR, , "org.opencv.streaming.BGR") -{ - static GMatDesc outMeta(const GFrameDesc& in) { return GMatDesc{CV_8U, 3, in.size}; } -}; - -G_API_OP(GY, , "org.opencv.streaming.Y") { - static GMatDesc outMeta(const GFrameDesc& frameDesc) { - return GMatDesc { CV_8U, 1, frameDesc.size , false }; - } -}; - -G_API_OP(GUV, , "org.opencv.streaming.UV") { - static GMatDesc outMeta(const GFrameDesc& frameDesc) { - return GMatDesc { CV_8U, 2, cv::Size(frameDesc.size.width / 2, frameDesc.size.height / 2), - false }; - } -}; - -/** @brief Gets bgr plane from input frame - -@note Function textual ID is "org.opencv.streaming.BGR" - -@param in Input frame -@return Image in BGR format -*/ -GAPI_EXPORTS cv::GMat BGR(const cv::GFrame& in); - -/** @brief Extracts Y plane from media frame. - -Output image is 8-bit 1-channel image of @ref CV_8UC1. - -@note Function textual ID is "org.opencv.streaming.Y" - -@param frame input media frame. -*/ -GAPI_EXPORTS GMat Y(const cv::GFrame& frame); - -/** @brief Extracts UV plane from media frame. - -Output image is 8-bit 2-channel image of @ref CV_8UC2. - -@note Function textual ID is "org.opencv.streaming.UV" - -@param frame input media frame. -*/ -GAPI_EXPORTS GMat UV(const cv::GFrame& frame); -} // namespace streaming - -//! @addtogroup gapi_transform -//! @{ -/** @brief Makes a copy of the input image. Note that this copy may be not real -(no actual data copied). Use this function to maintain graph contracts, -e.g when graph's input needs to be passed directly to output, like in Streaming mode. - -@note Function textual ID is "org.opencv.streaming.copy" - -@param in Input image -@return Copy of the input -*/ -GAPI_EXPORTS_W GMat copy(const GMat& in); - -/** @brief Makes a copy of the input frame. Note that this copy may be not real -(no actual data copied). Use this function to maintain graph contracts, -e.g when graph's input needs to be passed directly to output, like in Streaming mode. - -@note Function textual ID is "org.opencv.streaming.copy" - -@param in Input frame -@return Copy of the input -*/ -GAPI_EXPORTS GFrame copy(const GFrame& in); -//! @} gapi_transform - -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_GSTREAMING_FORMAT_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/gstreamer/gstreamerpipeline.hpp b/modules/gapi/include/opencv2/gapi/streaming/gstreamer/gstreamerpipeline.hpp deleted file mode 100644 index c566656cb6..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/gstreamer/gstreamerpipeline.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_GSTREAMER_GSTREAMERPIPELINE_HPP -#define OPENCV_GAPI_STREAMING_GSTREAMER_GSTREAMERPIPELINE_HPP - -#include -#include - -#include -#include -#include - -namespace cv { -namespace gapi { -namespace wip { -namespace gst { - -class GAPI_EXPORTS_W GStreamerPipeline -{ -public: - class Priv; - - GAPI_WRAP explicit GStreamerPipeline(const std::string& pipeline); - IStreamSource::Ptr getStreamingSource(const std::string& appsinkName, - const GStreamerSource::OutputType outputType = - GStreamerSource::OutputType::MAT); - virtual ~GStreamerPipeline(); - -protected: - explicit GStreamerPipeline(std::unique_ptr priv); - - std::unique_ptr m_priv; -}; - -} // namespace gst - -using GStreamerPipeline = gst::GStreamerPipeline; - -// NB: Function for using from python -// FIXME: a separate function is created due to absence of wrappers for `shared_ptr<> ` -// Ideally would be to wrap the `GStreamerPipeline::getStreamingSource()` method as is -GAPI_EXPORTS_W cv::Ptr -inline get_streaming_source(cv::Ptr& pipeline, - const std::string& appsinkName, - const GStreamerSource::OutputType outputType - = GStreamerSource::OutputType::MAT) -{ - return pipeline->getStreamingSource(appsinkName, outputType); -} - -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_GSTREAMER_GSTREAMERPIPELINE_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/gstreamer/gstreamersource.hpp b/modules/gapi/include/opencv2/gapi/streaming/gstreamer/gstreamersource.hpp deleted file mode 100644 index 8b8a5ae312..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/gstreamer/gstreamersource.hpp +++ /dev/null @@ -1,97 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_GSTREAMER_GSTREAMERSOURCE_HPP -#define OPENCV_GAPI_STREAMING_GSTREAMER_GSTREAMERSOURCE_HPP - -#include -#include - -#include - -namespace cv { -namespace gapi { -namespace wip { -namespace gst { - -/** - * @brief OpenCV's GStreamer streaming source. - * Streams cv::Mat-s/cv::MediaFrame from passed GStreamer pipeline. - * - * This class implements IStreamSource interface. - * - * To create GStreamerSource instance you need to pass 'pipeline' and, optionally, 'outputType' - * arguments into constructor. - * 'pipeline' should represent GStreamer pipeline in form of textual description. - * Almost any custom pipeline is supported which can be successfully ran via gst-launch. - * The only two limitations are: - * - there should be __one__ appsink element in the pipeline to pass data to OpenCV app. - * Pipeline can actually contain many sink elements, but it must have one and only one - * appsink among them. - * - * - data passed to appsink should be video-frame in NV12 or GRAY8 format. - * - * 'outputType' is used to select type of output data to produce: 'cv::MediaFrame' or 'cv::Mat'. - * To produce 'cv::MediaFrame'-s you need to pass 'GStreamerSource::OutputType::FRAME' and, - * correspondingly, 'GStreamerSource::OutputType::MAT' to produce 'cv::Mat'-s. - * Please note, that in the last case, output 'cv::Mat' will be of BGR format, internal conversion - * from NV12 / GRAY8 GStreamer data will happen. - * Default value for 'outputType' is 'GStreamerSource::OutputType::MAT'. - * - * @note Stream sources are passed to G-API via shared pointers, so please use gapi::make_src<> - * to create objects and ptr() to pass a GStreamerSource to cv::gin(). - * - * @note You need to build OpenCV with GStreamer support to use this class. - */ - -class GStreamerPipelineFacade; - -class GAPI_EXPORTS GStreamerSource : public IStreamSource -{ -public: - class Priv; - - // Indicates what type of data should be produced by GStreamerSource: cv::MediaFrame or cv::Mat - enum class OutputType { - FRAME, - MAT - }; - - GStreamerSource(const std::string& pipeline, - const GStreamerSource::OutputType outputType = - GStreamerSource::OutputType::MAT); - GStreamerSource(std::shared_ptr pipeline, - const std::string& appsinkName, - const GStreamerSource::OutputType outputType = - GStreamerSource::OutputType::MAT); - - bool pull(cv::gapi::wip::Data& data) override; - GMetaArg descr_of() const override; - ~GStreamerSource() override; - -protected: - explicit GStreamerSource(std::unique_ptr priv); - - std::unique_ptr m_priv; -}; - -} // namespace gst - -using GStreamerSource = gst::GStreamerSource; - -// NB: Overload for using from python -GAPI_EXPORTS_W cv::Ptr -inline make_gst_src(const std::string& pipeline, - const GStreamerSource::OutputType outputType = - GStreamerSource::OutputType::MAT) -{ - return make_src(pipeline, outputType); -} -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_GSTREAMER_GSTREAMERSOURCE_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/meta.hpp b/modules/gapi/include/opencv2/gapi/streaming/meta.hpp deleted file mode 100644 index cdd3d371cb..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/meta.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - - -#ifndef OPENCV_GAPI_GSTREAMING_META_HPP -#define OPENCV_GAPI_GSTREAMING_META_HPP - -#include -#include -#include -#include - -namespace cv { -namespace gapi { -namespace streaming { - -// FIXME: the name is debatable -namespace meta_tag { -static constexpr const char * timestamp = "org.opencv.gapi.meta.timestamp"; -static constexpr const char * seq_id = "org.opencv.gapi.meta.seq_id"; -} // namespace meta_tag - -namespace detail { -struct GMeta { - static const char *id() { - return "org.opencv.streaming.meta"; - } - // A universal yield for meta(), same as in GDesync - template - static std::tuple yield(cv::GCall &call, cv::detail::Seq) { - return std::make_tuple(cv::detail::Yield::yield(call, IIs)...); - } - // Also a universal outMeta stub here - static GMetaArgs getOutMeta(const GMetaArgs &args, const GArgs &) { - return args; - } -}; -} // namespace detail - -template -cv::GOpaque meta(G g, const std::string &tag) { - using O = cv::GOpaque; - cv::GKernel k{ - detail::GMeta::id() // kernel id - , tag // kernel tag. Use meta tag here - , &detail::GMeta::getOutMeta // outMeta callback - , {cv::detail::GTypeTraits::shape} // output Shape - , {cv::detail::GTypeTraits::op_kind} // input data kinds - , {cv::detail::GObtainCtor::get()} // output template ctors - , {cv::detail::GTypeTraits::op_kind} // output data kind - }; - cv::GCall call(std::move(k)); - call.pass(g); - return std::get<0>(detail::GMeta::yield(call, cv::detail::MkSeq<1>::type())); -} - -template -cv::GOpaque timestamp(G g) { - return meta(g, meta_tag::timestamp); -} - -template -cv::GOpaque seq_id(G g) { - return meta(g, meta_tag::seq_id); -} - -template -cv::GOpaque seqNo(G g) { - // Old name, compatibility only - return seq_id(g); -} - -} // namespace streaming -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_GSTREAMING_META_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/onevpl/accel_types.hpp b/modules/gapi/include/opencv2/gapi/streaming/onevpl/accel_types.hpp deleted file mode 100644 index b670aebd1d..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/onevpl/accel_types.hpp +++ /dev/null @@ -1,76 +0,0 @@ -// 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. -// -// Copyright (C) 2022 Intel Corporation - -#ifndef GAPI_STREAMING_ONEVPL_ACCEL_TYPES_HPP -#define GAPI_STREAMING_ONEVPL_ACCEL_TYPES_HPP - -#include -#include - -#include "opencv2/gapi/own/exports.hpp" // GAPI_EXPORTS - -namespace cv { -namespace gapi { -namespace wip { -namespace onevpl { - -enum class AccelType: uint8_t { - HOST, - DX11, - VAAPI, - - LAST_VALUE = std::numeric_limits::max() -}; - -GAPI_EXPORTS const char* to_cstring(AccelType type); - -struct IDeviceSelector; -struct GAPI_EXPORTS Device { - friend struct IDeviceSelector; - using Ptr = void*; - - ~Device(); - const std::string& get_name() const; - Ptr get_ptr() const; - AccelType get_type() const; -private: - Device(Ptr device_ptr, const std::string& device_name, - AccelType device_type); - - std::string name; - Ptr ptr; - AccelType type; -}; - -struct GAPI_EXPORTS Context { - friend struct IDeviceSelector; - using Ptr = void*; - - ~Context(); - Ptr get_ptr() const; - AccelType get_type() const; -private: - Context(Ptr ctx_ptr, AccelType ctx_type); - Ptr ptr; - AccelType type; -}; - -GAPI_EXPORTS Device create_host_device(); -GAPI_EXPORTS Context create_host_context(); - -GAPI_EXPORTS Device create_dx11_device(Device::Ptr device_ptr, - const std::string& device_name); -GAPI_EXPORTS Context create_dx11_context(Context::Ptr ctx_ptr); - -GAPI_EXPORTS Device create_vaapi_device(Device::Ptr device_ptr, - const std::string& device_name); -GAPI_EXPORTS Context create_vaapi_context(Context::Ptr ctx_ptr); -} // namespace onevpl -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // GAPI_STREAMING_ONEVPL_ACCEL_TYPES_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/onevpl/cfg_params.hpp b/modules/gapi/include/opencv2/gapi/streaming/onevpl/cfg_params.hpp deleted file mode 100644 index 0db9a86e58..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/onevpl/cfg_params.hpp +++ /dev/null @@ -1,209 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_ONEVPL_CFG_PARAMS_HPP -#define OPENCV_GAPI_STREAMING_ONEVPL_CFG_PARAMS_HPP - -#include -#include -#include - -#include -#include - -namespace cv { -namespace gapi { -namespace wip { -namespace onevpl { - -/** - * @brief Public class is using for creation of onevpl::GSource instances. - * - * Class members available through methods @ref CfgParam::get_name() and @ref CfgParam::get_value() are used by - * onevpl::GSource inner logic to create or find oneVPL particular implementation - * (software/hardware, specific API version and etc.). - * - * @note Because oneVPL may provide several implementations which are satisfying with multiple (or single one) @ref CfgParam - * criteria therefore it is possible to configure `preferred` parameters. This kind of CfgParams are created - * using `is_major = false` argument in @ref CfgParam::create method and are not used by creating oneVPL particular implementations. - * Instead they fill out a "score table" to select preferable implementation from available list. Implementation are satisfying - * with most of these optional params would be chosen. - * If no one optional CfgParam params were present then first of available oneVPL implementation would be applied. - * Please get on https://spec.oneapi.io/versions/latest/elements/oneVPL/source/API_ref/VPL_disp_api_func.html?highlight=mfxcreateconfig#mfxsetconfigfilterproperty - * for using OneVPL configuration. In this schema `mfxU8 *name` represents @ref CfgParam::get_name() and - * `mfxVariant value` is @ref CfgParam::get_value() - */ -struct GAPI_EXPORTS CfgParam { - using name_t = std::string; - using value_t = cv::util::variant; - /** - * @brief frames_pool_size_name - * - * Special configuration parameter name for onevp::GSource: - * - * @note frames_pool_size_name allows to allocate surfaces pool appropriate size to keep - * decoded frames in accelerator memory ready before - * they would be consumed by onevp::GSource::pull operation. If you see - * a lot of WARNING about lack of free surface then it's time to increase - * frames_pool_size_name but be aware of accelerator free memory volume. - * If not set then MFX implementation use - * mfxFrameAllocRequest::NumFrameSuggested behavior - * - */ - static constexpr const char *frames_pool_size_name() { return "frames_pool_size"; } - static CfgParam create_frames_pool_size(size_t value); - - /** - * @brief acceleration_mode_name - * - * Special configuration parameter names for onevp::GSource: - * - * @note acceleration_mode_name allows to activate hardware acceleration & - * device memory management. - * Supported values: - * - MFX_ACCEL_MODE_VIA_D3D11 Will activate DX11 acceleration and will produces - * MediaFrames with data allocated in DX11 device memory - * - * If not set then MFX implementation will use default acceleration behavior: - * all decoding operation uses default GPU resources but MediaFrame produces - * data allocated by using host RAM - * - */ - static constexpr const char *acceleration_mode_name() { return "mfxImplDescription.AccelerationMode"; } - static CfgParam create_acceleration_mode(uint32_t value); - static CfgParam create_acceleration_mode(const char* value); - - /** - * @brief decoder_id_name - * - * Special configuration parameter names for onevp::GSource: - * - * @note decoder_id_name allows to specify VPL decoder type which MUST present - * in case of RAW video input data and MUST NOT present as CfgParam if video - * stream incapsulated into container(*.mp4, *.mkv and so on). In latter case - * onevp::GSource will determine it automatically - * Supported values: - * - MFX_CODEC_AVC - * - MFX_CODEC_HEVC - * - MFX_CODEC_MPEG2 - * - MFX_CODEC_VC1 - * - MFX_CODEC_CAPTURE - * - MFX_CODEC_VP9 - * - MFX_CODEC_AV1 - * - */ - static constexpr const char *decoder_id_name() { return "mfxImplDescription.mfxDecoderDescription.decoder.CodecID"; } - static CfgParam create_decoder_id(uint32_t value); - static CfgParam create_decoder_id(const char* value); - - static constexpr const char *implementation_name() { return "mfxImplDescription.Impl"; } - static CfgParam create_implementation(uint32_t value); - static CfgParam create_implementation(const char* value); - - - static constexpr const char *vpp_frames_pool_size_name() { return "vpp_frames_pool_size"; } - static CfgParam create_vpp_frames_pool_size(size_t value); - - static constexpr const char *vpp_in_width_name() { return "vpp.In.Width"; } - static CfgParam create_vpp_in_width(uint16_t value); - - static constexpr const char *vpp_in_height_name() { return "vpp.In.Height"; } - static CfgParam create_vpp_in_height(uint16_t value); - - static constexpr const char *vpp_in_crop_x_name() { return "vpp.In.CropX"; } - static CfgParam create_vpp_in_crop_x(uint16_t value); - - static constexpr const char *vpp_in_crop_y_name() { return "vpp.In.CropY"; } - static CfgParam create_vpp_in_crop_y(uint16_t value); - - static constexpr const char *vpp_in_crop_w_name() { return "vpp.In.CropW"; } - static CfgParam create_vpp_in_crop_w(uint16_t value); - - static constexpr const char *vpp_in_crop_h_name() { return "vpp.In.CropH"; } - static CfgParam create_vpp_in_crop_h(uint16_t value); - - - static constexpr const char *vpp_out_fourcc_name() { return "vpp.Out.FourCC"; } - static CfgParam create_vpp_out_fourcc(uint32_t value); - - static constexpr const char *vpp_out_chroma_format_name() { return "vpp.Out.ChromaFormat"; } - static CfgParam create_vpp_out_chroma_format(uint16_t value); - - static constexpr const char *vpp_out_width_name() { return "vpp.Out.Width"; } - static CfgParam create_vpp_out_width(uint16_t value); - - static constexpr const char *vpp_out_height_name() { return "vpp.Out.Height"; } - static CfgParam create_vpp_out_height(uint16_t value); - - static constexpr const char *vpp_out_crop_x_name() { return "vpp.Out.CropX"; } - static CfgParam create_vpp_out_crop_x(uint16_t value); - - static constexpr const char *vpp_out_crop_y_name() { return "vpp.Out.CropY"; } - static CfgParam create_vpp_out_crop_y(uint16_t value); - - static constexpr const char *vpp_out_crop_w_name() { return "vpp.Out.CropW"; } - static CfgParam create_vpp_out_crop_w(uint16_t value); - - static constexpr const char *vpp_out_crop_h_name() { return "vpp.Out.CropH"; } - static CfgParam create_vpp_out_crop_h(uint16_t value); - - static constexpr const char *vpp_out_pic_struct_name() { return "vpp.Out.PicStruct"; } - static CfgParam create_vpp_out_pic_struct(uint16_t value); - - static constexpr const char *vpp_out_framerate_n_name() { return "vpp.Out.FrameRateExtN"; } - static CfgParam create_vpp_out_framerate_n(uint32_t value); - - static constexpr const char *vpp_out_framerate_d_name() { return "vpp.Out.FrameRateExtD"; } - static CfgParam create_vpp_out_framerate_d(uint32_t value); - - /** - * Create generic onevp::GSource configuration parameter. - * - *@param name name of parameter. - *@param value value of parameter. - *@param is_major TRUE if parameter MUST be provided by OneVPL inner implementation, FALSE for optional (for resolve multiple available implementations). - * - */ - template - static CfgParam create(const std::string& name, ValueType&& value, bool is_major = true) { - CfgParam param(name, CfgParam::value_t(std::forward(value)), is_major); - return param; - } - - struct Priv; - - const name_t& get_name() const; - const value_t& get_value() const; - bool is_major() const; - std::string to_string() const; - - bool operator==(const CfgParam& rhs) const; - bool operator< (const CfgParam& rhs) const; - bool operator!=(const CfgParam& rhs) const; - - CfgParam& operator=(const CfgParam& src); - CfgParam& operator=(CfgParam&& src); - CfgParam(const CfgParam& src); - CfgParam(CfgParam&& src); - ~CfgParam(); -private: - CfgParam(const std::string& param_name, value_t&& param_value, bool is_major_param); - std::shared_ptr m_priv; -}; - -} //namespace onevpl -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_ONEVPL_CFG_PARAMS_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/onevpl/data_provider_interface.hpp b/modules/gapi/include/opencv2/gapi/streaming/onevpl/data_provider_interface.hpp deleted file mode 100644 index ec683a7527..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/onevpl/data_provider_interface.hpp +++ /dev/null @@ -1,105 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef GAPI_STREAMING_ONEVPL_ONEVPL_DATA_PROVIDER_INTERFACE_HPP -#define GAPI_STREAMING_ONEVPL_ONEVPL_DATA_PROVIDER_INTERFACE_HPP -#include -#include -#include - -#include // GAPI_EXPORTS -namespace cv { -namespace gapi { -namespace wip { -namespace onevpl { - -struct GAPI_EXPORTS DataProviderException : public std::exception { - DataProviderException(const std::string& descr); - DataProviderException(std::string&& descr); - - virtual ~DataProviderException() = default; - virtual const char* what() const noexcept override; -private: - std::string reason; -}; - -struct GAPI_EXPORTS DataProviderSystemErrorException final : public DataProviderException { - DataProviderSystemErrorException(int error_code, const std::string& description = std::string()); - ~DataProviderSystemErrorException() = default; -}; - -struct GAPI_EXPORTS DataProviderUnsupportedException final : public DataProviderException { - DataProviderUnsupportedException(const std::string& description); - ~DataProviderUnsupportedException() = default; -}; - -struct GAPI_EXPORTS DataProviderImplementationException : public DataProviderException { - DataProviderImplementationException(const std::string& description); - ~DataProviderImplementationException() = default; -}; -/** - * @brief Public interface allows to customize extraction of video stream data - * used by onevpl::GSource instead of reading stream from file (by default). - * - * Interface implementation constructor MUST provide consistency and creates fully operable object. - * If error happened implementation MUST throw `DataProviderException` kind exceptions - * - * @note Interface implementation MUST manage stream and other constructed resources by itself to avoid any kind of leak. - * For simple interface implementation example please see `StreamDataProvider` in `tests/streaming/gapi_streaming_tests.cpp` - */ -struct GAPI_EXPORTS IDataProvider { - using Ptr = std::shared_ptr; - using mfx_codec_id_type = uint32_t; - - /** - * NB: here is supposed to be forward declaration of mfxBitstream - * But according to current oneVPL implementation it is impossible to forward - * declare untagged struct mfxBitstream. - * - * IDataProvider makes sense only for HAVE_VPL is ON and to keep IDataProvider - * interface API/ABI compliant between core library and user application layer - * let's introduce wrapper mfx_bitstream which inherits mfxBitstream in private - * G-API code section and declare forward for wrapper mfx_bitstream here - */ - struct mfx_bitstream; - - virtual ~IDataProvider() = default; - - /** - * The function is used by onevpl::GSource to extract codec id from data - * - */ - virtual mfx_codec_id_type get_mfx_codec_id() const = 0; - - /** - * The function is used by onevpl::GSource to extract binary data stream from @ref IDataProvider - * implementation. - * - * It MUST throw `DataProviderException` kind exceptions in fail cases. - * It MUST return MFX_ERR_MORE_DATA in EOF which considered as not-fail case. - * - * @param in_out_bitsream the input-output reference on MFX bitstream buffer which MUST be empty at the first request - * to allow implementation to allocate it by itself and to return back. Subsequent invocation of `fetch_bitstream_data` - * MUST use the previously used in_out_bitsream to avoid skipping rest of frames which haven't been consumed - * @return true for fetched data, false on EOF and throws exception on error - */ - virtual bool fetch_bitstream_data(std::shared_ptr &in_out_bitsream) = 0; - - /** - * The function is used by onevpl::GSource to check more binary data availability. - * - * It MUST return TRUE in case of EOF and NO_THROW exceptions. - * - * @return boolean value which detects end of stream - */ - virtual bool empty() const = 0; -}; -} // namespace onevpl -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // GAPI_STREAMING_ONEVPL_ONEVPL_DATA_PROVIDER_INTERFACE_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/onevpl/default.hpp b/modules/gapi/include/opencv2/gapi/streaming/onevpl/default.hpp deleted file mode 100644 index 8b547e1aba..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/onevpl/default.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// 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. -// -// Copyright (C) 2022 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_ONEVPL_UTILS_HPP -#define OPENCV_GAPI_STREAMING_ONEVPL_UTILS_HPP - -#include // GAPI_EXPORTS -#include -#include - -namespace cv { -namespace gapi { -namespace wip { -namespace onevpl { - -/** - * @brief Provides default device selector based on config. - */ -GAPI_EXPORTS std::shared_ptr getDefaultDeviceSelector(const std::vector& cfg_params); - -} // namespace onevpl -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_ONEVPL_UTILS_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/onevpl/device_selector_interface.hpp b/modules/gapi/include/opencv2/gapi/streaming/onevpl/device_selector_interface.hpp deleted file mode 100644 index 2e2d879fba..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/onevpl/device_selector_interface.hpp +++ /dev/null @@ -1,61 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef GAPI_STREAMING_ONEVPL_DEVICE_SELECTOR_INTERFACE_HPP -#define GAPI_STREAMING_ONEVPL_DEVICE_SELECTOR_INTERFACE_HPP - -#include -#include -#include -#include - -#include - -namespace cv { -namespace gapi { -namespace wip { -namespace onevpl { -struct GAPI_EXPORTS IDeviceSelector { - using Ptr = std::shared_ptr; - - struct GAPI_EXPORTS Score { - friend struct IDeviceSelector; - using Type = int16_t; - static constexpr Type MaxActivePriority = std::numeric_limits::max(); - static constexpr Type MinActivePriority = 0; - static constexpr Type MaxPassivePriority = MinActivePriority - 1; - static constexpr Type MinPassivePriority = std::numeric_limits::min(); - - Score(Type val); - ~Score(); - - operator Type () const; - Type get() const; - friend bool operator< (Score lhs, Score rhs) { - return lhs.get() < rhs.get(); - } - private: - Type value; - }; - - using DeviceScoreTable = std::map; - using DeviceContexts = std::vector; - - virtual ~IDeviceSelector(); - virtual DeviceScoreTable select_devices() const = 0; - virtual DeviceContexts select_context() = 0; -protected: - template - static Entity create(Args &&...args) { - return Entity(std::forward(args)...); - } -}; -} // namespace onevpl -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // GAPI_STREAMING_ONEVPL_DEVICE_SELECTOR_INTERFACE_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/onevpl/source.hpp b/modules/gapi/include/opencv2/gapi/streaming/onevpl/source.hpp deleted file mode 100644 index 04dc2e246d..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/onevpl/source.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_ONEVPL_ONEVPL_SOURCE_HPP -#define OPENCV_GAPI_STREAMING_ONEVPL_ONEVPL_SOURCE_HPP - -#include -#include -#include -#include -#include -#include - -namespace cv { -namespace gapi { -namespace wip { -namespace onevpl { -using CfgParams = std::vector; - -/** - * @brief G-API streaming source based on OneVPL implementation. - * - * This class implements IStreamSource interface. - * Its constructor takes source file path (in usual way) or @ref onevpl::IDataProvider - * interface implementation (for not file-based sources). It also allows to pass-through - * oneVPL configuration parameters by using several @ref onevpl::CfgParam. - * - * @note stream sources are passed to G-API via shared pointers, so - * please gapi::make_onevpl_src<> to create objects and ptr() to pass a - * GSource to cv::gin(). - */ -class GAPI_EXPORTS GSource : public IStreamSource -{ -public: - struct Priv; - - GSource(const std::string& filePath, - const CfgParams& cfg_params = CfgParams{}); - - GSource(const std::string& filePath, - const CfgParams& cfg_params, - const std::string& device_id, - void* accel_device_ptr, - void* accel_ctx_ptr); - - GSource(const std::string& filePath, - const CfgParams& cfg_params, - const Device &device, const Context &ctx); - - GSource(const std::string& filePath, - const CfgParams& cfg_params, - std::shared_ptr selector); - - - GSource(std::shared_ptr source, - const CfgParams& cfg_params = CfgParams{}); - - GSource(std::shared_ptr source, - const CfgParams& cfg_params, - const std::string& device_id, - void* accel_device_ptr, - void* accel_ctx_ptr); - - GSource(std::shared_ptr source, - const CfgParams& cfg_params, - std::shared_ptr selector); - - ~GSource() override; - - bool pull(cv::gapi::wip::Data& data) override; - GMetaArg descr_of() const override; - -private: - explicit GSource(std::unique_ptr&& impl); - std::unique_ptr m_priv; -}; -} // namespace onevpl - -using GVPLSource = onevpl::GSource; - -template -GAPI_EXPORTS_W cv::Ptr inline make_onevpl_src(Args&&... args) -{ - return make_src(std::forward(args)...); -} - -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_ONEVPL_ONEVPL_SOURCE_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/queue_source.hpp b/modules/gapi/include/opencv2/gapi/streaming/queue_source.hpp deleted file mode 100644 index bd385ed16e..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/queue_source.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// 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. -// -// Copyright (C) 2023 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_QUEUE_SOURCE_HPP -#define OPENCV_GAPI_STREAMING_QUEUE_SOURCE_HPP - -#include // shared_ptr -#include // is_base_of - -#include // GRunArgs -#include // GMetaArg + all descr_of -#include // IStreamSource - -namespace cv { -namespace gapi { -namespace wip { -struct Data; // fwd-declare to avoid circular? header dependencies - -class GAPI_EXPORTS QueueSourceBase: public cv::gapi::wip::IStreamSource { - class Priv; - std::shared_ptr m_priv; - // FIXME: Need to understand how it works with IStreamSource's shared_from_this - // Can we avoid having too many shared_ptrs here? - -public: - explicit QueueSourceBase(const cv::GMetaArg &m); - void push(Data &&data); - virtual bool pull(Data &data) override; - virtual void halt() override; - virtual GMetaArg descr_of() const override; - virtual ~QueueSourceBase() = default; -}; - -/** - * @brief Queued streaming pipeline source. - * - */ -template -class QueueSource final: public QueueSourceBase -{ -public: - using Meta = decltype(cv::descr_of(T{})); - explicit QueueSource(Meta m) : QueueSourceBase(GMetaArg{m}) { - } - void push(T t) { - QueueSourceBase::push(Data{t}); - } -}; - -class GAPI_EXPORTS QueueInput { - std::vector > m_sources; - -public: - explicit QueueInput(const cv::GMetaArgs &args); - - void push(cv::GRunArgs &&ins); - operator cv::GRunArgs(); -}; - -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_SOURCE_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/source.hpp b/modules/gapi/include/opencv2/gapi/streaming/source.hpp deleted file mode 100644 index 267469ad1b..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/source.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// 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. -// -// Copyright (C) 2019 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_SOURCE_HPP -#define OPENCV_GAPI_STREAMING_SOURCE_HPP - -#include // shared_ptr -#include // is_base_of - -#include // GMetaArg - - -namespace cv { -namespace gapi { -namespace wip { -struct Data; // forward-declaration of Data to avoid circular dependencies - -/** - * @brief Abstract streaming pipeline source. - * - * Implement this interface if you want customize the way how data is - * streaming into GStreamingCompiled. - * - * Objects implementing this interface can be passed to - * GStreamingCompiled using setSource() with cv::gin(). Regular - * compiled graphs (GCompiled) don't support input objects of this - * type. - * - * Default cv::VideoCapture-based implementation is available, see - * cv::gapi::wip::GCaptureSource. - * - * @note stream sources are passed to G-API via shared pointers, so - * please use ptr() when passing a IStreamSource implementation to - * cv::gin(). - */ -class IStreamSource: public std::enable_shared_from_this -{ -public: - using Ptr = std::shared_ptr; - Ptr ptr() { return shared_from_this(); } - virtual bool pull(Data &data) = 0; - virtual GMetaArg descr_of() const = 0; - virtual void halt() { - // Do nothing by default to maintain compatibility with the existing sources... - // In fact needs to be decorated atop of the child classes to maintain the behavior - // FIXME: Make it mandatory in OpenCV 5.0 - }; - virtual ~IStreamSource() = default; -}; - -template -IStreamSource::Ptr inline make_src(Args&&... args) -{ - static_assert(std::is_base_of::value, - "T must implement the cv::gapi::IStreamSource interface!"); - auto src_ptr = std::make_shared(std::forward(args)...); - return src_ptr->ptr(); -} - -} // namespace wip -} // namespace gapi -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_SOURCE_HPP diff --git a/modules/gapi/include/opencv2/gapi/streaming/sync.hpp b/modules/gapi/include/opencv2/gapi/streaming/sync.hpp deleted file mode 100644 index 5801e6f00a..0000000000 --- a/modules/gapi/include/opencv2/gapi/streaming/sync.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_STREAMING_SYNC_HPP -#define OPENCV_GAPI_STREAMING_SYNC_HPP - -namespace cv { -namespace gapi { -namespace streaming { - -enum class sync_policy { - dont_sync, - drop -}; - -} // namespace streaming -} // namespace gapi - -namespace detail { - template<> struct CompileArgTag { - static const char* tag() { return "gapi.streaming.sync_policy"; } - }; - -} // namespace detail -} // namespace cv - -#endif // OPENCV_GAPI_STREAMING_SYNC_HPP diff --git a/modules/gapi/include/opencv2/gapi/util/any.hpp b/modules/gapi/include/opencv2/gapi/util/any.hpp deleted file mode 100644 index 94451c7717..0000000000 --- a/modules/gapi/include/opencv2/gapi/util/any.hpp +++ /dev/null @@ -1,190 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_UTIL_ANY_HPP -#define OPENCV_GAPI_UTIL_ANY_HPP - -#include -#include -#include -#include - -#include - -#if defined(_MSC_VER) - // disable MSVC warning on "multiple copy constructors specified" -# pragma warning(disable: 4521) -#endif - -namespace cv -{ - -namespace internal -{ - template - T down_cast(Source operand) - { -#if defined(__GXX_RTTI) || defined(_CPPRTTI) - return dynamic_cast(operand); -#else -#ifdef __GNUC__ -#warning used static cast instead of dynamic because RTTI is disabled -#else -#pragma message("WARNING: used static cast instead of dynamic because RTTI is disabled") -#endif - return static_cast(operand); -#endif - } -} - -namespace util -{ - class bad_any_cast : public std::bad_cast - { - public: - virtual const char* what() const noexcept override - { - return "Bad any cast"; - } - }; - - //modeled against C++17 std::any - - class any - { - private: - struct holder; - using holder_ptr = std::unique_ptr; - struct holder - { - virtual holder_ptr clone() = 0; - virtual ~holder() = default; - }; - - template - struct holder_impl : holder - { - value_t v; - template - holder_impl(arg_t&& a) : v(std::forward(a)) {} - holder_ptr clone() override { return holder_ptr(new holder_impl (v));} - }; - - holder_ptr hldr; - public: - template - any(value_t&& arg) : hldr(new holder_impl::type>( std::forward(arg))) {} - - any(any const& src) : hldr( src.hldr ? src.hldr->clone() : nullptr) {} - //simple hack in order not to write enable_if for the template constructor - any(any & src) : any (const_cast(src)) {} - - any() = default; - any(any&& ) = default; - - any& operator=(any&&) = default; - - any& operator=(any const& src) - { - any copy(src); - swap(*this, copy); - return *this; - } - - template - friend value_t* any_cast(any* operand); - - template - friend const value_t* any_cast(const any* operand); - - template - friend value_t& unsafe_any_cast(any& operand); - - template - friend const value_t& unsafe_any_cast(const any& operand); - - friend void swap(any & lhs, any& rhs) - { - swap(lhs.hldr, rhs.hldr); - } - - }; - - template - value_t* any_cast(any* operand) - { - auto casted = internal::down_cast::type> *>(operand->hldr.get()); - if (casted){ - return & (casted->v); - } - return nullptr; - } - - template - const value_t* any_cast(const any* operand) - { - auto casted = internal::down_cast::type> *>(operand->hldr.get()); - if (casted){ - return & (casted->v); - } - return nullptr; - } - - template - value_t& any_cast(any& operand) - { - auto ptr = any_cast(&operand); - if (ptr) - { - return *ptr; - } - - throw_error(bad_any_cast()); - } - - - template - const value_t& any_cast(const any& operand) - { - auto ptr = any_cast(&operand); - if (ptr) - { - return *ptr; - } - - throw_error(bad_any_cast()); - } - - template - inline value_t& unsafe_any_cast(any& operand) - { -#ifdef DEBUG - return any_cast(operand); -#else - return static_cast::type> *>(operand.hldr.get())->v; -#endif - } - - template - inline const value_t& unsafe_any_cast(const any& operand) - { -#ifdef DEBUG - return any_cast(operand); -#else - return static_cast::type> *>(operand.hldr.get())->v; -#endif - } - -} // namespace util -} // namespace cv - -#if defined(_MSC_VER) - // Enable "multiple copy constructors specified" back -# pragma warning(default: 4521) -#endif - -#endif // OPENCV_GAPI_UTIL_ANY_HPP diff --git a/modules/gapi/include/opencv2/gapi/util/compiler_hints.hpp b/modules/gapi/include/opencv2/gapi/util/compiler_hints.hpp deleted file mode 100644 index a41a97145d..0000000000 --- a/modules/gapi/include/opencv2/gapi/util/compiler_hints.hpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - -#ifndef OPENCV_GAPI_UTIL_COMPILER_HINTS_HPP -#define OPENCV_GAPI_UTIL_COMPILER_HINTS_HPP - -namespace cv -{ -namespace util -{ - //! Utility template function to prevent "unused" warnings by various compilers. - template void suppress_unused_warning( const T& ) {} -} // namespace util -} // namespace cv - -#endif /* OPENCV_GAPI_UTIL_COMPILER_HINTS_HPP */ diff --git a/modules/gapi/include/opencv2/gapi/util/copy_through_move.hpp b/modules/gapi/include/opencv2/gapi/util/copy_through_move.hpp deleted file mode 100644 index 1a1121eb21..0000000000 --- a/modules/gapi/include/opencv2/gapi/util/copy_through_move.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - -#ifndef OPENCV_GAPI_UTIL_COPY_THROUGH_MOVE_HPP -#define OPENCV_GAPI_UTIL_COPY_THROUGH_MOVE_HPP - -#include //decay_t - -namespace cv -{ -namespace util -{ - //This is a tool to move initialize captures of a lambda in C++11 - template - struct copy_through_move_t{ - T value; - const T& get() const {return value;} - T& get() {return value;} - copy_through_move_t(T&& g) : value(std::move(g)) {} - copy_through_move_t(copy_through_move_t&&) = default; - copy_through_move_t(copy_through_move_t const& lhs) : copy_through_move_t(std::move(const_cast(lhs))) {} - }; - - template - copy_through_move_t> copy_through_move(T&& t){ - return std::forward(t); - } -} // namespace util -} // namespace cv - -#endif /* OPENCV_GAPI_UTIL_COPY_THROUGH_MOVE_HPP */ diff --git a/modules/gapi/include/opencv2/gapi/util/optional.hpp b/modules/gapi/include/opencv2/gapi/util/optional.hpp deleted file mode 100644 index dca03cadad..0000000000 --- a/modules/gapi/include/opencv2/gapi/util/optional.hpp +++ /dev/null @@ -1,178 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_UTIL_OPTIONAL_HPP -#define OPENCV_GAPI_UTIL_OPTIONAL_HPP - -#include - -// A poor man's `optional` implementation, incompletely modeled against C++17 spec. -namespace cv -{ -namespace util -{ - class bad_optional_access: public std::exception - { - public: - virtual const char *what() const noexcept override - { - return "Bad optional access"; - } - }; - - // TODO: nullopt_t - - // Interface /////////////////////////////////////////////////////////////// - template class optional - { - public: - // Constructors - // NB.: there were issues with Clang 3.8 when =default() was used - // instead {} - optional() {} - optional(const optional&) = default; - explicit optional(T&&) noexcept; - explicit optional(const T&) noexcept; - optional(optional&&) noexcept; - // TODO: optional(nullopt_t) noexcept; - // TODO: optional(const optional &) - // TODO: optional(optional &&) - // TODO: optional(Args&&...) - // TODO: optional(initializer_list) - // TODO: optional(U&& value); - - // Assignment - optional& operator=(const optional&) = default; - optional& operator=(optional&&); - - // Observers - T* operator-> (); - const T* operator-> () const; - T& operator* (); - const T& operator* () const; - // TODO: && versions - - operator bool() const noexcept; - bool has_value() const noexcept; - - T& value(); - const T& value() const; - // TODO: && versions - - template - T value_or(U &&default_value) const; - - void swap(optional &other) noexcept; - void reset() noexcept; - // TODO: emplace - - // TODO: operator==, !=, <, <=, >, >= - - private: - struct nothing {}; - util::variant m_holder; - }; - - template - optional::type> make_optional(T&& value); - - // TODO: Args... and initializer_list versions - - // Implementation ////////////////////////////////////////////////////////// - template optional::optional(T &&v) noexcept - : m_holder(std::move(v)) - { - } - - template optional::optional(const T &v) noexcept - : m_holder(v) - { - } - - template optional::optional(optional&& rhs) noexcept - : m_holder(std::move(rhs.m_holder)) - { - rhs.reset(); - } - - template optional& optional::operator=(optional&& rhs) - { - m_holder = std::move(rhs.m_holder); - rhs.reset(); - return *this; - } - - template T* optional::operator-> () - { - return & *(*this); - } - - template const T* optional::operator-> () const - { - return & *(*this); - } - - template T& optional::operator* () - { - return this->value(); - } - - template const T& optional::operator* () const - { - return this->value(); - } - - template optional::operator bool() const noexcept - { - return this->has_value(); - } - - template bool optional::has_value() const noexcept - { - return util::holds_alternative(m_holder); - } - - template T& optional::value() - { - if (!this->has_value()) - throw_error(bad_optional_access()); - return util::get(m_holder); - } - - template const T& optional::value() const - { - if (!this->has_value()) - throw_error(bad_optional_access()); - return util::get(m_holder); - } - - template - template T optional::value_or(U &&default_value) const - { - return (this->has_value() ? this->value() : T(default_value)); - } - - template void optional::swap(optional &other) noexcept - { - m_holder.swap(other.m_holder); - } - - template void optional::reset() noexcept - { - if (this->has_value()) - m_holder = nothing{}; - } - - template - optional::type> make_optional(T&& value) - { - return optional::type>(std::forward(value)); - } -} // namespace util -} // namespace cv - -#endif // OPENCV_GAPI_UTIL_OPTIONAL_HPP diff --git a/modules/gapi/include/opencv2/gapi/util/throw.hpp b/modules/gapi/include/opencv2/gapi/util/throw.hpp deleted file mode 100644 index 689bf583cf..0000000000 --- a/modules/gapi/include/opencv2/gapi/util/throw.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_UTIL_THROW_HPP -#define OPENCV_GAPI_UTIL_THROW_HPP - -#include // std::forward - -#if !defined(__EXCEPTIONS) -#include -#include -#endif - -namespace cv -{ -namespace util -{ -template -[[noreturn]] void throw_error(ExceptionType &&e) -{ -#if defined(__EXCEPTIONS) || defined(_CPPUNWIND) - throw std::forward(e); -#else - fprintf(stderr, "An exception thrown! %s\n" , e.what()); - fflush(stderr); - abort(); -#endif -} -} // namespace util -} // namespace cv - -#endif // OPENCV_GAPI_UTIL_THROW_HPP diff --git a/modules/gapi/include/opencv2/gapi/util/type_traits.hpp b/modules/gapi/include/opencv2/gapi/util/type_traits.hpp deleted file mode 100644 index 637f18460b..0000000000 --- a/modules/gapi/include/opencv2/gapi/util/type_traits.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - - -#ifndef OPENCV_GAPI_UTIL_TYPE_TRAITS_HPP -#define OPENCV_GAPI_UTIL_TYPE_TRAITS_HPP - -#include - -namespace cv -{ -namespace util -{ - //these are C++14 parts of type_traits : - template< bool B, class T = void > - using enable_if_t = typename std::enable_if::type; - - template - using decay_t = typename std::decay::type; - - //this is not part of C++14 but still, of pretty common usage - template - using are_different_t = enable_if_t< !std::is_same, decay_t>::value, V>; - -} // namespace cv -} // namespace util - -#endif // OPENCV_GAPI_UTIL_TYPE_TRAITS_HPP diff --git a/modules/gapi/include/opencv2/gapi/util/util.hpp b/modules/gapi/include/opencv2/gapi/util/util.hpp deleted file mode 100644 index 3be46d7ec2..0000000000 --- a/modules/gapi/include/opencv2/gapi/util/util.hpp +++ /dev/null @@ -1,190 +0,0 @@ -// 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. -// -// Copyright (C) 2018-2019 Intel Corporation - - -#ifndef OPENCV_GAPI_UTIL_HPP -#define OPENCV_GAPI_UTIL_HPP - -#include - -// \cond HIDDEN_SYMBOLS -// This header file contains some generic utility functions which are -// used in other G-API Public API headers. -// -// PLEASE don't put any stuff here if it is NOT used in public API headers! - -namespace cv -{ -namespace detail -{ - // Recursive integer sequence type, useful for enumerating elements of - // template parameter packs. - template struct Seq { using next = Seq; }; - template struct MkSeq { using type = typename MkSeq::type::next; }; - template<> struct MkSeq<0>{ using type = Seq<>; }; - - // Checks if elements of variadic template satisfy the given Predicate. - // Implemented via tuple, with an interface to accept plain type lists - template class, typename, typename...> struct all_satisfy; - - template class F, typename T, typename... Ts> - struct all_satisfy > - { - static const constexpr bool value = F::value - && all_satisfy >::value; - }; - template class F, typename T> - struct all_satisfy > - { - static const constexpr bool value = F::value; - }; - - template class F, typename T, typename... Ts> - struct all_satisfy: public all_satisfy > {}; - - // Permute given tuple type C with given integer sequence II - // Sequence may be less than tuple C size. - template struct permute_tuple; - - template - struct permute_tuple > - { - using type = std::tuple< typename std::tuple_element::type... >; - }; - - // Given T..., generates a type sequence of sizeof...(T)-1 elements - // which is T... without its last element - // Implemented via tuple, with an interface to accept plain type lists - template struct all_but_last; - - template - struct all_but_last > - { - using C = std::tuple; - using S = typename MkSeq::value - 1>::type; - using type = typename permute_tuple::type; - }; - - template - struct all_but_last: public all_but_last > {}; - - template - using all_but_last_t = typename all_but_last::type; - - // NB.: This is here because there's no constexpr std::max in C++11 - template struct max_of_t - { - static constexpr const std::size_t rest = max_of_t::value; - static constexpr const std::size_t value = rest > S0 ? rest : S0; - }; - template struct max_of_t - { - static constexpr const std::size_t value = S; - }; - - template - struct contains : std::false_type{}; - - template - struct contains : std::integral_constant::value || - contains::value> {}; - template - struct contains> : std::integral_constant::value> {}; - - template - struct all_unique : std::true_type{}; - - template - struct all_unique : std::integral_constant::value && - all_unique::value> {}; - - template - struct tuple_wrap_helper; - - template struct tuple_wrap_helper - { - using type = std::tuple; - static type get(T&& obj) { return std::make_tuple(std::move(obj)); } - }; - - template - struct tuple_wrap_helper> - { - using type = std::tuple; - static type get(std::tuple&& objs) { return std::forward>(objs); } - }; - - template - struct make_void { typedef void type;}; - - template - using void_t = typename make_void::type; - -} // namespace detail - -namespace util -{ -template -struct overload_lamba_set; - -template -struct overload_lamba_set : public L1 -{ - overload_lamba_set(L1&& lambda) : L1(std::move(lambda)) {} - overload_lamba_set(const L1& lambda) : L1(lambda) {} - - using L1::operator(); -}; - -template -struct overload_lamba_set : public L1, public overload_lamba_set -{ - using base_type = overload_lamba_set; - overload_lamba_set(L1 &&lambda1, L&& ...lambdas): - L1(std::move(lambda1)), - base_type(std::forward(lambdas)...) {} - - overload_lamba_set(const L1 &lambda1, L&& ...lambdas): - L1(lambda1), - base_type(std::forward(lambdas)...) {} - - using L1::operator(); - using base_type::operator(); -}; - -template -overload_lamba_set overload_lambdas(L&& ...lambdas) -{ - return overload_lamba_set(std::forward(lambdas)...); -} - -template -struct find_adapter_impl; - -template -struct find_adapter_impl -{ - using type = typename std::conditional::value, - T, - void>::type; - static constexpr bool found = std::is_base_of::value; -}; - -template -struct find_adapter_impl -{ - using type = typename std::conditional::value, - T, - typename find_adapter_impl::type>::type; - static constexpr bool found = std::is_base_of::value || - find_adapter_impl::found; -}; -} // namespace util -} // namespace cv - -// \endcond - -#endif // OPENCV_GAPI_UTIL_HPP diff --git a/modules/gapi/include/opencv2/gapi/util/variant.hpp b/modules/gapi/include/opencv2/gapi/util/variant.hpp deleted file mode 100644 index 48b55646c5..0000000000 --- a/modules/gapi/include/opencv2/gapi/util/variant.hpp +++ /dev/null @@ -1,667 +0,0 @@ -// 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. -// -// Copyright (C) 2018 Intel Corporation - - -#ifndef OPENCV_GAPI_UTIL_VARIANT_HPP -#define OPENCV_GAPI_UTIL_VARIANT_HPP - -#include -#include - -#include -#include -#include // max_of_t -#include - -// A poor man's `variant` implementation, incompletely modeled against C++17 spec. -namespace cv -{ -namespace util -{ - namespace detail - { - template - struct type_list_index_helper - { - static const constexpr bool is_same = std::is_same::value; - static const constexpr std::size_t value = - std::conditional, type_list_index_helper>::type::value; - }; - - template - struct type_list_index_helper - { - static_assert(std::is_same::value, "Type not found"); - static const constexpr std::size_t value = I; - }; - } - - template - struct type_list_index - { - static const constexpr std::size_t value = detail::type_list_index_helper<0, Target, Types...>::value; - }; - - template - struct type_list_element - { - using type = typename std::tuple_element >::type; - }; - - class bad_variant_access: public std::exception - { - public: - virtual const char *what() const noexcept override - { - return "Bad variant access"; - } - }; - - // Interface /////////////////////////////////////////////////////////////// - struct monostate {}; - inline bool operator==(const util::monostate&, const util::monostate&) - { - return true; - } - - template // FIXME: no references, arrays, and void - class variant - { - // FIXME: Replace with std::aligned_union after gcc4.8 support is dropped - static constexpr const std::size_t S = cv::detail::max_of_t::value; - static constexpr const std::size_t A = cv::detail::max_of_t::value; - using Memory = typename std::aligned_storage::type[1]; - - template struct cctr_h { - static void help(Memory memory, const Memory from) { - new (memory) T(*reinterpret_cast(from)); - } - }; - - template struct mctr_h { - static void help(Memory memory, void *pval) { - new (memory) T(std::move(*reinterpret_cast(pval))); - } - }; - - //FIXME: unify with cctr_h and mctr_h - template struct cnvrt_ctor_h { - static void help(Memory memory, void* from) { - using util::decay_t; - new (memory) decay_t(std::forward(*reinterpret_cast*>(from))); - } - }; - - template struct copy_h { - static void help(Memory to, const Memory from) { - *reinterpret_cast(to) = *reinterpret_cast(from); - } - }; - - template struct move_h { - static void help(Memory to, Memory from) { - *reinterpret_cast(to) = std::move(*reinterpret_cast(from)); - } - }; - - //FIXME: unify with copy_h and move_h - template struct cnvrt_assign_h { - static void help(Memory to, void* from) { - using util::decay_t; - *reinterpret_cast*>(to) = std::forward(*reinterpret_cast*>(from)); - } - }; - - template struct swap_h { - static void help(Memory to, Memory from) { - std::swap(*reinterpret_cast(to), *reinterpret_cast(from)); - } - }; - - template struct dtor_h { - static void help(Memory memory) { - (void) memory; // MSCV warning - reinterpret_cast(memory)->~T(); - } - }; - - template struct equal_h { - static bool help(const Memory lhs, const Memory rhs) { - const T& t_lhs = *reinterpret_cast(lhs); - const T& t_rhs = *reinterpret_cast(rhs); - return t_lhs == t_rhs; - } - }; - - typedef void (*CCtr) (Memory, const Memory); // Copy c-tor (variant) - typedef void (*MCtr) (Memory, void*); // Generic move c-tor - typedef void (*Copy) (Memory, const Memory); // Copy assignment - typedef void (*Move) (Memory, Memory); // Move assignment - - typedef void (*Swap) (Memory, Memory); // Swap - typedef void (*Dtor) (Memory); // Destructor - - using cnvrt_assgn_t = void (*) (Memory, void*); // Converting assignment (via std::forward) - using cnvrt_ctor_t = void (*) (Memory, void*); // Converting constructor (via std::forward) - - typedef bool (*Equal)(const Memory, const Memory); // Equality test (external) - - static constexpr std::array cctrs(){ return {{(&cctr_h::help)...}};} - static constexpr std::array mctrs(){ return {{(&mctr_h::help)...}};} - static constexpr std::array cpyrs(){ return {{(©_h::help)...}};} - static constexpr std::array mvers(){ return {{(&move_h::help)...}};} - static constexpr std::array swprs(){ return {{(&swap_h::help)...}};} - static constexpr std::array dtors(){ return {{(&dtor_h::help)...}};} - - template - struct conditional_ref : std::conditional::type&, typename std::remove_reference::type > {}; - - template - using conditional_ref_t = typename conditional_ref::type; - - - template - static constexpr std::array cnvrt_assgnrs(){ - return {{(&cnvrt_assign_h>::help)...}}; - } - - template - static constexpr std::array cnvrt_ctors(){ - return {{(&cnvrt_ctor_h>::help)...}}; - } - - std::size_t m_index = 0; - - protected: - template friend T& get(variant &v); - template friend const T& get(const variant &v); - template friend T* get_if(variant *v) noexcept; - template friend const T* get_if(const variant *v) noexcept; - - template friend bool operator==(const variant &lhs, - const variant &rhs); - Memory memory; - - public: - // Constructors - variant() noexcept; - variant(const variant& other); - variant(variant&& other) noexcept; - // are_different_t is a SFINAE trick to avoid variant(T &&t) with T=variant - // for some reason, this version is called instead of variant(variant&& o) when - // variant is used in STL containers (examples: vector assignment). - template< - typename T, - typename = util::are_different_t - > - explicit variant(T&& t); - // template explicit variant(Args&&... args); - // FIXME: other constructors - - // Destructor - ~variant(); - - // Assignment - variant& operator=(const variant& rhs); - variant& operator=(variant &&rhs) noexcept; - - // SFINAE trick to avoid operator=(T&&) with T=variant<>, see comment above - template< - typename T, - typename = util::are_different_t - > - variant& operator=(T&& t) noexcept; - - // Observers - std::size_t index() const noexcept; - // FIXME: valueless_by_exception() - - // Modifiers - // FIXME: emplace() - void swap(variant &rhs) noexcept; - - // Non-C++17x! - template static constexpr std::size_t index_of(); - }; - - // FIMXE: visit - template - T* get_if(util::variant* v) noexcept; - - template - const T* get_if(const util::variant* v) noexcept; - - template - T& get(util::variant &v); - - template - const T& get(const util::variant &v); - - template - typename util::type_list_element::type& get(util::variant &v); - - template - const typename util::type_list_element::type& get(const util::variant &v); - - template - bool holds_alternative(const util::variant &v) noexcept; - - - // Visitor - namespace detail - { - struct visitor_interface {}; - - // Class `visitor_return_type_deduction_helper` - // introduces solution for deduction `return_type` in `visit` function in common way - // for both Lambda and class Visitor and keep one interface invocation point: `visit` only - // his helper class is required to unify return_type deduction mechanism because - // for Lambda it is possible to take type of `decltype(visitor(get<0>(var)))` - // but for class Visitor there is no operator() in base case, - // because it provides `operator() (std::size_t index, ...)` - // So `visitor_return_type_deduction_helper` expose `operator()` - // uses only for class Visitor only for deduction `return type` in visit() - template - struct visitor_return_type_deduction_helper - { - using return_type = R; - - // to be used in Lambda return type deduction context only - template - return_type operator() (T&&); - }; - } - - // Special purpose `static_visitor` can receive additional arguments - template - struct static_visitor : public detail::visitor_interface, - public detail::visitor_return_type_deduction_helper { - - // assign responsibility for return type deduction to helper class - using return_type = typename detail::visitor_return_type_deduction_helper::return_type; - using detail::visitor_return_type_deduction_helper::operator(); - friend Impl; - - template - return_type operator() (std::size_t index, VariantValue&& value, Args&& ...args) - { - suppress_unused_warning(index); - return static_cast(this)-> visit( - std::forward(value), - std::forward(args)...); - } - }; - - // Special purpose `static_indexed_visitor` can receive additional arguments - // And make forwarding current variant index as runtime function argument to its `Impl` - template - struct static_indexed_visitor : public detail::visitor_interface, - public detail::visitor_return_type_deduction_helper { - - // assign responsibility for return type deduction to helper class - using return_type = typename detail::visitor_return_type_deduction_helper::return_type; - using detail::visitor_return_type_deduction_helper::operator(); - friend Impl; - - template - return_type operator() (std::size_t Index, VariantValue&& value, Args&& ...args) - { - return static_cast(this)-> visit(Index, - std::forward(value), - std::forward(args)...); - } - }; - - template - struct variant_size; - - template - struct variant_size> - : std::integral_constant { }; - // FIXME: T&&, const TT&& versions. - - // Implementation ////////////////////////////////////////////////////////// - template - variant::variant() noexcept - { - typedef typename std::tuple_element<0, std::tuple >::type TFirst; - new (memory) TFirst(); - } - - template - variant::variant(const variant &other) - : m_index(other.m_index) - { - (cctrs()[m_index])(memory, other.memory); - } - - template - variant::variant(variant &&other) noexcept - : m_index(other.m_index) - { - (mctrs()[m_index])(memory, other.memory); - } - - template - template - variant::variant(T&& t) - : m_index(util::type_list_index, Ts...>::value) - { - const constexpr bool is_lvalue_arg = std::is_lvalue_reference::value; - (cnvrt_ctors()[m_index])(memory, const_cast *>(&t)); - } - - template - variant::~variant() - { - (dtors()[m_index])(memory); - } - - template - variant& variant::operator=(const variant &rhs) - { - if (m_index != rhs.m_index) - { - (dtors()[ m_index])(memory); - (cctrs()[rhs.m_index])(memory, rhs.memory); - m_index = rhs.m_index; - } - else - { - (cpyrs()[rhs.m_index])(memory, rhs.memory); - } - return *this; - } - - template - variant& variant::operator=(variant &&rhs) noexcept - { - if (m_index != rhs.m_index) - { - (dtors()[ m_index])(memory); - (mctrs()[rhs.m_index])(memory, rhs.memory); - m_index = rhs.m_index; - } - else - { - (mvers()[rhs.m_index])(memory, rhs.memory); - } - return *this; - } - - template - template - variant& variant::operator=(T&& t) noexcept - { - using decayed_t = util::decay_t; - // FIXME: No version with implicit type conversion available! - const constexpr std::size_t t_index = - util::type_list_index::value; - - const constexpr bool is_lvalue_arg = std::is_lvalue_reference::value; - - if (t_index != m_index) - { - (dtors()[m_index])(memory); - (cnvrt_ctors()[t_index])(memory, &t); - m_index = t_index; - } - else - { - (cnvrt_assgnrs()[m_index])(memory, &t); - } - return *this; - - } - - template - std::size_t util::variant::index() const noexcept - { - return m_index; - } - - template - void variant::swap(variant &rhs) noexcept - { - if (m_index == rhs.index()) - { - (swprs()[m_index](memory, rhs.memory)); - } - else - { - variant tmp(std::move(*this)); - *this = std::move(rhs); - rhs = std::move(tmp); - } - } - - template - template - constexpr std::size_t variant::index_of() - { - return util::type_list_index::value; // FIXME: tests! - } - - template - T* get_if(util::variant* v) noexcept - { - const constexpr std::size_t t_index = - util::type_list_index::value; - - if (v && v->index() == t_index) - return (T*)(&v->memory); // workaround for ICC 2019 - // original code: return reinterpret_cast(v.memory); - return nullptr; - } - - template - const T* get_if(const util::variant* v) noexcept - { - const constexpr std::size_t t_index = - util::type_list_index::value; - - if (v && v->index() == t_index) - return (const T*)(&v->memory); // workaround for ICC 2019 - // original code: return reinterpret_cast(v.memory); - return nullptr; - } - - template - T& get(util::variant &v) - { - if (auto* p = get_if(&v)) - return *p; - else - throw_error(bad_variant_access()); - } - - template - const T& get(const util::variant &v) - { - if (auto* p = get_if(&v)) - return *p; - else - throw_error(bad_variant_access()); - } - - template - typename util::type_list_element::type& get(util::variant &v) - { - using ReturnType = typename util::type_list_element::type; - return const_cast(get(static_cast &>(v))); - } - - template - const typename util::type_list_element::type& get(const util::variant &v) - { - static_assert(Index < sizeof...(Types), - "`Index` it out of bound of `util::variant` type list"); - using ReturnType = typename util::type_list_element::type; - return get(v); - } - - template - bool holds_alternative(const util::variant &v) noexcept - { - return v.index() == util::variant::template index_of(); - } - -#if defined(__GNUC__) && (__GNUC__ == 11 || __GNUC__ == 12) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -#endif - - template bool operator==(const variant &lhs, - const variant &rhs) - { - using V = variant; - - // Instantiate table only here since it requires operator== for - // should have operator== only if this one is used, not in general - static const std::array eqs = { - {(&V::template equal_h::help)...} - }; - if (lhs.index() != rhs.index()) - return false; - return (eqs[lhs.index()])(lhs.memory, rhs.memory); - } - -#if defined(__GNUC__) && (__GNUC__ == 11 || __GNUC__ == 12) -#pragma GCC diagnostic pop -#endif - - template bool operator!=(const variant &lhs, - const variant &rhs) - { - return !(lhs == rhs); - } - -namespace detail -{ - // terminate recursion implementation for `non-void` ReturnType - template - ReturnType apply_visitor_impl(Visitor&&, Variant&, - std::true_type, std::false_type, - VisitorArgs&& ...) - { - return {}; - } - - // terminate recursion implementation for `void` ReturnType - template - void apply_visitor_impl(Visitor&&, Variant&, - std::true_type, std::true_type, - VisitorArgs&& ...) - { - } - - // Intermediate resursion processor for Lambda Visitors - template - typename std::enable_if::type>::value, ReturnType>::type - apply_visitor_impl(Visitor&& visitor, Variant&& v, std::false_type not_processed, - std::integral_constant should_no_return, - VisitorArgs&& ...args) - { - static_assert(std::is_same(v)))>::value, - "Different `ReturnType`s detected! All `Visitor::visit` or `overload_lamba_set`" - " must return the same type"); - suppress_unused_warning(not_processed); - if (v.index() == CurIndex) - { - return visitor.operator()(get(v), std::forward(args)... ); - } - - using is_variant_processed_t = std::integral_constant= ElemCount>; - return apply_visitor_impl( - std::forward(visitor), - std::forward(v), - is_variant_processed_t{}, - should_no_return, - std::forward(args)...); - } - - //Visual Studio 2014 compilation fix: cast visitor to base class before invoke operator() - template - typename std::enable_if::type>, - typename std::decay::type>::value, ReturnType>::type - invoke_class_visitor(Visitor& visitor, Value&& v, VisitorArgs&&...args) - { - return static_cast::type>&>(visitor).operator() (CurIndex, std::forward(v), std::forward(args)... ); - } - - //Visual Studio 2014 compilation fix: cast visitor to base class before invoke operator() - template - typename std::enable_if::type>, - typename std::decay::type>::value, ReturnType>::type - invoke_class_visitor(Visitor& visitor, Value&& v, VisitorArgs&&...args) - { - return static_cast::type>&>(visitor).operator() (CurIndex, std::forward(v), std::forward(args)... ); - } - - // Intermediate recursion processor for special case `visitor_interface` derived Visitors - template - typename std::enable_if::type>::value, ReturnType>::type - apply_visitor_impl(Visitor&& visitor, Variant&& v, std::false_type not_processed, - std::integral_constant should_no_return, - VisitorArgs&& ...args) - { - static_assert(std::is_same(v)))>::value, - "Different `ReturnType`s detected! All `Visitor::visit` or `overload_lamba_set`" - " must return the same type"); - suppress_unused_warning(not_processed); - if (v.index() == CurIndex) - { - return invoke_class_visitor(visitor, get(v), std::forward(args)... ); - } - - using is_variant_processed_t = std::integral_constant= ElemCount>; - return apply_visitor_impl( - std::forward(visitor), - std::forward(v), - is_variant_processed_t{}, - should_no_return, - std::forward(args)...); - } -} // namespace detail - - template - auto visit(Visitor &visitor, const Variant& var, VisitorArg &&...args) -> decltype(visitor(get<0>(var))) - { - constexpr std::size_t varsize = util::variant_size::value; - static_assert(varsize != 0, "utils::variant must contains one type at least "); - using is_variant_processed_t = std::false_type; - - using ReturnType = decltype(visitor(get<0>(var))); - using return_t = std::is_same; - return detail::apply_visitor_impl( - std::forward(visitor), - var, is_variant_processed_t{}, - return_t{}, - std::forward(args)...); - } - - template - auto visit(Visitor&& visitor, const Variant& var) -> decltype(visitor(get<0>(var))) - { - constexpr std::size_t varsize = util::variant_size::value; - static_assert(varsize != 0, "utils::variant must contains one type at least "); - using is_variant_processed_t = std::false_type; - - using ReturnType = decltype(visitor(get<0>(var))); - using return_t = std::is_same; - return detail::apply_visitor_impl( - std::forward(visitor), - var, is_variant_processed_t{}, - return_t{}); - } -} // namespace util -} // namespace cv - -#endif // OPENCV_GAPI_UTIL_VARIANT_HPP diff --git a/modules/gapi/include/opencv2/gapi/video.hpp b/modules/gapi/include/opencv2/gapi/video.hpp deleted file mode 100644 index 4dcc1d4182..0000000000 --- a/modules/gapi/include/opencv2/gapi/video.hpp +++ /dev/null @@ -1,364 +0,0 @@ -// 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. -// -// Copyright (C) 2020 Intel Corporation - -#ifndef OPENCV_GAPI_VIDEO_HPP -#define OPENCV_GAPI_VIDEO_HPP - -#include // std::tuple - -#include - - -/** \defgroup gapi_video G-API Video processing functionality - */ - -namespace cv { namespace gapi { - -/** @brief Structure for the Kalman filter's initialization parameters.*/ - -struct GAPI_EXPORTS KalmanParams -{ - // initial state - - //! corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k)) - Mat state; - //! posteriori error estimate covariance matrix (P(k)): P(k)=(I-K(k)*H)*P'(k) - Mat errorCov; - - // dynamic system description - - //! state transition matrix (A) - Mat transitionMatrix; - //! measurement matrix (H) - Mat measurementMatrix; - //! process noise covariance matrix (Q) - Mat processNoiseCov; - //! measurement noise covariance matrix (R) - Mat measurementNoiseCov; - //! control matrix (B) (Optional: not used if there's no control) - Mat controlMatrix; -}; - -/** - * @brief This namespace contains G-API Operations and functions for - * video-oriented algorithms, like optical flow and background subtraction. - */ -namespace video -{ -using GBuildPyrOutput = std::tuple, GScalar>; - -using GOptFlowLKOutput = std::tuple, - cv::GArray, - cv::GArray>; - -G_TYPED_KERNEL(GBuildOptFlowPyramid, , - "org.opencv.video.buildOpticalFlowPyramid") -{ - static std::tuple - outMeta(GMatDesc,const Size&,GScalarDesc,bool,int,int,bool) - { - return std::make_tuple(empty_array_desc(), empty_scalar_desc()); - } -}; - -G_TYPED_KERNEL(GCalcOptFlowLK, - ,cv::GArray,Size, - GScalar,TermCriteria,int,double)>, - "org.opencv.video.calcOpticalFlowPyrLK") -{ - static std::tuple outMeta(GMatDesc,GMatDesc,GArrayDesc, - GArrayDesc,const Size&,GScalarDesc, - const TermCriteria&,int,double) - { - return std::make_tuple(empty_array_desc(), empty_array_desc(), empty_array_desc()); - } - -}; - -G_TYPED_KERNEL(GCalcOptFlowLKForPyr, - ,cv::GArray, - cv::GArray,cv::GArray,Size,GScalar, - TermCriteria,int,double)>, - "org.opencv.video.calcOpticalFlowPyrLKForPyr") -{ - static std::tuple outMeta(GArrayDesc,GArrayDesc, - GArrayDesc,GArrayDesc, - const Size&,GScalarDesc, - const TermCriteria&,int,double) - { - return std::make_tuple(empty_array_desc(), empty_array_desc(), empty_array_desc()); - } -}; - -enum BackgroundSubtractorType -{ - TYPE_BS_MOG2, - TYPE_BS_KNN -}; - -/** @brief Structure for the Background Subtractor operation's initialization parameters.*/ - -struct BackgroundSubtractorParams -{ - //! Type of the Background Subtractor operation. - BackgroundSubtractorType operation = TYPE_BS_MOG2; - - //! Length of the history. - int history = 500; - - //! For MOG2: Threshold on the squared Mahalanobis distance between the pixel - //! and the model to decide whether a pixel is well described by - //! the background model. - //! For KNN: Threshold on the squared distance between the pixel and the sample - //! to decide whether a pixel is close to that sample. - double threshold = 16; - - //! If true, the algorithm will detect shadows and mark them. - bool detectShadows = true; - - //! The value between 0 and 1 that indicates how fast - //! the background model is learnt. - //! Negative parameter value makes the algorithm use some automatically - //! chosen learning rate. - double learningRate = -1; - - //! default constructor - BackgroundSubtractorParams() {} - - /** Full constructor - @param op MOG2/KNN Background Subtractor type. - @param histLength Length of the history. - @param thrshld For MOG2: Threshold on the squared Mahalanobis distance between - the pixel and the model to decide whether a pixel is well described by the background model. - For KNN: Threshold on the squared distance between the pixel and the sample to decide - whether a pixel is close to that sample. - @param detect If true, the algorithm will detect shadows and mark them. It decreases the - speed a bit, so if you do not need this feature, set the parameter to false. - @param lRate The value between 0 and 1 that indicates how fast the background model is learnt. - Negative parameter value makes the algorithm to use some automatically chosen learning rate. - */ - BackgroundSubtractorParams(BackgroundSubtractorType op, int histLength, - double thrshld, bool detect, double lRate) : operation(op), - history(histLength), - threshold(thrshld), - detectShadows(detect), - learningRate(lRate){} -}; - -G_TYPED_KERNEL(GBackgroundSubtractor, , - "org.opencv.video.BackgroundSubtractor") -{ - static GMatDesc outMeta(const GMatDesc& in, const BackgroundSubtractorParams& bsParams) - { - GAPI_Assert(bsParams.history >= 0); - GAPI_Assert(bsParams.learningRate <= 1); - return in.withType(CV_8U, 1); - } -}; - -void checkParams(const cv::gapi::KalmanParams& kfParams, - const cv::GMatDesc& measurement, const cv::GMatDesc& control = {}); - -G_TYPED_KERNEL(GKalmanFilter, , GMat, KalmanParams)>, - "org.opencv.video.KalmanFilter") -{ - static GMatDesc outMeta(const GMatDesc& measurement, const GOpaqueDesc&, - const GMatDesc& control, const KalmanParams& kfParams) - { - checkParams(kfParams, measurement, control); - return measurement.withSize(Size(1, kfParams.transitionMatrix.rows)); - } -}; - -G_TYPED_KERNEL(GKalmanFilterNoControl, , KalmanParams)>, "org.opencv.video.KalmanFilterNoControl") -{ - static GMatDesc outMeta(const GMatDesc& measurement, const GOpaqueDesc&, const KalmanParams& kfParams) - { - checkParams(kfParams, measurement); - return measurement.withSize(Size(1, kfParams.transitionMatrix.rows)); - } -}; -} //namespace video - -//! @addtogroup gapi_video -//! @{ -/** @brief Constructs the image pyramid which can be passed to calcOpticalFlowPyrLK. - -@note Function textual ID is "org.opencv.video.buildOpticalFlowPyramid" - -@param img 8-bit input image. -@param winSize window size of optical flow algorithm. Must be not less than winSize - argument of calcOpticalFlowPyrLK. It is needed to calculate required - padding for pyramid levels. -@param maxLevel 0-based maximal pyramid level number. -@param withDerivatives set to precompute gradients for the every pyramid level. If pyramid is - constructed without the gradients then calcOpticalFlowPyrLK will calculate - them internally. -@param pyrBorder the border mode for pyramid layers. -@param derivBorder the border mode for gradients. -@param tryReuseInputImage put ROI of input image into the pyramid if possible. You can pass false - to force data copying. - -@return - - output pyramid. - - number of levels in constructed pyramid. Can be less than maxLevel. - */ -GAPI_EXPORTS std::tuple, GScalar> -buildOpticalFlowPyramid(const GMat &img, - const Size &winSize, - const GScalar &maxLevel, - bool withDerivatives = true, - int pyrBorder = BORDER_REFLECT_101, - int derivBorder = BORDER_CONSTANT, - bool tryReuseInputImage = true); - -/** @brief Calculates an optical flow for a sparse feature set using the iterative Lucas-Kanade -method with pyramids. - -See @cite Bouguet00 . - -@note Function textual ID is "org.opencv.video.calcOpticalFlowPyrLK" - -@param prevImg first 8-bit input image (GMat) or pyramid (GArray) constructed by -buildOpticalFlowPyramid. -@param nextImg second input image (GMat) or pyramid (GArray) of the same size and the same -type as prevImg. -@param prevPts GArray of 2D points for which the flow needs to be found; point coordinates must be -single-precision floating-point numbers. -@param predPts GArray of 2D points initial for the flow search; make sense only when -OPTFLOW_USE_INITIAL_FLOW flag is passed; in that case the vector must have the same size as in -the input. -@param winSize size of the search window at each pyramid level. -@param maxLevel 0-based maximal pyramid level number; if set to 0, pyramids are not used (single -level), if set to 1, two levels are used, and so on; if pyramids are passed to input then -algorithm will use as many levels as pyramids have but no more than maxLevel. -@param criteria parameter, specifying the termination criteria of the iterative search algorithm -(after the specified maximum number of iterations criteria.maxCount or when the search window -moves by less than criteria.epsilon). -@param flags operation flags: - - **OPTFLOW_USE_INITIAL_FLOW** uses initial estimations, stored in nextPts; if the flag is - not set, then prevPts is copied to nextPts and is considered the initial estimate. - - **OPTFLOW_LK_GET_MIN_EIGENVALS** use minimum eigen values as an error measure (see - minEigThreshold description); if the flag is not set, then L1 distance between patches - around the original and a moved point, divided by number of pixels in a window, is used as a - error measure. -@param minEigThresh the algorithm calculates the minimum eigen value of a 2x2 normal matrix of -optical flow equations (this matrix is called a spatial gradient matrix in @cite Bouguet00), divided -by number of pixels in a window; if this value is less than minEigThreshold, then a corresponding -feature is filtered out and its flow is not processed, so it allows to remove bad points and get a -performance boost. - -@return - - GArray of 2D points (with single-precision floating-point coordinates) -containing the calculated new positions of input features in the second image. - - status GArray (of unsigned chars); each element of the vector is set to 1 if -the flow for the corresponding features has been found, otherwise, it is set to 0. - - GArray of errors (doubles); each element of the vector is set to an error for the -corresponding feature, type of the error measure can be set in flags parameter; if the flow wasn't -found then the error is not defined (use the status parameter to find such cases). - */ -GAPI_EXPORTS std::tuple, GArray, GArray> -calcOpticalFlowPyrLK(const GMat &prevImg, - const GMat &nextImg, - const GArray &prevPts, - const GArray &predPts, - const Size &winSize = Size(21, 21), - const GScalar &maxLevel = 3, - const TermCriteria &criteria = TermCriteria(TermCriteria::COUNT | - TermCriteria::EPS, - 30, 0.01), - int flags = 0, - double minEigThresh = 1e-4); - -/** -@overload -@note Function textual ID is "org.opencv.video.calcOpticalFlowPyrLKForPyr" -*/ -GAPI_EXPORTS std::tuple, GArray, GArray> -calcOpticalFlowPyrLK(const GArray &prevPyr, - const GArray &nextPyr, - const GArray &prevPts, - const GArray &predPts, - const Size &winSize = Size(21, 21), - const GScalar &maxLevel = 3, - const TermCriteria &criteria = TermCriteria(TermCriteria::COUNT | - TermCriteria::EPS, - 30, 0.01), - int flags = 0, - double minEigThresh = 1e-4); - -/** @brief Gaussian Mixture-based or K-nearest neighbours-based Background/Foreground Segmentation Algorithm. -The operation generates a foreground mask. - -@return Output image is foreground mask, i.e. 8-bit unsigned 1-channel (binary) matrix @ref CV_8UC1. - -@note Functional textual ID is "org.opencv.video.BackgroundSubtractor" - -@param src input image: Floating point frame is used without scaling and should be in range [0,255]. -@param bsParams Set of initialization parameters for Background Subtractor kernel. -*/ -GAPI_EXPORTS GMat BackgroundSubtractor(const GMat& src, const cv::gapi::video::BackgroundSubtractorParams& bsParams); - -/** @brief Standard Kalman filter algorithm . - -@note Functional textual ID is "org.opencv.video.KalmanFilter" - -@param measurement input matrix: 32-bit or 64-bit float 1-channel matrix containing measurements. -@param haveMeasurement dynamic input flag that indicates whether we get measurements -at a particular iteration . -@param control input matrix: 32-bit or 64-bit float 1-channel matrix contains control data -for changing dynamic system. -@param kfParams Set of initialization parameters for Kalman filter kernel. - -@return Output matrix is predicted or corrected state. They can be 32-bit or 64-bit float -1-channel matrix @ref CV_32FC1 or @ref CV_64FC1. - -@details If measurement matrix is given (haveMeasurements == true), corrected state will -be returned which corresponds to the pipeline -cv::KalmanFilter::predict(control) -> cv::KalmanFilter::correct(measurement). -Otherwise, predicted state will be returned which corresponds to the call of -cv::KalmanFilter::predict(control). -@sa cv::KalmanFilter -*/ -GAPI_EXPORTS GMat KalmanFilter(const GMat& measurement, const GOpaque& haveMeasurement, - const GMat& control, const cv::gapi::KalmanParams& kfParams); - -/** @overload -The case of Standard Kalman filter algorithm when there is no control in a dynamic system. -In this case the controlMatrix is empty and control vector is absent. - -@note Function textual ID is "org.opencv.video.KalmanFilterNoControl" - -@param measurement input matrix: 32-bit or 64-bit float 1-channel matrix containing measurements. -@param haveMeasurement dynamic input flag that indicates whether we get measurements -at a particular iteration. -@param kfParams Set of initialization parameters for Kalman filter kernel. - -@return Output matrix is predicted or corrected state. They can be 32-bit or 64-bit float -1-channel matrix @ref CV_32FC1 or @ref CV_64FC1. - -@sa cv::KalmanFilter - */ -GAPI_EXPORTS GMat KalmanFilter(const GMat& measurement, const GOpaque& haveMeasurement, - const cv::gapi::KalmanParams& kfParams); - -//! @} gapi_video -} //namespace gapi -} //namespace cv - - -namespace cv { namespace detail { -template<> struct CompileArgTag -{ - static const char* tag() - { - return "org.opencv.video.background_substractor_params"; - } -}; -} // namespace detail -} // namespace cv - -#endif // OPENCV_GAPI_VIDEO_HPP diff --git a/modules/gapi/misc/python/package/gapi/__init__.py b/modules/gapi/misc/python/package/gapi/__init__.py deleted file mode 100644 index 2b21e54e41..0000000000 --- a/modules/gapi/misc/python/package/gapi/__init__.py +++ /dev/null @@ -1,323 +0,0 @@ -__all__ = ['op', 'kernel'] - -import sys -import cv2 as cv - -# NB: Register function in specific module -def register(mname): - def parameterized(func): - sys.modules[mname].__dict__[func.__name__] = func - return func - return parameterized - - -@register('cv2.gapi') -def networks(*args): - return cv.gapi_GNetPackage(list(map(cv.detail.strip, args))) - - -@register('cv2.gapi') -def compile_args(*args): - return list(map(cv.GCompileArg, args)) - - -@register('cv2') -def GIn(*args): - return [*args] - - -@register('cv2') -def GOut(*args): - return [*args] - - -@register('cv2') -def gin(*args): - return [*args] - - -@register('cv2.gapi') -def descr_of(*args): - return [*args] - - -@register('cv2') -class GOpaque(): - # NB: Inheritance from c++ class cause segfault. - # So just aggregate cv.GOpaqueT instead of inheritance - def __new__(cls, argtype): - return cv.GOpaqueT(argtype) - - class Bool(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_BOOL) - - class Int(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_INT) - - class Int64(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_INT64) - - class UInt64(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_UINT64) - - class Double(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_DOUBLE) - - class Float(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_FLOAT) - - class String(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_STRING) - - class Point(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_POINT) - - class Point2f(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_POINT2F) - - class Point3f(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_POINT3F) - - class Size(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_SIZE) - - class Rect(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_RECT) - - class Prim(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_DRAW_PRIM) - - class Any(): - def __new__(self): - return cv.GOpaqueT(cv.gapi.CV_ANY) - -@register('cv2') -class GArray(): - # NB: Inheritance from c++ class cause segfault. - # So just aggregate cv.GArrayT instead of inheritance - def __new__(cls, argtype): - return cv.GArrayT(argtype) - - class Bool(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_BOOL) - - class Int(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_INT) - - class Int64(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_INT64) - - class UInt64(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_UINT64) - - class Double(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_DOUBLE) - - class Float(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_FLOAT) - - class String(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_STRING) - - class Point(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_POINT) - - class Point2f(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_POINT2F) - - class Point3f(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_POINT3F) - - class Size(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_SIZE) - - class Rect(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_RECT) - - class Scalar(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_SCALAR) - - class Mat(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_MAT) - - class GMat(): - def __new__(self): - return cv.GArrayT(cv.gapi.CV_GMAT) - - class Prim(): - def __new__(self): - return cv.GArray(cv.gapi.CV_DRAW_PRIM) - - class Any(): - def __new__(self): - return cv.GArray(cv.gapi.CV_ANY) - - -# NB: Top lvl decorator takes arguments -def op(op_id, in_types, out_types): - - garray_types= { - cv.GArray.Bool: cv.gapi.CV_BOOL, - cv.GArray.Int: cv.gapi.CV_INT, - cv.GArray.Int64: cv.gapi.CV_INT64, - cv.GArray.UInt64: cv.gapi.CV_UINT64, - cv.GArray.Double: cv.gapi.CV_DOUBLE, - cv.GArray.Float: cv.gapi.CV_FLOAT, - cv.GArray.String: cv.gapi.CV_STRING, - cv.GArray.Point: cv.gapi.CV_POINT, - cv.GArray.Point2f: cv.gapi.CV_POINT2F, - cv.GArray.Point3f: cv.gapi.CV_POINT3F, - cv.GArray.Size: cv.gapi.CV_SIZE, - cv.GArray.Rect: cv.gapi.CV_RECT, - cv.GArray.Scalar: cv.gapi.CV_SCALAR, - cv.GArray.Mat: cv.gapi.CV_MAT, - cv.GArray.GMat: cv.gapi.CV_GMAT, - cv.GArray.Prim: cv.gapi.CV_DRAW_PRIM, - cv.GArray.Any: cv.gapi.CV_ANY - } - - gopaque_types= { - cv.GOpaque.Size: cv.gapi.CV_SIZE, - cv.GOpaque.Rect: cv.gapi.CV_RECT, - cv.GOpaque.Bool: cv.gapi.CV_BOOL, - cv.GOpaque.Int: cv.gapi.CV_INT, - cv.GOpaque.Int64: cv.gapi.CV_INT64, - cv.GOpaque.UInt64: cv.gapi.CV_UINT64, - cv.GOpaque.Double: cv.gapi.CV_DOUBLE, - cv.GOpaque.Float: cv.gapi.CV_FLOAT, - cv.GOpaque.String: cv.gapi.CV_STRING, - cv.GOpaque.Point: cv.gapi.CV_POINT, - cv.GOpaque.Point2f: cv.gapi.CV_POINT2F, - cv.GOpaque.Point3f: cv.gapi.CV_POINT3F, - cv.GOpaque.Size: cv.gapi.CV_SIZE, - cv.GOpaque.Rect: cv.gapi.CV_RECT, - cv.GOpaque.Prim: cv.gapi.CV_DRAW_PRIM, - cv.GOpaque.Any: cv.gapi.CV_ANY - } - - type2str = { - cv.gapi.CV_BOOL: 'cv.gapi.CV_BOOL' , - cv.gapi.CV_INT: 'cv.gapi.CV_INT' , - cv.gapi.CV_INT64: 'cv.gapi.CV_INT64' , - cv.gapi.CV_UINT64: 'cv.gapi.CV_UINT64' , - cv.gapi.CV_DOUBLE: 'cv.gapi.CV_DOUBLE' , - cv.gapi.CV_FLOAT: 'cv.gapi.CV_FLOAT' , - cv.gapi.CV_STRING: 'cv.gapi.CV_STRING' , - cv.gapi.CV_POINT: 'cv.gapi.CV_POINT' , - cv.gapi.CV_POINT2F: 'cv.gapi.CV_POINT2F' , - cv.gapi.CV_POINT3F: 'cv.gapi.CV_POINT3F' , - cv.gapi.CV_SIZE: 'cv.gapi.CV_SIZE', - cv.gapi.CV_RECT: 'cv.gapi.CV_RECT', - cv.gapi.CV_SCALAR: 'cv.gapi.CV_SCALAR', - cv.gapi.CV_MAT: 'cv.gapi.CV_MAT', - cv.gapi.CV_GMAT: 'cv.gapi.CV_GMAT', - cv.gapi.CV_DRAW_PRIM: 'cv.gapi.CV_DRAW_PRIM' - } - - # NB: Second lvl decorator takes class to decorate - def op_with_params(cls): - if not in_types: - raise Exception('{} operation should have at least one input!'.format(cls.__name__)) - - if not out_types: - raise Exception('{} operation should have at least one output!'.format(cls.__name__)) - - for i, t in enumerate(out_types): - if t not in [cv.GMat, cv.GScalar, *garray_types, *gopaque_types]: - raise Exception('{} unsupported output type: {} in position: {}' - .format(cls.__name__, t.__name__, i)) - - def on(*args): - if len(in_types) != len(args): - raise Exception('Invalid number of input elements!\nExpected: {}, Actual: {}' - .format(len(in_types), len(args))) - - for i, (t, a) in enumerate(zip(in_types, args)): - if t in garray_types: - if not isinstance(a, cv.GArrayT): - raise Exception("{} invalid type for argument {}.\nExpected: {}, Actual: {}" - .format(cls.__name__, i, cv.GArrayT.__name__, type(a).__name__)) - - elif a.type() != garray_types[t]: - raise Exception("{} invalid GArrayT type for argument {}.\nExpected: {}, Actual: {}" - .format(cls.__name__, i, type2str[garray_types[t]], type2str[a.type()])) - - elif t in gopaque_types: - if not isinstance(a, cv.GOpaqueT): - raise Exception("{} invalid type for argument {}.\nExpected: {}, Actual: {}" - .format(cls.__name__, i, cv.GOpaqueT.__name__, type(a).__name__)) - - elif a.type() != gopaque_types[t]: - raise Exception("{} invalid GOpaque type for argument {}.\nExpected: {}, Actual: {}" - .format(cls.__name__, i, type2str[gopaque_types[t]], type2str[a.type()])) - - else: - if t != type(a): - raise Exception('{} invalid input type for argument {}.\nExpected: {}, Actual: {}' - .format(cls.__name__, i, t.__name__, type(a).__name__)) - - op = cv.gapi.__op(op_id, cls.outMeta, *args) - - out_protos = [] - for i, out_type in enumerate(out_types): - if out_type == cv.GMat: - out_protos.append(op.getGMat()) - elif out_type == cv.GScalar: - out_protos.append(op.getGScalar()) - elif out_type in gopaque_types: - out_protos.append(op.getGOpaque(gopaque_types[out_type])) - elif out_type in garray_types: - out_protos.append(op.getGArray(garray_types[out_type])) - else: - raise Exception("""In {}: G-API operation can't produce the output with type: {} in position: {}""" - .format(cls.__name__, out_type.__name__, i)) - - return tuple(out_protos) if len(out_protos) != 1 else out_protos[0] - - # NB: Extend operation class - cls.id = op_id - cls.on = staticmethod(on) - return cls - - return op_with_params - - -def kernel(op_cls): - # NB: Second lvl decorator takes class to decorate - def kernel_with_params(cls): - # NB: Add new members to kernel class - cls.id = op_cls.id - cls.outMeta = op_cls.outMeta - return cls - - return kernel_with_params - - -cv.gapi.wip.GStreamerPipeline = cv.gapi_wip_gst_GStreamerPipeline diff --git a/modules/gapi/misc/python/pyopencv_gapi.hpp b/modules/gapi/misc/python/pyopencv_gapi.hpp deleted file mode 100644 index 66c3910756..0000000000 --- a/modules/gapi/misc/python/pyopencv_gapi.hpp +++ /dev/null @@ -1,1172 +0,0 @@ -#ifndef OPENCV_GAPI_PYOPENCV_GAPI_HPP -#define OPENCV_GAPI_PYOPENCV_GAPI_HPP - -#ifdef HAVE_OPENCV_GAPI - -#ifdef _MSC_VER -#pragma warning(disable: 4503) // "decorated name length exceeded" -#endif - -#include -#include - -// NB: Python wrapper replaces :: with _ for classes -using gapi_GKernelPackage = cv::GKernelPackage; -using gapi_GNetPackage = cv::gapi::GNetPackage; -using gapi_ie_PyParams = cv::gapi::ie::PyParams; -using gapi_onnx_PyParams = cv::gapi::onnx::PyParams; -using gapi_ov_PyParams = cv::gapi::ov::PyParams; -using gapi_wip_IStreamSource_Ptr = cv::Ptr; -using detail_ExtractArgsCallback = cv::detail::ExtractArgsCallback; -using detail_ExtractMetaCallback = cv::detail::ExtractMetaCallback; -using vector_GNetParam = std::vector; -using vector_GMat = std::vector; -using gapi_streaming_queue_capacity = cv::gapi::streaming::queue_capacity; -using GStreamerSource_OutputType = cv::gapi::wip::GStreamerSource::OutputType; -using map_string_and_int = std::map; -using map_string_and_string = std::map; -using map_string_and_string = std::map; -using map_string_and_vector_size_t = std::map>; -using map_string_and_vector_float = std::map>; -using map_int_and_double = std::map; -using ep_OpenVINO = cv::gapi::onnx::ep::OpenVINO; -using ep_DirectML = cv::gapi::onnx::ep::DirectML; -using ep_CoreML = cv::gapi::onnx::ep::CoreML; -using ep_CUDA = cv::gapi::onnx::ep::CUDA; -using ep_TensorRT = cv::gapi::onnx::ep::TensorRT; - -// NB: Python wrapper generate T_U for T -// This behavior is only observed for inputs -using GOpaque_bool = cv::GOpaque; -using GOpaque_int = cv::GOpaque; -using GOpaque_double = cv::GOpaque; -using GOpaque_float = cv::GOpaque; -using GOpaque_string = cv::GOpaque; -using GOpaque_Point2i = cv::GOpaque; -using GOpaque_Point2f = cv::GOpaque; -using GOpaque_Size = cv::GOpaque; -using GOpaque_Rect = cv::GOpaque; - -using GArray_bool = cv::GArray; -using GArray_int = cv::GArray; -using GArray_double = cv::GArray; -using GArray_float = cv::GArray; -using GArray_string = cv::GArray; -using GArray_Point2i = cv::GArray; -using GArray_Point2f = cv::GArray; -using GArray_Point3f = cv::GArray; -using GArray_Size = cv::GArray; -using GArray_Rect = cv::GArray; -using GArray_Scalar = cv::GArray; -using GArray_Mat = cv::GArray; -using GArray_GMat = cv::GArray; -using GArray_Prim = cv::GArray; - -// FIXME: Python wrapper generate code without namespace std, -// so it cause error: "string wasn't declared" -// WA: Create using -using std::string; - -namespace cv -{ -namespace detail -{ - -class PyObjectHolder -{ -public: - PyObjectHolder(PyObject* o, bool owner = true); - PyObject* get() const; - -private: - class Impl; - std::shared_ptr m_impl; -}; - -} // namespace detail -} // namespace cv - -class cv::detail::PyObjectHolder::Impl -{ -public: - Impl(PyObject* object, bool owner); - PyObject* get() const; - ~Impl(); - -private: - PyObject* m_object; -}; - -cv::detail::PyObjectHolder::Impl::Impl(PyObject* object, bool owner) - : m_object(object) -{ - // NB: Become an owner of that PyObject. - // Need to store this and get access - // after the caller which provide the object is out of range. - if (owner) - { - // NB: Impossible take ownership if object is NULL. - GAPI_Assert(object); - Py_INCREF(m_object); - } -} - -cv::detail::PyObjectHolder::Impl::~Impl() -{ - // NB: If NULL was set, don't decrease counter. - if (m_object) - { - Py_DECREF(m_object); - } -} - -PyObject* cv::detail::PyObjectHolder::Impl::get() const -{ - return m_object; -} - -cv::detail::PyObjectHolder::PyObjectHolder(PyObject* object, bool owner) - : m_impl(new cv::detail::PyObjectHolder::Impl{object, owner}) -{ -} - -PyObject* cv::detail::PyObjectHolder::get() const -{ - return m_impl->get(); -} - -template<> -PyObject* pyopencv_from(const cv::detail::PyObjectHolder& v) -{ - PyObject* o = cv::util::any_cast(v).get(); - Py_INCREF(o); - return o; -} - -// #FIXME: Is it possible to implement pyopencv_from/pyopencv_to for generic -// cv::variant ? -template <> -PyObject* pyopencv_from(const cv::gapi::wip::draw::Prim& prim) -{ - switch (prim.index()) - { - case cv::gapi::wip::draw::Prim::index_of(): - return pyopencv_from(cv::util::get(prim)); - case cv::gapi::wip::draw::Prim::index_of(): - return pyopencv_from(cv::util::get(prim)); - case cv::gapi::wip::draw::Prim::index_of(): - return pyopencv_from(cv::util::get(prim)); - case cv::gapi::wip::draw::Prim::index_of(): - return pyopencv_from(cv::util::get(prim)); - case cv::gapi::wip::draw::Prim::index_of(): - return pyopencv_from(cv::util::get(prim)); - case cv::gapi::wip::draw::Prim::index_of(): - return pyopencv_from(cv::util::get(prim)); - case cv::gapi::wip::draw::Prim::index_of(): - return pyopencv_from(cv::util::get(prim)); - } - - util::throw_error(std::logic_error("Unsupported draw primitive type")); -} - -template <> -PyObject* pyopencv_from(const cv::gapi::wip::draw::Prims& value) -{ - return pyopencv_from_generic_vec(value); -} - -template<> -bool pyopencv_to(PyObject* obj, cv::gapi::wip::draw::Prim& value, const ArgInfo&) -{ -#define TRY_EXTRACT(Prim) \ - if (PyObject_TypeCheck(obj, reinterpret_cast(pyopencv_gapi_wip_draw_##Prim##_TypePtr))) \ - { \ - value = reinterpret_cast(obj)->v; \ - return true; \ - } \ - - TRY_EXTRACT(Rect) - TRY_EXTRACT(Text) - TRY_EXTRACT(Circle) - TRY_EXTRACT(Line) - TRY_EXTRACT(Mosaic) - TRY_EXTRACT(Image) - TRY_EXTRACT(Poly) -#undef TRY_EXTRACT - - failmsg("Unsupported primitive type"); - return false; -} - -template <> -bool pyopencv_to(PyObject* obj, cv::gapi::wip::draw::Prims& value, const ArgInfo& info) -{ - return pyopencv_to_generic_vec(obj, value, info); -} - -template <> -bool pyopencv_to(PyObject* obj, cv::GMetaArg& value, const ArgInfo&) -{ -#define TRY_EXTRACT(Meta) \ - if (PyObject_TypeCheck(obj, \ - reinterpret_cast(pyopencv_##Meta##_TypePtr))) \ - { \ - value = reinterpret_cast(obj)->v; \ - return true; \ - } \ - - TRY_EXTRACT(GMatDesc) - TRY_EXTRACT(GScalarDesc) - TRY_EXTRACT(GArrayDesc) - TRY_EXTRACT(GOpaqueDesc) -#undef TRY_EXTRACT - - failmsg("Unsupported cv::GMetaArg type"); - return false; -} - -template <> -bool pyopencv_to(PyObject* obj, cv::GMetaArgs& value, const ArgInfo& info) -{ - return pyopencv_to_generic_vec(obj, value, info); -} - - -template<> -PyObject* pyopencv_from(const cv::GArg& value) -{ - GAPI_Assert(value.kind != cv::detail::ArgKind::GOBJREF); -#define HANDLE_CASE(T, O) case cv::detail::OpaqueKind::CV_##T: \ - { \ - return pyopencv_from(value.get()); \ - } - -#define UNSUPPORTED(T) case cv::detail::OpaqueKind::CV_##T: break - switch (value.opaque_kind) - { - HANDLE_CASE(BOOL, bool); - HANDLE_CASE(INT, int); - HANDLE_CASE(INT64, int64_t); - HANDLE_CASE(UINT64, uint64_t); - HANDLE_CASE(DOUBLE, double); - HANDLE_CASE(FLOAT, float); - HANDLE_CASE(STRING, std::string); - HANDLE_CASE(POINT, cv::Point); - HANDLE_CASE(POINT2F, cv::Point2f); - HANDLE_CASE(POINT3F, cv::Point3f); - HANDLE_CASE(SIZE, cv::Size); - HANDLE_CASE(RECT, cv::Rect); - HANDLE_CASE(SCALAR, cv::Scalar); - HANDLE_CASE(MAT, cv::Mat); - HANDLE_CASE(UNKNOWN, cv::detail::PyObjectHolder); - HANDLE_CASE(DRAW_PRIM, cv::gapi::wip::draw::Prim); -#undef HANDLE_CASE -#undef UNSUPPORTED - } - util::throw_error(std::logic_error("Unsupported kernel input type")); -} - -template<> -bool pyopencv_to(PyObject* obj, cv::GArg& value, const ArgInfo& info) -{ - value = cv::GArg(cv::detail::PyObjectHolder(obj)); - return true; -} - -template <> -bool pyopencv_to(PyObject* obj, std::vector& value, const ArgInfo& info) -{ - return pyopencv_to_generic_vec(obj, value, info); -} - -template <> -PyObject* pyopencv_from(const std::vector& value) -{ - return pyopencv_from_generic_vec(value); -} - -template <> -bool pyopencv_to(PyObject* obj, std::vector& value, const ArgInfo& info) -{ - return pyopencv_to_generic_vec(obj, value, info); -} - -template <> -PyObject* pyopencv_from(const std::vector& value) -{ - return pyopencv_from_generic_vec(value); -} - -template<> -PyObject* pyopencv_from(const cv::detail::OpaqueRef& o) -{ - switch (o.getKind()) - { - case cv::detail::OpaqueKind::CV_BOOL : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_INT : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_INT64 : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_UINT64 : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_DOUBLE : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_FLOAT : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_STRING : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_POINT : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_POINT2F : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_POINT3F : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_SIZE : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_RECT : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_UNKNOWN : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_DRAW_PRIM : return pyopencv_from(o.rref()); - case cv::detail::OpaqueKind::CV_SCALAR : break; - case cv::detail::OpaqueKind::CV_MAT : break; - } - - PyErr_SetString(PyExc_TypeError, "Unsupported GOpaque type"); - return NULL; -} - -template <> -PyObject* pyopencv_from(const cv::detail::VectorRef& v) -{ - switch (v.getKind()) - { - case cv::detail::OpaqueKind::CV_BOOL : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_INT : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_INT64 : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_UINT64 : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_DOUBLE : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_FLOAT : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_STRING : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_POINT : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_POINT2F : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_POINT3F : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_SIZE : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_RECT : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_SCALAR : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_MAT : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_UNKNOWN : return pyopencv_from_generic_vec(v.rref()); - case cv::detail::OpaqueKind::CV_DRAW_PRIM : return pyopencv_from_generic_vec(v.rref()); - } - - PyErr_SetString(PyExc_TypeError, "Unsupported GArray type"); - return NULL; -} - -template <> -PyObject* pyopencv_from(const GRunArg& v) -{ - switch (v.index()) - { - case GRunArg::index_of(): - return pyopencv_from(util::get(v)); - - case GRunArg::index_of(): - return pyopencv_from(util::get(v)); - - case GRunArg::index_of(): - return pyopencv_from(util::get(v)); - - case GRunArg::index_of(): - return pyopencv_from(util::get(v)); - } - - PyErr_SetString(PyExc_TypeError, "Failed to unpack GRunArgs. Index of variant is unknown"); - return NULL; -} - -template -PyObject* pyopencv_from(const cv::optional& opt) -{ - if (!opt.has_value()) - { - Py_RETURN_NONE; - } - return pyopencv_from(*opt); -} - -template <> -PyObject* pyopencv_from(const GOptRunArg& v) -{ - switch (v.index()) - { - case GOptRunArg::index_of>(): - return pyopencv_from(util::get>(v)); - - case GOptRunArg::index_of>(): - return pyopencv_from(util::get>(v)); - - case GOptRunArg::index_of>(): - return pyopencv_from(util::get>(v)); - - case GOptRunArg::index_of>(): - return pyopencv_from(util::get>(v)); - } - - PyErr_SetString(PyExc_TypeError, "Failed to unpack GOptRunArg. Index of variant is unknown"); - return NULL; -} - -template<> -PyObject* pyopencv_from(const GRunArgs& value) -{ - return value.size() == 1 ? pyopencv_from(value[0]) : pyopencv_from_generic_vec(value); -} - -template<> -PyObject* pyopencv_from(const GOptRunArgs& value) -{ - return value.size() == 1 ? pyopencv_from(value[0]) : pyopencv_from_generic_vec(value); -} - -// FIXME: cv::variant should be wrapped once for all types. -template <> -PyObject* pyopencv_from(const cv::util::variant& v) -{ - using RunArgs = cv::util::variant; - switch (v.index()) - { - case RunArgs::index_of(): - return pyopencv_from(util::get(v)); - case RunArgs::index_of(): - return pyopencv_from(util::get(v)); - } - - PyErr_SetString(PyExc_TypeError, "Failed to recognize kind of RunArgs. Index of variant is unknown"); - return NULL; -} - -template -void pyopencv_to_with_check(PyObject* from, T& to, const std::string& msg = "") -{ - if (!pyopencv_to(from, to, ArgInfo("", false))) - { - cv::util::throw_error(std::logic_error(msg)); - } -} - -template -void pyopencv_to_generic_vec_with_check(PyObject* from, - std::vector& to, - const std::string& msg = "") -{ - if (!pyopencv_to_generic_vec(from, to, ArgInfo("", false))) - { - cv::util::throw_error(std::logic_error(msg)); - } -} - -template -static T extract_proto_args(PyObject* py_args) -{ - using namespace cv; - - GProtoArgs args; - Py_ssize_t size = PyList_Size(py_args); - args.reserve(size); - for (int i = 0; i < size; ++i) - { - PyObject* item = PyList_GetItem(py_args, i); - if (PyObject_TypeCheck(item, reinterpret_cast(pyopencv_GScalar_TypePtr))) - { - args.emplace_back(reinterpret_cast(item)->v); - } - else if (PyObject_TypeCheck(item, reinterpret_cast(pyopencv_GMat_TypePtr))) - { - args.emplace_back(reinterpret_cast(item)->v); - } - else if (PyObject_TypeCheck(item, reinterpret_cast(pyopencv_GOpaqueT_TypePtr))) - { - args.emplace_back(reinterpret_cast(item)->v.strip()); - } - else if (PyObject_TypeCheck(item, reinterpret_cast(pyopencv_GArrayT_TypePtr))) - { - args.emplace_back(reinterpret_cast(item)->v.strip()); - } - else - { - util::throw_error(std::logic_error("Unsupported type for GProtoArgs")); - } - } - - return T(std::move(args)); -} - -static cv::detail::OpaqueRef extract_opaque_ref(PyObject* from, cv::detail::OpaqueKind kind) -{ -#define HANDLE_CASE(T, O) case cv::detail::OpaqueKind::CV_##T: \ -{ \ - O obj{}; \ - pyopencv_to_with_check(from, obj, "Failed to obtain " # O); \ - return cv::detail::OpaqueRef{std::move(obj)}; \ -} -#define UNSUPPORTED(T) case cv::detail::OpaqueKind::CV_##T: break - switch (kind) - { - HANDLE_CASE(BOOL, bool); - HANDLE_CASE(INT, int); - HANDLE_CASE(INT64, int64_t); - HANDLE_CASE(UINT64, uint64_t); - HANDLE_CASE(DOUBLE, double); - HANDLE_CASE(FLOAT, float); - HANDLE_CASE(STRING, std::string); - HANDLE_CASE(POINT, cv::Point); - HANDLE_CASE(POINT2F, cv::Point2f); - HANDLE_CASE(POINT3F, cv::Point3f); - HANDLE_CASE(SIZE, cv::Size); - HANDLE_CASE(RECT, cv::Rect); - HANDLE_CASE(UNKNOWN, cv::GArg); - UNSUPPORTED(SCALAR); - UNSUPPORTED(MAT); - UNSUPPORTED(DRAW_PRIM); -#undef HANDLE_CASE -#undef UNSUPPORTED - } - util::throw_error(std::logic_error("Unsupported type for GOpaqueT")); -} - -static cv::detail::VectorRef extract_vector_ref(PyObject* from, cv::detail::OpaqueKind kind) -{ -#define HANDLE_CASE(T, O) case cv::detail::OpaqueKind::CV_##T: \ -{ \ - std::vector obj; \ - pyopencv_to_generic_vec_with_check(from, obj, "Failed to obtain vector of " # O); \ - return cv::detail::VectorRef{std::move(obj)}; \ -} -#define UNSUPPORTED(T) case cv::detail::OpaqueKind::CV_##T: break - switch (kind) - { - HANDLE_CASE(BOOL, bool); - HANDLE_CASE(INT, int); - HANDLE_CASE(INT64, int64_t); - HANDLE_CASE(UINT64, uint64_t); - HANDLE_CASE(DOUBLE, double); - HANDLE_CASE(FLOAT, float); - HANDLE_CASE(STRING, std::string); - HANDLE_CASE(POINT, cv::Point); - HANDLE_CASE(POINT2F, cv::Point2f); - HANDLE_CASE(POINT3F, cv::Point3f); - HANDLE_CASE(SIZE, cv::Size); - HANDLE_CASE(RECT, cv::Rect); - HANDLE_CASE(SCALAR, cv::Scalar); - HANDLE_CASE(MAT, cv::Mat); - HANDLE_CASE(UNKNOWN, cv::GArg); - HANDLE_CASE(DRAW_PRIM, cv::gapi::wip::draw::Prim); -#undef HANDLE_CASE -#undef UNSUPPORTED - } - util::throw_error(std::logic_error("Unsupported type for GArrayT")); -} - -static cv::GRunArg extract_run_arg(const cv::GTypeInfo& info, PyObject* item) -{ - switch (info.shape) - { - case cv::GShape::GMAT: - { - // NB: In case streaming it can be IStreamSource or cv::Mat - if (PyObject_TypeCheck(item, - reinterpret_cast(pyopencv_gapi_wip_IStreamSource_TypePtr))) - { - cv::gapi::wip::IStreamSource::Ptr source = - reinterpret_cast(item)->v; - return source; - } - cv::Mat obj; - pyopencv_to_with_check(item, obj, "Failed to obtain cv::Mat"); - return obj; - } - case cv::GShape::GSCALAR: - { - cv::Scalar obj; - pyopencv_to_with_check(item, obj, "Failed to obtain cv::Scalar"); - return obj; - } - case cv::GShape::GOPAQUE: - { - return extract_opaque_ref(item, info.kind); - } - case cv::GShape::GARRAY: - { - return extract_vector_ref(item, info.kind); - } - case cv::GShape::GFRAME: - { - // NB: Isn't supported yet. - break; - } - } - - util::throw_error(std::logic_error("Unsupported output shape")); -} - -static cv::GRunArgs extract_run_args(const cv::GTypesInfo& info, PyObject* py_args) -{ - GAPI_Assert(PyList_Check(py_args)); - - cv::GRunArgs args; - Py_ssize_t list_size = PyList_Size(py_args); - args.reserve(list_size); - - for (int i = 0; i < list_size; ++i) - { - args.push_back(extract_run_arg(info[i], PyList_GetItem(py_args, i))); - } - - return args; -} - -static cv::GMetaArg extract_meta_arg(const cv::GTypeInfo& info, PyObject* item) -{ - switch (info.shape) - { - case cv::GShape::GMAT: - { - cv::Mat obj; - pyopencv_to_with_check(item, obj, "Failed to obtain cv::Mat"); - return cv::GMetaArg{cv::descr_of(obj)}; - } - case cv::GShape::GSCALAR: - { - cv::Scalar obj; - pyopencv_to_with_check(item, obj, "Failed to obtain cv::Scalar"); - return cv::GMetaArg{cv::descr_of(obj)}; - } - case cv::GShape::GARRAY: - { - return cv::GMetaArg{cv::empty_array_desc()}; - } - case cv::GShape::GOPAQUE: - { - return cv::GMetaArg{cv::empty_gopaque_desc()}; - } - case cv::GShape::GFRAME: - { - // NB: Isn't supported yet. - break; - } - } - util::throw_error(std::logic_error("Unsupported output shape")); -} - -static cv::GMetaArgs extract_meta_args(const cv::GTypesInfo& info, PyObject* py_args) -{ - GAPI_Assert(PyList_Check(py_args)); - - cv::GMetaArgs metas; - Py_ssize_t list_size = PyList_Size(py_args); - metas.reserve(list_size); - - for (int i = 0; i < list_size; ++i) - { - metas.push_back(extract_meta_arg(info[i], PyList_GetItem(py_args, i))); - } - - return metas; -} - -static cv::GRunArgs run_py_kernel(cv::detail::PyObjectHolder kernel, - const cv::gapi::python::GPythonContext &ctx) -{ - const auto& ins = ctx.ins; - const auto& in_metas = ctx.in_metas; - const auto& out_info = ctx.out_info; - - PyGILState_STATE gstate; - gstate = PyGILState_Ensure(); - - cv::GRunArgs outs; - try - { - // NB: Doesn't increase reference counter (false), - // because PyObject already have ownership. - // In case exception decrement reference counter. - cv::detail::PyObjectHolder args( - PyTuple_New(ctx.m_state.has_value() ? ins.size() + 1 : ins.size()), false); - for (size_t i = 0; i < ins.size(); ++i) - { - // NB: If meta is monostate then object isn't associated with G-TYPE. - if (cv::util::holds_alternative(in_metas[i])) - { - PyTuple_SetItem(args.get(), i, pyopencv_from(ins[i])); - continue; - } - - switch (in_metas[i].index()) - { - case cv::GMetaArg::index_of(): - PyTuple_SetItem(args.get(), i, pyopencv_from(ins[i].get())); - break; - case cv::GMetaArg::index_of(): - PyTuple_SetItem(args.get(), i, pyopencv_from(ins[i].get())); - break; - case cv::GMetaArg::index_of(): - PyTuple_SetItem(args.get(), i, pyopencv_from(ins[i].get())); - break; - case cv::GMetaArg::index_of(): - PyTuple_SetItem(args.get(), i, pyopencv_from(ins[i].get())); - break; - case cv::GMetaArg::index_of(): - util::throw_error(std::logic_error("GFrame isn't supported for custom operation")); - break; - } - } - - if (ctx.m_state.has_value()) - { - PyTuple_SetItem(args.get(), ins.size(), pyopencv_from(ctx.m_state.value())); - } - - // NB: Doesn't increase reference counter (false). - // In case PyObject_CallObject return NULL, do nothing in destructor. - cv::detail::PyObjectHolder result( - PyObject_CallObject(kernel.get(), args.get()), false); - - if (PyErr_Occurred()) - { - PyErr_PrintEx(0); - PyErr_Clear(); - throw std::logic_error("Python kernel failed with error!"); - } - // NB: In fact it's impossible situation, because errors were handled above. - GAPI_Assert(result.get() && "Python kernel returned NULL!"); - - if (out_info.size() == 1) - { - outs = cv::GRunArgs{extract_run_arg(out_info[0], result.get())}; - } - else if (out_info.size() > 1) - { - GAPI_Assert(PyTuple_Check(result.get())); - - Py_ssize_t tuple_size = PyTuple_Size(result.get()); - outs.reserve(tuple_size); - - for (int i = 0; i < tuple_size; ++i) - { - outs.push_back(extract_run_arg(out_info[i], PyTuple_GetItem(result.get(), i))); - } - } - else - { - // Seems to be impossible case. - GAPI_Error("InternalError"); - } - } - catch (...) - { - PyGILState_Release(gstate); - throw; - } - PyGILState_Release(gstate); - - return outs; -} - -static void unpackMetasToTuple(const cv::GMetaArgs& meta, - const cv::GArgs& gargs, - cv::detail::PyObjectHolder& tuple) -{ - size_t idx = 0; - for (auto&& m : meta) - { - switch (m.index()) - { - case cv::GMetaArg::index_of(): - PyTuple_SetItem(tuple.get(), idx, pyopencv_from(cv::util::get(m))); - break; - case cv::GMetaArg::index_of(): - PyTuple_SetItem(tuple.get(), idx, - pyopencv_from(cv::util::get(m))); - break; - case cv::GMetaArg::index_of(): - PyTuple_SetItem(tuple.get(), idx, - pyopencv_from(cv::util::get(m))); - break; - case cv::GMetaArg::index_of(): - PyTuple_SetItem(tuple.get(), idx, - pyopencv_from(cv::util::get(m))); - break; - case cv::GMetaArg::index_of(): - PyTuple_SetItem(tuple.get(), idx, pyopencv_from(gargs[idx])); - break; - case cv::GMetaArg::index_of(): - util::throw_error( - std::logic_error("GFrame isn't supported for custom operation")); - break; - } - ++idx; - } -} - -static cv::GArg run_py_setup(cv::detail::PyObjectHolder setup, - const cv::GMetaArgs &meta, - const cv::GArgs &gargs) -{ - PyGILState_STATE gstate; - gstate = PyGILState_Ensure(); - - cv::GArg state; - try - { - // NB: Doesn't increase reference counter (false), - // because PyObject already have ownership. - // In case exception decrement reference counter. - cv::detail::PyObjectHolder args(PyTuple_New(meta.size()), false); - unpackMetasToTuple(meta, gargs, args); - - PyObject *py_kernel_state = PyObject_CallObject(setup.get(), args.get()); - if (PyErr_Occurred()) - { - PyErr_PrintEx(0); - PyErr_Clear(); - throw std::logic_error("Python kernel setup failed with error!"); - } - // NB: In fact it's impossible situation, because errors were handled above. - GAPI_Assert(py_kernel_state && "Python kernel setup returned NULL!"); - - if (!pyopencv_to(py_kernel_state, state, ArgInfo("arg", false))) - { - util::throw_error(std::logic_error("Failed to convert python state")); - } - } - catch (...) - { - PyGILState_Release(gstate); - throw; - } - PyGILState_Release(gstate); - return state; -} - -static GMetaArg get_meta_arg(PyObject* obj) -{ - cv::GMetaArg arg; - if (!pyopencv_to(obj, arg, ArgInfo("arg", false))) - { - util::throw_error(std::logic_error("Unsupported output meta type")); - } - return arg; -} - -static cv::GMetaArgs get_meta_args(PyObject* tuple) -{ - size_t size = PyTuple_Size(tuple); - - cv::GMetaArgs metas; - metas.reserve(size); - for (size_t i = 0; i < size; ++i) - { - metas.push_back(get_meta_arg(PyTuple_GetItem(tuple, i))); - } - - return metas; -} - -static GMetaArgs run_py_meta(cv::detail::PyObjectHolder out_meta, - const cv::GMetaArgs &meta, - const cv::GArgs &gargs) -{ - PyGILState_STATE gstate; - gstate = PyGILState_Ensure(); - - cv::GMetaArgs out_metas; - try - { - // NB: Doesn't increase reference counter (false), - // because PyObject already have ownership. - // In case exception decrement reference counter. - cv::detail::PyObjectHolder args(PyTuple_New(meta.size()), false); - unpackMetasToTuple(meta, gargs, args); - // NB: Doesn't increase reference counter (false). - // In case PyObject_CallObject return NULL, do nothing in destructor. - cv::detail::PyObjectHolder result( - PyObject_CallObject(out_meta.get(), args.get()), false); - - if (PyErr_Occurred()) - { - PyErr_PrintEx(0); - PyErr_Clear(); - throw std::logic_error("Python outMeta failed with error!"); - } - // NB: In fact it's impossible situation, because errors were handled above. - GAPI_Assert(result.get() && "Python outMeta returned NULL!"); - - out_metas = PyTuple_Check(result.get()) ? get_meta_args(result.get()) - : cv::GMetaArgs{get_meta_arg(result.get())}; - } - catch (...) - { - PyGILState_Release(gstate); - throw; - } - PyGILState_Release(gstate); - - return out_metas; -} - -static PyObject* pyopencv_cv_gapi_kernels(PyObject* , PyObject* py_args, PyObject*) -{ - using namespace cv; - GKernelPackage pkg; - Py_ssize_t size = PyTuple_Size(py_args); - - for (int i = 0; i < size; ++i) - { - PyObject* user_kernel = PyTuple_GetItem(py_args, i); - - PyObject* id_obj = PyObject_GetAttrString(user_kernel, "id"); - if (!id_obj) - { - PyErr_SetString(PyExc_TypeError, - "Python kernel should contain id, please use cv.gapi.kernel to define kernel"); - return NULL; - } - - PyObject* out_meta = PyObject_GetAttrString(user_kernel, "outMeta"); - if (!out_meta) - { - PyErr_SetString(PyExc_TypeError, - "Python kernel should contain outMeta, please use cv.gapi.kernel to define kernel"); - return NULL; - } - - PyObject* run = PyObject_GetAttrString(user_kernel, "run"); - if (!run) - { - PyErr_SetString(PyExc_TypeError, - "Python kernel should contain run, please use cv.gapi.kernel to define kernel"); - return NULL; - } - PyObject* setup = nullptr; - if (PyObject_HasAttrString(user_kernel, "setup")) { - setup = PyObject_GetAttrString(user_kernel, "setup"); - } - - std::string id; - if (!pyopencv_to(id_obj, id, ArgInfo("id", false))) - { - PyErr_SetString(PyExc_TypeError, "Failed to obtain string"); - return NULL; - } - - using namespace std::placeholders; - - if (setup) - { - gapi::python::GPythonFunctor f( - id.c_str(), std::bind(run_py_meta, cv::detail::PyObjectHolder{out_meta}, _1, _2), - std::bind(run_py_kernel, cv::detail::PyObjectHolder{run}, _1), - std::bind(run_py_setup, cv::detail::PyObjectHolder{setup}, _1, _2)); - pkg.include(f); - } - else - { - gapi::python::GPythonFunctor f( - id.c_str(), std::bind(run_py_meta, cv::detail::PyObjectHolder{out_meta}, _1, _2), - std::bind(run_py_kernel, cv::detail::PyObjectHolder{run}, _1)); - pkg.include(f); - } - } - return pyopencv_from(pkg); -} - -static PyObject* pyopencv_cv_gapi_op(PyObject* , PyObject* py_args, PyObject*) -{ - using namespace cv; - Py_ssize_t size = PyTuple_Size(py_args); - std::string id; - if (!pyopencv_to(PyTuple_GetItem(py_args, 0), id, ArgInfo("id", false))) - { - PyErr_SetString(PyExc_TypeError, "Failed to obtain: operation id must be a string"); - return NULL; - } - PyObject* outMeta = PyTuple_GetItem(py_args, 1); - - cv::GArgs args; - for (int i = 2; i < size; i++) - { - PyObject* item = PyTuple_GetItem(py_args, i); - if (PyObject_TypeCheck(item, - reinterpret_cast(pyopencv_GMat_TypePtr))) - { - args.emplace_back(reinterpret_cast(item)->v); - } - else if (PyObject_TypeCheck(item, - reinterpret_cast(pyopencv_GScalar_TypePtr))) - { - args.emplace_back(reinterpret_cast(item)->v); - } - else if (PyObject_TypeCheck(item, - reinterpret_cast(pyopencv_GOpaqueT_TypePtr))) - { - auto&& arg = reinterpret_cast(item)->v.arg(); -#define HC(T, K) case cv::GOpaqueT::Storage:: index_of>(): \ - args.emplace_back(cv::util::get>(arg)); \ - break; \ - - SWITCH(arg.index(), GOPAQUE_TYPE_LIST_G, HC) -#undef HC - } - else if (PyObject_TypeCheck(item, - reinterpret_cast(pyopencv_GArrayT_TypePtr))) - { - auto&& arg = reinterpret_cast(item)->v.arg(); -#define HC(T, K) case cv::GArrayT::Storage:: index_of>(): \ - args.emplace_back(cv::util::get>(arg)); \ - break; \ - - SWITCH(arg.index(), GARRAY_TYPE_LIST_G, HC) -#undef HC - } - else - { - args.emplace_back(cv::GArg(cv::detail::PyObjectHolder{item})); - } - } - - cv::GKernel::M outMetaWrapper = std::bind(run_py_meta, - cv::detail::PyObjectHolder{outMeta}, - std::placeholders::_1, - std::placeholders::_2); - return pyopencv_from(cv::gapi::wip::op(id, outMetaWrapper, std::move(args))); -} - -template<> -bool pyopencv_to(PyObject* obj, cv::detail::ExtractArgsCallback& value, const ArgInfo&) -{ - cv::detail::PyObjectHolder holder{obj}; - value = cv::detail::ExtractArgsCallback{[=](const cv::GTypesInfo& info) - { - PyGILState_STATE gstate; - gstate = PyGILState_Ensure(); - - cv::GRunArgs args; - try - { - args = extract_run_args(info, holder.get()); - } - catch (...) - { - PyGILState_Release(gstate); - throw; - } - PyGILState_Release(gstate); - return args; - }}; - return true; -} - -template<> -bool pyopencv_to(PyObject* obj, cv::detail::ExtractMetaCallback& value, const ArgInfo&) -{ - cv::detail::PyObjectHolder holder{obj}; - value = cv::detail::ExtractMetaCallback{[=](const cv::GTypesInfo& info) - { - PyGILState_STATE gstate; - gstate = PyGILState_Ensure(); - - cv::GMetaArgs args; - try - { - args = extract_meta_args(info, holder.get()); - } - catch (...) - { - PyGILState_Release(gstate); - throw; - } - PyGILState_Release(gstate); - return args; - }}; - return true; -} - -template -struct PyOpenCV_Converter> -{ - static PyObject* from(const cv::GArray& p) - { - return pyopencv_from(cv::GArrayT(p)); - } - static bool to(PyObject *obj, cv::GArray& value, const ArgInfo& info) - { - if (PyObject_TypeCheck(obj, reinterpret_cast(pyopencv_GArrayT_TypePtr))) - { - auto& array = reinterpret_cast(obj)->v; - try - { - value = cv::util::get>(array.arg()); - } - catch (...) - { - return false; - } - return true; - } - return false; - } -}; - -template -struct PyOpenCV_Converter> -{ - static PyObject* from(const cv::GOpaque& p) - { - return pyopencv_from(cv::GOpaqueT(p)); - } - static bool to(PyObject *obj, cv::GOpaque& value, const ArgInfo& info) - { - if (PyObject_TypeCheck(obj, reinterpret_cast(pyopencv_GOpaqueT_TypePtr))) - { - auto& opaque = reinterpret_cast(obj)->v; - try - { - value = cv::util::get>(opaque.arg()); - } - catch (...) - { - return false; - } - return true; - } - return false; - } -}; - -template<> -bool pyopencv_to(PyObject* obj, cv::GProtoInputArgs& value, const ArgInfo& info) -{ - try - { - value = extract_proto_args(obj); - return true; - } - catch (...) - { - failmsg("Can't parse cv::GProtoInputArgs"); - return false; - } -} - -template<> -bool pyopencv_to(PyObject* obj, cv::GProtoOutputArgs& value, const ArgInfo& info) -{ - try - { - value = extract_proto_args(obj); - return true; - } - catch (...) - { - failmsg("Can't parse cv::GProtoOutputArgs"); - return false; - } -} - -// extend cv.gapi methods -#define PYOPENCV_EXTRA_METHODS_GAPI \ - {"kernels", CV_PY_FN_WITH_KW(pyopencv_cv_gapi_kernels), "kernels(...) -> GKernelPackage"}, \ - {"__op", CV_PY_FN_WITH_KW(pyopencv_cv_gapi_op), "__op(...) -> retval\n"}, - - -#endif // HAVE_OPENCV_GAPI -#endif // OPENCV_GAPI_PYOPENCV_GAPI_HPP diff --git a/modules/gapi/misc/python/python_bridge.hpp b/modules/gapi/misc/python/python_bridge.hpp deleted file mode 100644 index f384b6907b..0000000000 --- a/modules/gapi/misc/python/python_bridge.hpp +++ /dev/null @@ -1,353 +0,0 @@ -// 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. -// -// Copyright (C) 2021 Intel Corporation - -#ifndef OPENCV_GAPI_PYTHON_BRIDGE_HPP -#define OPENCV_GAPI_PYTHON_BRIDGE_HPP - -#include -#include -#include -#include // Prim - -#define ID(T, E) T -#define ID_(T, E) ID(T, E), - -#define WRAP_ARGS(T, E, G) \ - G(T, E) - -#define SWITCH(type, LIST_G, HC) \ - switch(type) { \ - LIST_G(HC, HC) \ - default: \ - GAPI_Error("Unsupported type"); \ - } - -using cv::gapi::wip::draw::Prim; - -#define GARRAY_TYPE_LIST_G(G, G2) \ -WRAP_ARGS(bool , cv::gapi::ArgType::CV_BOOL, G) \ -WRAP_ARGS(int , cv::gapi::ArgType::CV_INT, G) \ -WRAP_ARGS(int64_t , cv::gapi::ArgType::CV_INT64, G) \ -WRAP_ARGS(uint64_t , cv::gapi::ArgType::CV_UINT64, G) \ -WRAP_ARGS(double , cv::gapi::ArgType::CV_DOUBLE, G) \ -WRAP_ARGS(float , cv::gapi::ArgType::CV_FLOAT, G) \ -WRAP_ARGS(std::string , cv::gapi::ArgType::CV_STRING, G) \ -WRAP_ARGS(cv::Point , cv::gapi::ArgType::CV_POINT, G) \ -WRAP_ARGS(cv::Point2f , cv::gapi::ArgType::CV_POINT2F, G) \ -WRAP_ARGS(cv::Point3f , cv::gapi::ArgType::CV_POINT3F, G) \ -WRAP_ARGS(cv::Size , cv::gapi::ArgType::CV_SIZE, G) \ -WRAP_ARGS(cv::Rect , cv::gapi::ArgType::CV_RECT, G) \ -WRAP_ARGS(cv::Scalar , cv::gapi::ArgType::CV_SCALAR, G) \ -WRAP_ARGS(cv::Mat , cv::gapi::ArgType::CV_MAT, G) \ -WRAP_ARGS(Prim , cv::gapi::ArgType::CV_DRAW_PRIM, G) \ -WRAP_ARGS(cv::GArg , cv::gapi::ArgType::CV_ANY, G) \ -WRAP_ARGS(cv::GMat , cv::gapi::ArgType::CV_GMAT, G2) \ - -#define GOPAQUE_TYPE_LIST_G(G, G2) \ -WRAP_ARGS(bool , cv::gapi::ArgType::CV_BOOL, G) \ -WRAP_ARGS(int , cv::gapi::ArgType::CV_INT, G) \ -WRAP_ARGS(int64_t , cv::gapi::ArgType::CV_INT64, G) \ -WRAP_ARGS(uint64_t , cv::gapi::ArgType::CV_UINT64, G) \ -WRAP_ARGS(double , cv::gapi::ArgType::CV_DOUBLE, G) \ -WRAP_ARGS(float , cv::gapi::ArgType::CV_FLOAT, G) \ -WRAP_ARGS(std::string , cv::gapi::ArgType::CV_STRING, G) \ -WRAP_ARGS(cv::Point , cv::gapi::ArgType::CV_POINT, G) \ -WRAP_ARGS(cv::Point2f , cv::gapi::ArgType::CV_POINT2F, G) \ -WRAP_ARGS(cv::Point3f , cv::gapi::ArgType::CV_POINT3F, G) \ -WRAP_ARGS(cv::Size , cv::gapi::ArgType::CV_SIZE, G) \ -WRAP_ARGS(cv::GArg , cv::gapi::ArgType::CV_ANY, G) \ -WRAP_ARGS(cv::Rect , cv::gapi::ArgType::CV_RECT, G2) \ - -namespace cv { -namespace gapi { - -// NB: cv.gapi.CV_BOOL in python -enum ArgType { - CV_BOOL, - CV_INT, - CV_INT64, - CV_UINT64, - CV_DOUBLE, - CV_FLOAT, - CV_STRING, - CV_POINT, - CV_POINT2F, - CV_POINT3F, - CV_SIZE, - CV_RECT, - CV_SCALAR, - CV_MAT, - CV_GMAT, - CV_DRAW_PRIM, - CV_ANY, -}; - -GAPI_EXPORTS_W inline cv::GInferOutputs infer(const String& name, const cv::GInferInputs& inputs) -{ - return infer(name, inputs); -} - -GAPI_EXPORTS_W inline GInferOutputs infer(const std::string& name, - const cv::GOpaque& roi, - const GInferInputs& inputs) -{ - return infer(name, roi, inputs); -} - -GAPI_EXPORTS_W inline GInferListOutputs infer(const std::string& name, - const cv::GArray& rois, - const GInferInputs& inputs) -{ - return infer(name, rois, inputs); -} - -GAPI_EXPORTS_W inline GInferListOutputs infer2(const std::string& name, - const cv::GMat in, - const GInferListInputs& inputs) -{ - return infer2(name, in, inputs); -} - -} // namespace gapi - -namespace detail { - -template