From bf5c8770ac2caf063468e52fd6ae6d01cff3470b Mon Sep 17 00:00:00 2001 From: Anastasiya Pronina Date: Mon, 4 Sep 2023 17:10:46 +0100 Subject: [PATCH] Enabled VAS OT in G-API Python interface --- modules/gapi/include/opencv2/gapi/cpu/ot.hpp | 2 +- modules/gapi/include/opencv2/gapi/ot.hpp | 50 +++++++------- .../gapi/misc/python/package/gapi/__init__.py | 22 ++++++ modules/gapi/misc/python/pyopencv_gapi.hpp | 14 ++-- modules/gapi/misc/python/python_bridge.hpp | 3 + modules/gapi/misc/python/test/test_gapi_ot.py | 67 +++++++++++++++++++ .../gapi/misc/python/test/test_gapi_types.py | 14 ++-- modules/gapi/src/api/kernels_ot.cpp | 16 ++--- modules/gapi/src/backends/cpu/gcpuot.cpp | 8 +-- modules/gapi/test/cpu/gapi_ot_tests_cpu.cpp | 6 +- modules/python/src2/cv2_convert.hpp | 27 ++++++++ modules/python/src2/pycompat.hpp | 1 + 12 files changed, 176 insertions(+), 54 deletions(-) create mode 100644 modules/gapi/misc/python/test/test_gapi_ot.py diff --git a/modules/gapi/include/opencv2/gapi/cpu/ot.hpp b/modules/gapi/include/opencv2/gapi/cpu/ot.hpp index a4abb4dac9fc..03dbe904cc9d 100644 --- a/modules/gapi/include/opencv2/gapi/cpu/ot.hpp +++ b/modules/gapi/include/opencv2/gapi/cpu/ot.hpp @@ -19,7 +19,7 @@ namespace gapi { */ namespace ot { namespace cpu { -GAPI_EXPORTS GKernelPackage kernels(); +GAPI_EXPORTS_W GKernelPackage kernels(); } // namespace cpu } // namespace ot } // namespace gapi diff --git a/modules/gapi/include/opencv2/gapi/ot.hpp b/modules/gapi/include/opencv2/gapi/ot.hpp index 1cad46aa7f61..c000846496e3 100644 --- a/modules/gapi/include/opencv2/gapi/ot.hpp +++ b/modules/gapi/include/opencv2/gapi/ot.hpp @@ -24,7 +24,7 @@ namespace ot { * * Tracking status twin for vas::ot::TrackingStatus */ -enum class TrackingStatus: int32_t +enum TrackingStatus { NEW = 0, /**< The object is newly added. */ TRACKED, /**< The object is being tracked. */ @@ -70,7 +70,7 @@ struct ObjectTrackerParams } }; -using GTrackedInfo = std::tuple, cv::GArray, cv::GArray, cv::GArray>; +using GTrackedInfo = std::tuple, cv::GArray, cv::GArray, cv::GArray>; G_API_OP(GTrackFromMat, , cv::GArray, float)>, "com.intel.track_from_mat") { @@ -107,23 +107,25 @@ G_API_OP(GTrackFromFrame, , cv::GA * @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. + * 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 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); +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. @@ -139,15 +141,15 @@ GAPI_EXPORTS std::tuple, * 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. + * cv::GArray Array of tracking statuses for objects. */ -GAPI_EXPORTS 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); +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 diff --git a/modules/gapi/misc/python/package/gapi/__init__.py b/modules/gapi/misc/python/package/gapi/__init__.py index 992fa2aee253..2b21e54e4195 100644 --- a/modules/gapi/misc/python/package/gapi/__init__.py +++ b/modules/gapi/misc/python/package/gapi/__init__.py @@ -56,6 +56,14 @@ 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) @@ -111,6 +119,14 @@ 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) @@ -170,6 +186,8 @@ 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, @@ -190,6 +208,8 @@ def op(op_id, in_types, out_types): 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, @@ -205,6 +225,8 @@ def op(op_id, in_types, out_types): 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' , diff --git a/modules/gapi/misc/python/pyopencv_gapi.hpp b/modules/gapi/misc/python/pyopencv_gapi.hpp index a13b8e545dae..57ff3d55dbf7 100644 --- a/modules/gapi/misc/python/pyopencv_gapi.hpp +++ b/modules/gapi/misc/python/pyopencv_gapi.hpp @@ -246,6 +246,7 @@ PyObject* pyopencv_from(const cv::GArg& value) 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); @@ -258,7 +259,6 @@ PyObject* pyopencv_from(const cv::GArg& value) HANDLE_CASE(MAT, cv::Mat); HANDLE_CASE(UNKNOWN, cv::detail::PyObjectHolder); HANDLE_CASE(DRAW_PRIM, cv::gapi::wip::draw::Prim); - UNSUPPORTED(UINT64); #undef HANDLE_CASE #undef UNSUPPORTED } @@ -304,6 +304,7 @@ PyObject* pyopencv_from(const cv::detail::OpaqueRef& o) 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()); @@ -314,7 +315,6 @@ PyObject* pyopencv_from(const cv::detail::OpaqueRef& o) 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_UINT64 : break; case cv::detail::OpaqueKind::CV_SCALAR : break; case cv::detail::OpaqueKind::CV_MAT : break; } @@ -331,6 +331,7 @@ PyObject* pyopencv_from(const cv::detail::VectorRef& v) 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()); @@ -343,7 +344,6 @@ PyObject* pyopencv_from(const cv::detail::VectorRef& v) 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()); - case cv::detail::OpaqueKind::CV_UINT64 : break; } PyErr_SetString(PyExc_TypeError, "Unsupported GArray type"); @@ -502,6 +502,8 @@ static cv::detail::OpaqueRef extract_opaque_ref(PyObject* from, cv::detail::Opaq { 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); @@ -511,8 +513,6 @@ static cv::detail::OpaqueRef extract_opaque_ref(PyObject* from, cv::detail::Opaq HANDLE_CASE(SIZE, cv::Size); HANDLE_CASE(RECT, cv::Rect); HANDLE_CASE(UNKNOWN, cv::GArg); - UNSUPPORTED(UINT64); - UNSUPPORTED(INT64); UNSUPPORTED(SCALAR); UNSUPPORTED(MAT); UNSUPPORTED(DRAW_PRIM); @@ -535,6 +535,8 @@ static cv::detail::VectorRef extract_vector_ref(PyObject* from, cv::detail::Opaq { 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); @@ -547,8 +549,6 @@ static cv::detail::VectorRef extract_vector_ref(PyObject* from, cv::detail::Opaq HANDLE_CASE(MAT, cv::Mat); HANDLE_CASE(UNKNOWN, cv::GArg); HANDLE_CASE(DRAW_PRIM, cv::gapi::wip::draw::Prim); - UNSUPPORTED(UINT64); - UNSUPPORTED(INT64); #undef HANDLE_CASE #undef UNSUPPORTED } diff --git a/modules/gapi/misc/python/python_bridge.hpp b/modules/gapi/misc/python/python_bridge.hpp index 8926b21a794a..f384b6907bd6 100644 --- a/modules/gapi/misc/python/python_bridge.hpp +++ b/modules/gapi/misc/python/python_bridge.hpp @@ -31,6 +31,7 @@ using cv::gapi::wip::draw::Prim; 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) \ @@ -49,6 +50,7 @@ WRAP_ARGS(cv::GMat , cv::gapi::ArgType::CV_GMAT, 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) \ @@ -67,6 +69,7 @@ enum ArgType { CV_BOOL, CV_INT, CV_INT64, + CV_UINT64, CV_DOUBLE, CV_FLOAT, CV_STRING, diff --git a/modules/gapi/misc/python/test/test_gapi_ot.py b/modules/gapi/misc/python/test/test_gapi_ot.py new file mode 100644 index 000000000000..7a2e404e1bb1 --- /dev/null +++ b/modules/gapi/misc/python/test/test_gapi_ot.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +import numpy as np +import cv2 as cv +import os +import sys +import unittest + +from tests_common import NewOpenCVTests + + +try: + + if sys.version_info[:2] < (3, 0): + raise unittest.SkipTest('Python 2.x is not supported') + + # Plaidml is an optional backend + pkgs = [ + ('ocl' , cv.gapi.core.ocl.kernels()), + ('cpu' , cv.gapi.core.cpu.kernels()), + ('fluid' , cv.gapi.core.fluid.kernels()) + # ('plaidml', cv.gapi.core.plaidml.kernels()) + ] + + + class gapi_ot_test(NewOpenCVTests): + + def smoke_test_ot(self): + # Input + img_path = self.find_file('cv/face/david2.jpg', [os.environ.get('OPENCV_TEST_DATA_PATH')]) + in_image = cv.cvtColor(cv.imread(img_path), cv.COLOR_RGB2GRAY) + in_rects = [ (138.0, 89.1, 71.3, 64.0) ] + in_rects_cls = 0 + + # G-API + g_in = cv.GMat() + g_in_rects = cv.GArray.Rect() + g_in_rect_cls = cv.GArray.Int() + delta = 0.5 + + g_out_rects, g_out_rects_cls, g_track_ids, g_track_sts = \ + cv.gapi.ot.track(g_in, g_in_rects, g_in_rect_cls, delta) + + + comp = cv.GComputation(cv.GIn(g_in, g_in_rects, g_in_rects_cls), + cv.GOut(g_out_rects, g_out_rects_cls, + g_track_ids, g_track_sts)) + + res = comp.apply(cv.gin(in_image, in_rects, in_rects_cls), + args=cv.gapi.compile_args(cv.gapi.ot.cpu.kernels())) + +except unittest.SkipTest as e: + + message = str(e) + + class TestSkip(unittest.TestCase): + def setUp(self): + self.skipTest('Skip tests: ' + message) + + def test_skip(): + pass + + pass + + +if __name__ == '__main__': + NewOpenCVTests.bootstrap() diff --git a/modules/gapi/misc/python/test/test_gapi_types.py b/modules/gapi/misc/python/test/test_gapi_types.py index 41bfbabd6171..cdf8a089fddf 100644 --- a/modules/gapi/misc/python/test/test_gapi_types.py +++ b/modules/gapi/misc/python/test/test_gapi_types.py @@ -17,10 +17,10 @@ class gapi_types_test(NewOpenCVTests): def test_garray_type(self): - types = [cv.gapi.CV_BOOL , cv.gapi.CV_INT , cv.gapi.CV_DOUBLE , cv.gapi.CV_FLOAT, - cv.gapi.CV_STRING, cv.gapi.CV_POINT , cv.gapi.CV_POINT2F, cv.gapi.CV_POINT3F , - cv.gapi.CV_SIZE , cv.gapi.CV_RECT , cv.gapi.CV_SCALAR , cv.gapi.CV_MAT , - cv.gapi.CV_GMAT] + types = [cv.gapi.CV_BOOL , cv.gapi.CV_INT , cv.gapi.CV_INT64 , cv.gapi.CV_UINT64, + cv.gapi.CV_DOUBLE , cv.gapi.CV_FLOAT , cv.gapi.CV_STRING, cv.gapi.CV_POINT , + cv.gapi.CV_POINT2F, cv.gapi.CV_POINT3F, cv.gapi.CV_SIZE , cv.gapi.CV_RECT , + cv.gapi.CV_SCALAR , cv.gapi.CV_MAT , cv.gapi.CV_GMAT] for t in types: g_array = cv.GArrayT(t) @@ -28,9 +28,9 @@ def test_garray_type(self): def test_gopaque_type(self): - types = [cv.gapi.CV_BOOL , cv.gapi.CV_INT , cv.gapi.CV_DOUBLE , cv.gapi.CV_FLOAT , - cv.gapi.CV_STRING, cv.gapi.CV_POINT, cv.gapi.CV_POINT2F, cv.gapi.CV_POINT3F, - cv.gapi.CV_SIZE , cv.gapi.CV_RECT] + types = [cv.gapi.CV_BOOL , cv.gapi.CV_INT , cv.gapi.CV_INT64 , cv.gapi.CV_UINT64, + cv.gapi.CV_DOUBLE , cv.gapi.CV_FLOAT , cv.gapi.CV_STRING, cv.gapi.CV_POINT , + cv.gapi.CV_POINT2F, cv.gapi.CV_POINT3F, cv.gapi.CV_SIZE , cv.gapi.CV_RECT] for t in types: g_opaque = cv.GOpaqueT(t) diff --git a/modules/gapi/src/api/kernels_ot.cpp b/modules/gapi/src/api/kernels_ot.cpp index 6e553817a481..15bed2ceae83 100644 --- a/modules/gapi/src/api/kernels_ot.cpp +++ b/modules/gapi/src/api/kernels_ot.cpp @@ -18,10 +18,10 @@ namespace ot 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) + cv::GArray> track(const cv::GMat& mat, + const cv::GArray& detected_rects, + const cv::GArray& detected_class_labels, + float delta) { return GTrackFromMat::on(mat, detected_rects, detected_class_labels, delta); } @@ -29,10 +29,10 @@ GAPI_EXPORTS_W std::tuple, 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) + cv::GArray> track(const cv::GFrame& frame, + const cv::GArray& detected_rects, + const cv::GArray& detected_class_labels, + float delta) { return GTrackFromFrame::on(frame, detected_rects, detected_class_labels, delta); } diff --git a/modules/gapi/src/backends/cpu/gcpuot.cpp b/modules/gapi/src/backends/cpu/gcpuot.cpp index 17bd38edc409..abe7327be8c9 100644 --- a/modules/gapi/src/backends/cpu/gcpuot.cpp +++ b/modules/gapi/src/backends/cpu/gcpuot.cpp @@ -72,7 +72,7 @@ GAPI_OCV_KERNEL_ST(GTrackFromMatImpl, cv::gapi::ot::GTrackFromMat, vas::ot::Obje std::vector& out_tr_rects, std::vector& out_rects_classes, std::vector& out_tr_ids, - std::vector& out_tr_statuses, + std::vector& out_tr_statuses, vas::ot::ObjectTracker& state) { std::vector detected_objs; @@ -87,7 +87,7 @@ GAPI_OCV_KERNEL_ST(GTrackFromMatImpl, cv::gapi::ot::GTrackFromMat, vas::ot::Obje out_tr_rects.push_back(object.rect); out_rects_classes.push_back(object.class_label); out_tr_ids.push_back(object.tracking_id); - out_tr_statuses.push_back(TrackingStatus(static_cast(object.status))); + out_tr_statuses.push_back(static_cast(object.status)); } } }; @@ -111,7 +111,7 @@ GAPI_OCV_KERNEL_ST(GTrackFromFrameImpl, cv::gapi::ot::GTrackFromFrame, vas::ot:: std::vector& out_tr_rects, std::vector& out_rects_classes, std::vector& out_tr_ids, - std::vector& out_tr_statuses, + std::vector& out_tr_statuses, vas::ot::ObjectTracker& state) { std::vector detected_objs; @@ -144,7 +144,7 @@ GAPI_OCV_KERNEL_ST(GTrackFromFrameImpl, cv::gapi::ot::GTrackFromFrame, vas::ot:: out_tr_rects.push_back(object.rect); out_rects_classes.push_back(object.class_label); out_tr_ids.push_back(object.tracking_id); - out_tr_statuses.push_back(TrackingStatus(static_cast(object.status))); + out_tr_statuses.push_back(static_cast(object.status)); } } }; diff --git a/modules/gapi/test/cpu/gapi_ot_tests_cpu.cpp b/modules/gapi/test/cpu/gapi_ot_tests_cpu.cpp index 1aac6c3a1594..c02185e6211e 100644 --- a/modules/gapi/test/cpu/gapi_ot_tests_cpu.cpp +++ b/modules/gapi/test/cpu/gapi_ot_tests_cpu.cpp @@ -120,7 +120,7 @@ GAPI_OCV_KERNEL_ST(OCV_CvVideo768x576_Detect, CvVideo768x576_Detect, FrameDetect }; G_API_OP(CheckTrackerResults, (cv::GArray, cv::GArray, - cv::GArray, cv::GArray)>, + cv::GArray, cv::GArray)>, "test.custom.check_tracker_results") { static cv::GOpaqueDesc outMeta(cv::GArrayDesc, cv::GArrayDesc, cv::GArrayDesc, cv::GArrayDesc) { return cv::empty_gopaque_desc(); @@ -140,7 +140,7 @@ GAPI_OCV_KERNEL_ST(OCVCheckTrackerResults, CheckTrackerResults, TrackerReference static void run(const std::vector &in_tr_rcts, const std::vector &in_det_ids, const std::vector &in_tr_ids, - const std::vector &in_tr_statuses, + const std::vector &in_tr_statuses, bool& success, TrackerReference& state) { @@ -237,7 +237,7 @@ TEST(VASObjectTracker, PipelineTest) cv::GArray tracking_rects; cv::GArray tracking_det_ids; cv::GArray tracking_ids; - cv::GArray tracking_statuses; + cv::GArray tracking_statuses; std::tie(tracking_rects, tracking_det_ids, tracking_ids, tracking_statuses) = cv::gapi::ot::track(in, detections, det_ids, delta_time); diff --git a/modules/python/src2/cv2_convert.hpp b/modules/python/src2/cv2_convert.hpp index 96a30e521f1b..8d2c876ada75 100644 --- a/modules/python/src2/cv2_convert.hpp +++ b/modules/python/src2/cv2_convert.hpp @@ -156,6 +156,33 @@ struct PyOpenCV_Converter } }; +// There is conflict between "uint64_t" and "size_t". +// They are the same type on some 32-bit platforms. +template +struct PyOpenCV_Converter + < T, typename std::enable_if< std::is_same::value && !std::is_same::value >::type > +{ + static inline PyObject* from(const uint64_t& value) + { + return PyLong_FromUnsignedLongLong(value); + } + + static inline bool to(PyObject* obj, uint64_t& value, const ArgInfo& info) + { + CV_UNUSED(info); + if(!obj || obj == Py_None) + return true; + if(PyInt_Check(obj)) + value = (uint64_t)PyInt_AsUnsignedLongLongMask(obj); + else if(PyLong_Check(obj)) + value = (uint64_t)PyLong_AsUnsignedLongLong(obj); + else + return false; + return value != (uint64_t)-1 || !PyErr_Occurred(); + } +}; + + // --- uchar template<> bool pyopencv_to(PyObject* obj, uchar& value, const ArgInfo& info); template<> PyObject* pyopencv_from(const uchar& value); diff --git a/modules/python/src2/pycompat.hpp b/modules/python/src2/pycompat.hpp index c8806dc8120c..05a390956268 100644 --- a/modules/python/src2/pycompat.hpp +++ b/modules/python/src2/pycompat.hpp @@ -53,6 +53,7 @@ #define PyInt_CheckExact PyLong_CheckExact #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG +#define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyInt_FromLong PyLong_FromLong #define PyNumber_Int PyNumber_Long