| __all__ = ['op', 'kernel'] |
|
|
| import sys |
| import cv2 as cv |
|
|
| |
| 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(): |
| |
| |
| 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 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(): |
| |
| |
| 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 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) |
|
|
|
|
| |
| 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.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.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_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' |
| } |
|
|
| |
| 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] |
|
|
| |
| cls.id = op_id |
| cls.on = staticmethod(on) |
| return cls |
|
|
| return op_with_params |
|
|
|
|
| def kernel(op_cls): |
| |
| def kernel_with_params(cls): |
| |
| 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 |
|
|