diff --git a/modules/js/generator/embindgen.py b/modules/js/generator/embindgen.py index dee778a9de..d44e672823 100644 --- a/modules/js/generator/embindgen.py +++ b/modules/js/generator/embindgen.py @@ -236,6 +236,11 @@ class ArgInfo(object): self.tp = "std::vector&" elif self.inputarg: self.tp = "const std::vector&" + if self.tp == "vector_string": + if self.outputarg: + self.tp = "std::vector&" + elif self.inputarg: + self.tp = "const std::vector&" self.tp = handle_vector(self.tp).strip() if self.const: self.tp = "const " + self.tp @@ -319,19 +324,31 @@ class JSWrapperGenerator(object): sys.exit(-1) self.classes[class_info.name] = class_info - if class_info.bases: - chunks = class_info.bases[0].split('::') - base = '_'.join(chunks) - while base not in self.classes and len(chunks) > 1: - del chunks[-2] + def resolve_class_inheritance(self): + new_classes = {} + for name, class_info in self.classes.items(): + + if not hasattr(class_info, 'bases'): + new_classes[name] = class_info + continue # not class + + if class_info.bases: + chunks = class_info.bases[0].split('::') base = '_'.join(chunks) - if base not in self.classes: - print("Generator error: unable to resolve base %s for %s" - % (class_info.bases[0], class_info.name)) - sys.exit(-1) - else: - class_info.bases[0] = "::".join(chunks) - class_info.isalgorithm |= self.classes[base].isalgorithm + while base not in self.classes and len(chunks) > 1: + del chunks[-2] + base = '_'.join(chunks) + if base not in self.classes: + print("Generator error: unable to resolve base %s for %s" + % (class_info.bases[0], class_info.name)) + sys.exit(-1) + else: + class_info.bases[0] = "::".join(chunks) + class_info.isalgorithm |= self.classes[base].isalgorithm + + new_classes[name] = class_info + + self.classes = new_classes def split_decl_name(self, name): chunks = name.split('.') @@ -759,6 +776,8 @@ class JSWrapperGenerator(object): else: # class/global function self.add_func(decl) + self.resolve_class_inheritance() + # step 2: generate bindings # Global functions for ns_name, ns in sorted(self.namespaces.items()): diff --git a/platforms/js/opencv_js.config.py b/platforms/js/opencv_js.config.py index 65a1c95d52..86a6984fd1 100644 --- a/platforms/js/opencv_js.config.py +++ b/platforms/js/opencv_js.config.py @@ -113,8 +113,8 @@ objdetect = {'': ['groupRectangles', 'getPredefinedDictionary', 'extendDictionar 'drawDetectedDiamonds'], 'HOGDescriptor': ['load', 'HOGDescriptor', 'getDefaultPeopleDetector', 'getDaimlerPeopleDetector', 'setSVMDetector', 'detectMultiScale'], 'CascadeClassifier': ['load', 'detectMultiScale2', 'CascadeClassifier', 'detectMultiScale3', 'empty', 'detectMultiScale'], - 'QRCodeDetector': ['QRCodeDetector', 'decode', 'decodeCurved', 'detect', 'detectAndDecode', 'detectMulti', 'setEpsX', 'setEpsY'], - # aruco namespace + 'GraphicalCodeDetector': ['decode', 'detect', 'detectAndDecode', 'detectMulti', 'decodeMulti', 'detectAndDecodeMulti'], + 'QRCodeDetector': ['QRCodeDetector', 'decode', 'detect', 'detectAndDecode', 'detectMulti', 'decodeMulti', 'detectAndDecodeMulti', 'decodeCurved', 'detectAndDecodeCurved', 'setEpsX', 'setEpsY'], 'aruco_PredefinedDictionaryType': [], 'aruco_Dictionary': ['Dictionary', 'getDistanceToId', 'generateImageMarker', 'getByteListFromBits', 'getBitsFromByteList'], 'aruco_Board': ['Board', 'matchImagePoints', 'generateImage'],