diff --git a/modules/js/src/core_bindings.cpp b/modules/js/src/core_bindings.cpp index da7bebe297804046b5f4ac0cc7b25359d591fc39..ecb857950466b0a115f5544baf0c7f3cfeead030 100644 --- a/modules/js/src/core_bindings.cpp +++ b/modules/js/src/core_bindings.cpp @@ -74,7 +74,9 @@ using namespace emscripten; using namespace cv; +#ifdef HAVE_OPENCV_DNN using namespace dnn; +#endif namespace binding_utils { @@ -276,13 +278,16 @@ namespace binding_utils float radius; }; +#ifdef HAVE_OPENCV_IMGPROC Circle minEnclosingCircle(const cv::Mat& points) { Circle circle; cv::minEnclosingCircle(points, circle.center, circle.radius); return circle; } +#endif +#ifdef HAVE_OPENCV_VIDEO emscripten::val CamShiftWrapper(const cv::Mat& arg1, Rect& arg2, TermCriteria arg3) { RotatedRect rotatedRect = cv::CamShift(arg1, arg2, arg3); @@ -300,6 +305,7 @@ namespace binding_utils result.call("push", arg2); return result; } +#endif // HAVE_OPENCV_VIDEO std::string getExceptionMsg(const cv::Exception& e) { return e.msg; @@ -538,19 +544,25 @@ EMSCRIPTEN_BINDINGS(binding_utils) function("exceptionFromPtr", &binding_utils::exceptionFromPtr, allow_raw_pointers()); +#ifdef HAVE_OPENCV_IMGPROC function("minEnclosingCircle", select_overload(&binding_utils::minEnclosingCircle)); +#endif function("minMaxLoc", select_overload(&binding_utils::minMaxLoc)); function("minMaxLoc", select_overload(&binding_utils::minMaxLoc_1)); +#ifdef HAVE_OPENCV_IMGPROC function("morphologyDefaultBorderValue", &cv::morphologyDefaultBorderValue); +#endif function("CV_MAT_DEPTH", &binding_utils::cvMatDepth); +#ifdef HAVE_OPENCV_VIDEO function("CamShift", select_overload(&binding_utils::CamShiftWrapper)); function("meanShift", select_overload(&binding_utils::meanShiftWrapper)); +#endif function("getBuildInformation", &binding_utils::getBuildInformation); diff --git a/modules/js/src/embindgen.py b/modules/js/src/embindgen.py index caa8d6067e24d8b9a365e2cee22bd0cbc27c409e..d85a525a8d415f53775531d526e4e3b34750f436 100644 --- a/modules/js/src/embindgen.py +++ b/modules/js/src/embindgen.py @@ -141,7 +141,7 @@ features2d = {'Feature2D': ['detect', 'compute', 'detectAndCompute', 'descriptor 'AKAZE': ['create', 'setDescriptorType', 'getDescriptorType', 'setDescriptorSize', 'getDescriptorSize', 'setDescriptorChannels', 'getDescriptorChannels', 'setThreshold', 'getThreshold', 'setNOctaves', 'getNOctaves', 'setNOctaveLayers', 'getNOctaveLayers', 'setDiffusivity', 'getDiffusivity', 'getDefaultName'], 'DescriptorMatcher': ['add', 'clear', 'empty', 'isMaskSupported', 'train', 'match', 'knnMatch', 'radiusMatch', 'clone', 'create'], 'BFMatcher': ['isMaskSupported', 'create'], - '': ['FAST', 'AGAST', 'drawKeypoints', 'drawMatches']} + '': ['drawKeypoints', 'drawMatches']} def makeWhiteList(module_list): wl = {} diff --git a/modules/js/test/test_features2d.js b/modules/js/test/test_features2d.js new file mode 100644 index 0000000000000000000000000000000000000000..21982f65f85ae82720a8e17c78f7345694ca5115 --- /dev/null +++ b/modules/js/test/test_features2d.js @@ -0,0 +1,82 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +if (typeof module !== 'undefined' && module.exports) { + // The envrionment is Node.js + var cv = require('./opencv.js'); // eslint-disable-line no-var +} + +function generateTestFrame(width, height) { + let w = width || 200; + let h = height || 200; + let img = new cv.Mat(h, w, cv.CV_8UC1, new cv.Scalar(0, 0, 0, 0)); + let s = new cv.Scalar(255, 255, 255, 255); + let s128 = new cv.Scalar(128, 128, 128, 128); + let rect = new cv.Rect(w / 4, h / 4, w / 2, h / 2); + img.roi(rect).setTo(s); + img.roi(new cv.Rect(w / 2 - w / 8, h / 2 - h / 8, w / 4, h / 4)).setTo(s128); + cv.rectangle(img, new cv.Point(w / 8, h / 8), new cv.Point(w - w / 8, h - h / 8), s, 5); + cv.rectangle(img, new cv.Point(w / 5, h / 5), new cv.Point(w - w / 5, h - h / 5), s128, 3); + cv.line(img, new cv.Point(-w, 0), new cv.Point(w / 2, h / 2), s128, 5); + cv.line(img, new cv.Point(2*w, 0), new cv.Point(w / 2, h / 2), s, 5); + return img; +} + +QUnit.module('Features2D', {}); +QUnit.test('Detectors', function(assert) { + let image = generateTestFrame(); + + let kp = new cv.KeyPointVector(); + + let orb = new cv.ORB(); + orb.detect(image, kp); + assert.equal(kp.size(), 67, 'ORB'); + + let mser = new cv.MSER(); + mser.detect(image, kp); + assert.equal(kp.size(), 7, 'MSER'); + + let brisk = new cv.BRISK(); + brisk.detect(image, kp); + assert.equal(kp.size(), 191, 'BRISK'); + + let ffd = new cv.FastFeatureDetector(); + ffd.detect(image, kp); + assert.equal(kp.size(), 12, 'FastFeatureDetector'); + + let afd = new cv.AgastFeatureDetector(); + afd.detect(image, kp); + assert.equal(kp.size(), 67, 'AgastFeatureDetector'); + + let gftt = new cv.GFTTDetector(); + gftt.detect(image, kp); + assert.equal(kp.size(), 168, 'GFTTDetector'); + + let kaze = new cv.KAZE(); + kaze.detect(image, kp); + assert.equal(kp.size(), 159, 'KAZE'); + + let akaze = new cv.AKAZE(); + akaze.detect(image, kp); + assert.equal(kp.size(), 52, 'AKAZE'); +}); + +QUnit.test('BFMatcher', function(assert) { + // Generate key points. + let image = generateTestFrame(); + + let kp = new cv.KeyPointVector(); + let descriptors = new cv.Mat(); + let orb = new cv.ORB(); + orb.detectAndCompute(image, new cv.Mat(), kp, descriptors); + + assert.equal(kp.size(), 67); + + // Run a matcher. + let dm = new cv.DMatchVector(); + let matcher = new cv.BFMatcher(); + matcher.match(descriptors, descriptors, dm); + + assert.equal(dm.size(), 67); +}); diff --git a/modules/js/test/tests.html b/modules/js/test/tests.html index 2ed5325c5b0ab0a863105a57b389cc3f52addda4..c476dbb3b27c5391c90f61b8b1e7b6c674049787 100644 --- a/modules/js/test/tests.html +++ b/modules/js/test/tests.html @@ -28,6 +28,7 @@ + - - - diff --git a/modules/js/test/tests.js b/modules/js/test/tests.js index 4ddfa3b9d0be8a6f72bbb85f753a301d5297eab2..a0adf964a380654b7a6b7ae4dfa360bfec8fb228 100644 --- a/modules/js/test/tests.js +++ b/modules/js/test/tests.js @@ -45,7 +45,7 @@ testrunner.run( { code: 'opencv.js', tests: ['test_mat.js', 'test_utils.js', 'test_imgproc.js', - 'test_objdetect.js', 'test_video.js'], + 'test_objdetect.js', 'test_video.js', 'test_features2d.js'], }, function(err, report) { console.log(report.failed + ' failed, ' + report.passed + ' passed'); diff --git a/platforms/js/build_js.py b/platforms/js/build_js.py index e71fa924775bbc00e996d5496da33b6bcfd90dbe..883cac2223ec470a644b7179a93731895aca7d33 100644 --- a/platforms/js/build_js.py +++ b/platforms/js/build_js.py @@ -112,6 +112,7 @@ class Builder: "-DWITH_GPHOTO2=OFF", "-DWITH_LAPACK=OFF", "-DWITH_ITT=OFF", + "-DWITH_QUIRC=OFF", "-DBUILD_ZLIB=ON", "-DBUILD_opencv_apps=OFF", "-DBUILD_opencv_calib3d=ON", # No bindings provided. This module is used as a dependency for other modules. @@ -128,9 +129,11 @@ class Builder: "-DBUILD_opencv_superres=OFF", "-DBUILD_opencv_stitching=OFF", "-DBUILD_opencv_java=OFF", + "-DBUILD_opencv_java_bindings_generator=OFF", "-DBUILD_opencv_js=ON", "-DBUILD_opencv_python2=OFF", "-DBUILD_opencv_python3=OFF", + "-DBUILD_opencv_python_bindings_generator=OFF", "-DBUILD_EXAMPLES=OFF", "-DBUILD_PACKAGE=OFF", "-DBUILD_TESTS=OFF",