From 110e80f0ee3170524401b6cd66e1b2590afb9282 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Mon, 11 Mar 2019 11:44:16 +0300 Subject: [PATCH 1/2] Add onRuntimeInitialized for opencv.js --- doc/js_tutorials/js_assets/utils.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/js_tutorials/js_assets/utils.js b/doc/js_tutorials/js_assets/utils.js index 8e56396aba..4d5deb0b51 100644 --- a/doc/js_tutorials/js_assets/utils.js +++ b/doc/js_tutorials/js_assets/utils.js @@ -8,8 +8,19 @@ function Utils(errorOutputId) { // eslint-disable-line no-unused-vars script.setAttribute('async', ''); script.setAttribute('type', 'text/javascript'); script.addEventListener('load', () => { - console.log(cv.getBuildInformation()); - onloadCallback(); + if (cv.getBuildInformation) + { + console.log(cv.getBuildInformation()); + onloadCallback(); + } + else + { + // WASM + cv['onRuntimeInitialized']=()=>{ + console.log(cv.getBuildInformation()); + onloadCallback(); + } + } }); script.addEventListener('error', () => { self.printError('Failed to load ' + OPENCV_URL); From 18ab85efc24cbce712ac01fd6b0ac98e52634379 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Wed, 13 Mar 2019 13:30:04 +0300 Subject: [PATCH 2/2] Backport commits from https://github.com/opencv/opencv/pull/12601 https://github.com/opencv/opencv/pull/12622 --- modules/js/src/embindgen.py | 38 ++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/modules/js/src/embindgen.py b/modules/js/src/embindgen.py index d85a525a8d..ec62bc86d0 100644 --- a/modules/js/src/embindgen.py +++ b/modules/js/src/embindgen.py @@ -70,7 +70,6 @@ from __future__ import print_function import sys, re, os from templates import * -from sets import Set if sys.version_info[0] >= 3: from io import StringIO @@ -120,7 +119,7 @@ objdetect = {'': ['groupRectangles'], 'HOGDescriptor': ['load', 'HOGDescriptor', 'getDefaultPeopleDetector', 'getDaimlerPeopleDetector', 'setSVMDetector', 'detectMultiScale'], 'CascadeClassifier': ['load', 'detectMultiScale2', 'CascadeClassifier', 'detectMultiScale3', 'empty', 'detectMultiScale']} -video = {'': ['CamShift', 'calcOpticalFlowFarneback', 'calcOpticalFlowPyrLK', 'createBackgroundSubtractorMOG2', 'estimateRigidTransform',\ +video = {'': ['CamShift', 'calcOpticalFlowFarneback', 'calcOpticalFlowPyrLK', 'createBackgroundSubtractorMOG2', \ 'findTransformECC', 'meanShift'], 'BackgroundSubtractorMOG2': ['BackgroundSubtractorMOG2', 'apply'], 'BackgroundSubtractor': ['apply', 'getBackgroundImage']} @@ -200,7 +199,7 @@ class ClassInfo(object): self.consts = {} customname = False self.jsfuncs = {} - self.constructor_arg_num = Set() + self.constructor_arg_num = set() self.has_smart_ptr = False @@ -385,14 +384,23 @@ class JSWrapperGenerator(object): return namespace, classes, chunks[-1] def add_enum(self, decl): - name = decl[1] + name = decl[0].rsplit(" ", 1)[1] namespace, classes, val = self.split_decl_name(name) namespace = '.'.join(namespace) - val = '_'.join(classes + [name]) - cname = name.replace('.', '::') ns = self.namespaces.setdefault(namespace, Namespace()) + if len(name) == 0: name = "" + if name.endswith(""): + i = 0 + while True: + i += 1 + candidate_name = name.replace("", "unnamed_%u" % i) + if candidate_name not in ns.enums: + name = candidate_name + break; + cname = name.replace('.', '::') + type_dict[normalize_class_name(name)] = cname if name in ns.enums: - print("Generator warning: constant %s (cname=%s) already exists" \ + print("Generator warning: enum %s (cname=%s) already exists" \ % (name, cname)) # sys.exit(-1) else: @@ -400,6 +408,12 @@ class JSWrapperGenerator(object): for item in decl[3]: ns.enums[name].append(item) + const_decls = decl[3] + + for decl in const_decls: + name = decl[0] + self.add_const(name.replace("const ", "").strip(), decl) + def add_const(self, name, decl): cname = name.replace('.','::') namespace, classes, name = self.split_decl_name(name) @@ -819,7 +833,7 @@ class JSWrapperGenerator(object): continue # Generate bindings for methods - for method_name, method in class_info.methods.iteritems(): + for method_name, method in class_info.methods.items(): if method.cname in ignore_list: continue if not method.name in white_list[method.class_name]: @@ -828,7 +842,8 @@ class JSWrapperGenerator(object): for variant in method.variants: args = [] for arg in variant.args: - args.append(arg.tp) + arg_type = type_dict[arg.tp] if arg.tp in type_dict else arg.tp + args.append(arg_type) # print('Constructor: ', class_info.name, len(variant.args)) args_num = len(variant.args) if args_num in class_info.constructor_arg_num: @@ -849,7 +864,7 @@ class JSWrapperGenerator(object): class_bindings.append(smart_ptr_reg_template.substitute(cname=class_info.cname, name=class_info.name)) # Attach external constructors - # for method_name, method in class_info.ext_constructors.iteritems(): + # for method_name, method in class_info.ext_constructors.items(): # print("ext constructor", method_name) #if class_info.ext_constructors: @@ -857,7 +872,8 @@ class JSWrapperGenerator(object): # Generate bindings for properties for property in class_info.props: - class_bindings.append(class_property_template.substitute(js_name=property.name, cpp_name='::'.join( + _class_property = class_property_enum_template if property.tp in type_dict else class_property_template + class_bindings.append(_class_property.substitute(js_name=property.name, cpp_name='::'.join( [class_info.cname, property.name]))) dv = ''