T-API python support implemented:

- cv2.UMat implemented - python thin wrapper for UMat
 - no implicit copy from GPU to Host done, resulting UMat can be passed to next function without overhead
 - cv2.UMat.get() - to fetch data to Host
 - new tests covers: ORB, BFMatcher, goodFeaturesToTrack, calcOpticalFlowPyrLK
This commit is contained in:
Nikolay Polyarniy
2016-02-07 19:04:39 +03:00
parent f9f5313670
commit 46e08d34dd
5 changed files with 262 additions and 21 deletions
+35 -18
View File
@@ -17,7 +17,7 @@ opencv_hdr_list = [
"../../objdetect/include/opencv2/objdetect.hpp",
"../../imgcodecs/include/opencv2/imgcodecs.hpp",
"../../videoio/include/opencv2/videoio.hpp",
"../../highgui/include/opencv2/highgui.hpp"
"../../highgui/include/opencv2/highgui.hpp",
]
"""
@@ -31,7 +31,9 @@ where the list of modifiers is yet another nested list of strings
class CppHeaderParser(object):
def __init__(self):
def __init__(self, generate_umat_decls=False):
self._generate_umat_decls = generate_umat_decls
self.BLOCK_TYPE = 0
self.BLOCK_NAME = 1
self.PROCESS_FLAG = 2
@@ -368,7 +370,7 @@ class CppHeaderParser(object):
print(decl_str)
return decl
def parse_func_decl(self, decl_str):
def parse_func_decl(self, decl_str, use_umat=False):
"""
Parses the function or method declaration in the form:
[([CV_EXPORTS] <rettype>) | CVAPI(rettype)]
@@ -537,28 +539,34 @@ class CppHeaderParser(object):
a = a[:eqpos].strip()
arg_type, arg_name, modlist, argno = self.parse_arg(a, argno)
if self.wrap_mode:
mat = "UMat" if use_umat else "Mat"
# TODO: Vectors should contain UMat, but this is not very easy to support and not very needed
vector_mat = "vector_{}".format("Mat")
vector_mat_template = "vector<{}>".format("Mat")
if arg_type == "InputArray":
arg_type = "Mat"
arg_type = mat
elif arg_type == "InputOutputArray":
arg_type = "Mat"
arg_type = mat
modlist.append("/IO")
elif arg_type == "OutputArray":
arg_type = "Mat"
arg_type = mat
modlist.append("/O")
elif arg_type == "InputArrayOfArrays":
arg_type = "vector_Mat"
arg_type = vector_mat
elif arg_type == "InputOutputArrayOfArrays":
arg_type = "vector_Mat"
arg_type = vector_mat
modlist.append("/IO")
elif arg_type == "OutputArrayOfArrays":
arg_type = "vector_Mat"
arg_type = vector_mat
modlist.append("/O")
defval = self.batch_replace(defval, [("InputArrayOfArrays", "vector<Mat>"),
("InputOutputArrayOfArrays", "vector<Mat>"),
("OutputArrayOfArrays", "vector<Mat>"),
("InputArray", "Mat"),
("InputOutputArray", "Mat"),
("OutputArray", "Mat"),
defval = self.batch_replace(defval, [("InputArrayOfArrays", vector_mat_template),
("InputOutputArrayOfArrays", vector_mat_template),
("OutputArrayOfArrays", vector_mat_template),
("InputArray", mat),
("InputOutputArray", mat),
("OutputArray", mat),
("noArray", arg_type)]).strip()
args.append([arg_type, arg_name, defval, modlist])
npos = arg_start-1
@@ -604,7 +612,7 @@ class CppHeaderParser(object):
n = "cv.Algorithm"
return n
def parse_stmt(self, stmt, end_token):
def parse_stmt(self, stmt, end_token, use_umat=False):
"""
parses the statement (ending with ';' or '}') or a block head (ending with '{')
@@ -696,7 +704,7 @@ class CppHeaderParser(object):
# since we filtered off the other places where '(' can normally occur:
# - code blocks
# - function pointer typedef's
decl = self.parse_func_decl(stmt)
decl = self.parse_func_decl(stmt, use_umat=use_umat)
# we return parse_flag == False to prevent the parser to look inside function/method bodies
# (except for tracking the nested blocks)
return stmt_type, "", False, decl
@@ -839,6 +847,15 @@ class CppHeaderParser(object):
decls.append(d)
else:
decls.append(decl)
if self._generate_umat_decls:
# If function takes as one of arguments Mat or vector<Mat> - we want to create the
# same declaration working with UMat (this is important for T-Api access)
args = decl[3]
has_mat = len(list(filter(lambda x: x[0] in {"Mat", "vector_Mat"}, args))) > 0
if has_mat:
_, _, _, umat_decl = self.parse_stmt(stmt, token, use_umat=True)
decls.append(umat_decl)
if stmt_type == "namespace":
chunks = [block[1] for block in self.block_stack if block[0] == 'namespace'] + [name]
self.namespaces.add('.'.join(chunks))
@@ -878,7 +895,7 @@ class CppHeaderParser(object):
print()
if __name__ == '__main__':
parser = CppHeaderParser()
parser = CppHeaderParser(generate_umat_decls=True)
decls = []
for hname in opencv_hdr_list:
decls += parser.parse(hname)