OpenCV.js官網:https://docs.opencv.org/3.4/d5/d10/tutorial_js_root.html
TensorFlow.js官網:https://www.tensorflow.org/js
Ref: WebAssembly完全入門——了解wasm的前世今身
How to compile your own OpenCV.js.
效率初探
一、tf.js效率初探
SSD MobileNet
Ref: In-Browser Object Detection Using Tensorflow.js
手機打開1:https://nanonets.com/object-detection-with-tensorflowjs-demo/
手機打開2:Build a Realtime Object Detection Web App in 30 Minutes
[Less than 10 fps]
MobileNet
Ref: https://teachablemachine.withgoogle.com/train/image [Google demo]
二、OpenCV.js效率初探
Optical Flow
網頁展示:https://docs.opencv.org/master/db/d7f/tutorial_js_lucas_kanade.html
結合OpenCVJS html測試一下;已測,real time 沒有問題。
Lucas-Kanade Optical Flow Example
通過前后兩幀de對比,得到跟蹤的結果。
為何是:ShiTomasi corner detection?
OpenCV提供了函數cv.goodFeaturesToTrack()。這個函數可以幫助我們使用Shi-Tomasi方法獲取圖像中的N個最好的角點。

let video = document.getElementById('videoInput'); let cap = new cv.VideoCapture(video); // parameters for ShiTomasi corner detection let [maxCorners, qualityLevel, minDistance, blockSize] = [30, 0.3, 7, 7]; // parameters for lucas kanade optical flow let winSize = new cv.Size(15, 15); let maxLevel = 2; let criteria = new cv.TermCriteria(cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03); // create some random colors let color = []; for (let i = 0; i < maxCorners; i++) { color.push(new cv.Scalar(parseInt(Math.random()*255), parseInt(Math.random()*255), parseInt(Math.random()*255), 255)); } // take first frame and find corners in it let oldFrame = new cv.Mat(video.height, video.width, cv.CV_8UC4); cap.read(oldFrame);
let oldGray = new cv.Mat(); cv.cvtColor(oldFrame, oldGray, cv.COLOR_RGB2GRAY); let p0 = new cv.Mat(); let none = new cv.Mat(); cv.goodFeaturesToTrack(oldGray, p0, maxCorners, qualityLevel, minDistance, none, blockSize); // Create a mask image for drawing purposes let zeroEle = new cv.Scalar(0, 0, 0, 255); let mask = new cv.Mat(oldFrame.rows, oldFrame.cols, oldFrame.type(), zeroEle); let frame = new cv.Mat(video.height, video.width, cv.CV_8UC4); let frameGray = new cv.Mat(); let p1 = new cv.Mat(); let st = new cv.Mat(); let err = new cv.Mat(); const FPS = 30; function processVideo() { try { if (!streaming) { // clean and stop. frame.delete(); oldGray.delete(); p0.delete(); p1.delete(); err.delete(); mask.delete(); return; } let begin = Date.now(); // start processing. cap.read(frame); cv.cvtColor(frame, frameGray, cv.COLOR_RGBA2GRAY); // calculate optical flow cv.calcOpticalFlowPyrLK(oldGray, frameGray, p0, p1, st, err, winSize, maxLevel, criteria); // select good points let goodNew = []; let goodOld = []; for (let i = 0; i < st.rows; i++) { if (st.data[i] === 1) { goodNew.push(new cv.Point(p1.data32F[i*2], p1.data32F[i*2+1])); goodOld.push(new cv.Point(p0.data32F[i*2], p0.data32F[i*2+1])); } }
// -------------------------------------------------------------------- // draw the tracks for (let i = 0; i < goodNew.length; i++) { cv.line(mask, goodNew[i], goodOld[i], color[i], 2); cv.circle(frame, goodNew[i], 5, color[i], -1); } cv.add(frame, mask, frame); cv.imshow('canvasOutput', frame); // now update the previous frame and previous points frameGray.copyTo(oldGray); p0.delete(); p0 = null; p0 = new cv.Mat(goodNew.length, 1, cv.CV_32FC2); for (let i = 0; i < goodNew.length; i++) { p0.data32F[i*2] = goodNew[i].x; p0.data32F[i*2+1] = goodNew[i].y; } // schedule the next one. let delay = 1000/FPS - (Date.now() - begin); setTimeout(processVideo, delay); } catch (err) { utils.printError(err); } }; // schedule the first one. setTimeout(processVideo, 0);
Compile OpenCV.js
一、官網編譯 OpenCV by WebAssembly
Ref: 用OpenCV在瀏覽器進行人臉檢測,編譯過程。
Emscripten可以把C/C++程序編譯成asm.js,然后通過binaryen的asm2wasm轉成WebAssembly。
我們只需要其中的opencv.js
和opencv_js.wasm
,可以復制到其他地方使用,而opencv_js.js
是中間生成的asm.js,可以忽略。
Ref: opencv.js編譯

sudo apt update sudo apt upgrade sudo apt install python2.7 python-pip python-numpy sudo apt install cmake sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 10 sudo update-alternatives --list python sudo update-alternatives --config python sudo update-alternatives --remove python /usr/bin/python2.7 git clone https://github.com/emscripten-core/emsdk.git cd emsdk git pull ./emsdk install latest ./emsdk activate latest ./emsdk list ./emsdk install sdk-1.38.33-64bit fastcomp-clang-e1.38.31-64bit emscripten-1.38.31 ./emsdk activate sdk-1.38.33-64bit fastcomp-clang-e1.38.31-64bit emscripten-1.38.31 source ./emsdk_env.sh cd emscripten/1.38.31/ ./emcc
-
Build OpenCV.js
Ref: https://docs.opencv.org/4.2.0/d4/da1/tutorial_js_setup.html
開始編譯:
$ sudo python ./platforms/js/build_js.py build_js --emscripten_dir /usr/local/emsdk/upstream/emscripten

opencv$ sudo python ./platforms/js/build_js.py build_js --emscripten_dir /usr/local/emsdk/upstream/emscripten Args: Namespace(build_dir='build_js', build_doc=False, build_flags=None, build_perf=False, build_test=False, build_wasm=False, build_wasm_intrin_test=False, clean_build_dir=False, cmake_option=None, config='/home/share/Laava/AR/WEB/03_my_opencvjs/opencv/platforms/js/opencv_js.config.py', config_only=False, disable_wasm=False, emscripten_dir='/usr/local/emsdk/upstream/emscripten', enable_exception=False, opencv_dir='/home/share/Laava/AR/WEB/03_my_opencvjs/opencv', simd=False, skip_config=False, threads=False) Check dir /home/share/Laava/AR/WEB/03_my_opencvjs/opencv/build_js (create: True, clean: False) Check dir /home/share/Laava/AR/WEB/03_my_opencvjs/opencv (create: False, clean: False) Check dir /usr/local/emsdk/upstream/emscripten (create: False, clean: False) ===== ===== Config OpenCV.js build for default target ===== Executing: ['cmake', '-DENABLE_PIC=FALSE', '-DCMAKE_BUILD_TYPE=Release', "-DCMAKE_TOOLCHAIN_FILE='/usr/local/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake'", "-DCPU_BASELINE=''", "-DCPU_DISPATCH=''", '-DCV_TRACE=OFF', '-DBUILD_SHARED_LIBS=OFF', '-DWITH_1394=OFF', '-DWITH_ADE=OFF', '-DWITH_VTK=OFF', '-DWITH_EIGEN=OFF', '-DWITH_FFMPEG=OFF', '-DWITH_GSTREAMER=OFF', '-DWITH_GTK=OFF', '-DWITH_GTK_2_X=OFF', '-DWITH_IPP=OFF', '-DWITH_JASPER=OFF', '-DWITH_JPEG=OFF', '-DWITH_WEBP=OFF', '-DWITH_OPENEXR=OFF', '-DWITH_OPENGL=OFF', '-DWITH_OPENVX=OFF', '-DWITH_OPENNI=OFF', '-DWITH_OPENNI2=OFF', '-DWITH_PNG=OFF', '-DWITH_TBB=OFF', '-DWITH_TIFF=OFF', '-DWITH_V4L=OFF', '-DWITH_OPENCL=OFF', '-DWITH_OPENCL_SVM=OFF', '-DWITH_OPENCLAMDFFT=OFF', '-DWITH_OPENCLAMDBLAS=OFF', '-DWITH_GPHOTO2=OFF', '-DWITH_LAPACK=OFF', '-DWITH_ITT=OFF', '-DWITH_QUIRC=OFF', '-DBUILD_ZLIB=ON', '-DBUILD_opencv_apps=OFF', '-DBUILD_opencv_calib3d=ON', '-DBUILD_opencv_dnn=ON', '-DBUILD_opencv_features2d=ON', '-DBUILD_opencv_flann=ON', '-DBUILD_opencv_gapi=OFF', '-DBUILD_opencv_ml=OFF', '-DBUILD_opencv_photo=ON', '-DBUILD_opencv_imgcodecs=OFF', '-DBUILD_opencv_shape=OFF', '-DBUILD_opencv_videoio=OFF', '-DBUILD_opencv_videostab=OFF', '-DBUILD_opencv_highgui=OFF', '-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', '-DBUILD_PERF_TESTS=OFF', '-DBUILD_DOCS=OFF', '-DWITH_PTHREADS_PF=OFF', '-DCV_ENABLE_INTRINSICS=OFF', '-DBUILD_WASM_INTRIN_TESTS=OFF', "-DCMAKE_C_FLAGS='-s USE_PTHREADS=0 '", "-DCMAKE_CXX_FLAGS='-s USE_PTHREADS=0 '", '/home/share/Laava/AR/WEB/03_my_opencvjs/opencv'] Re-run cmake no build system arguments -- OpenCV: system-specific configuration file is not found: 'Emscripten' -- Detected processor: x86 -- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.17", minimum required is "2.7") -- Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) (Required is at least version "2.7") -- Cannot probe for Python/Numpy support (because we are cross-compiling OpenCV) -- If you want to enable Python/Numpy support, set the following variables: -- PYTHON2_INCLUDE_PATH -- PYTHON2_LIBRARIES (optional on Unix-like systems) -- PYTHON2_NUMPY_INCLUDE_DIRS -- PYTHON3_INCLUDE_PATH -- PYTHON3_LIBRARIES (optional on Unix-like systems) -- PYTHON3_NUMPY_INCLUDE_DIRS -- Found PythonInterp: /usr/bin/python3 (found suitable version "3.6.9", minimum required is "3.2") -- Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) (Required is at least version "3.6") -- Cannot probe for Python/Numpy support (because we are cross-compiling OpenCV) -- If you want to enable Python/Numpy support, set the following variables: -- PYTHON2_INCLUDE_PATH -- PYTHON2_LIBRARIES (optional on Unix-like systems) -- PYTHON2_NUMPY_INCLUDE_DIRS -- PYTHON3_INCLUDE_PATH -- PYTHON3_LIBRARIES (optional on Unix-like systems) -- PYTHON3_NUMPY_INCLUDE_DIRS -- Looking for ccache - not found -- Performing Test HAVE_CXX_FSIGNED_CHAR -- Performing Test HAVE_CXX_FSIGNED_CHAR - Success -- Performing Test HAVE_C_FSIGNED_CHAR -- Performing Test HAVE_C_FSIGNED_CHAR - Success -- Performing Test HAVE_CXX_W -- Performing Test HAVE_CXX_W - Success -- Performing Test HAVE_C_W -- Performing Test HAVE_C_W - Success -- Performing Test HAVE_CXX_WALL -- Performing Test HAVE_CXX_WALL - Success -- Performing Test HAVE_C_WALL -- Performing Test HAVE_C_WALL - Success -- Performing Test HAVE_CXX_WERROR_RETURN_TYPE -- Performing Test HAVE_CXX_WERROR_RETURN_TYPE - Success -- Performing Test HAVE_C_WERROR_RETURN_TYPE -- Performing Test HAVE_C_WERROR_RETURN_TYPE - Success -- Performing Test HAVE_CXX_WERROR_NON_VIRTUAL_DTOR -- Performing Test HAVE_CXX_WERROR_NON_VIRTUAL_DTOR - Success -- Performing Test HAVE_C_WERROR_NON_VIRTUAL_DTOR -- Performing Test HAVE_C_WERROR_NON_VIRTUAL_DTOR - Success -- Performing Test HAVE_CXX_WERROR_ADDRESS -- Performing Test HAVE_CXX_WERROR_ADDRESS - Success -- Performing Test HAVE_C_WERROR_ADDRESS -- Performing Test HAVE_C_WERROR_ADDRESS - Success -- Performing Test HAVE_CXX_WERROR_SEQUENCE_POINT -- Performing Test HAVE_CXX_WERROR_SEQUENCE_POINT - Success -- Performing Test HAVE_C_WERROR_SEQUENCE_POINT -- Performing Test HAVE_C_WERROR_SEQUENCE_POINT - Success -- Performing Test HAVE_CXX_WFORMAT -- Performing Test HAVE_CXX_WFORMAT - Success -- Performing Test HAVE_C_WFORMAT -- Performing Test HAVE_C_WFORMAT - Success -- Performing Test HAVE_CXX_WERROR_FORMAT_SECURITY -- Performing Test HAVE_CXX_WERROR_FORMAT_SECURITY - Success -- Performing Test HAVE_C_WERROR_FORMAT_SECURITY -- Performing Test HAVE_C_WERROR_FORMAT_SECURITY - Success -- Performing Test HAVE_CXX_WMISSING_DECLARATIONS -- Performing Test HAVE_CXX_WMISSING_DECLARATIONS - Success -- Performing Test HAVE_C_WMISSING_DECLARATIONS -- Performing Test HAVE_C_WMISSING_DECLARATIONS - Success -- Performing Test HAVE_CXX_WMISSING_PROTOTYPES -- Performing Test HAVE_CXX_WMISSING_PROTOTYPES - Success -- Performing Test HAVE_C_WMISSING_PROTOTYPES -- Performing Test HAVE_C_WMISSING_PROTOTYPES - Success -- Performing Test HAVE_CXX_WSTRICT_PROTOTYPES -- Performing Test HAVE_CXX_WSTRICT_PROTOTYPES - Success -- Performing Test HAVE_C_WSTRICT_PROTOTYPES -- Performing Test HAVE_C_WSTRICT_PROTOTYPES - Success -- Performing Test HAVE_CXX_WUNDEF -- Performing Test HAVE_CXX_WUNDEF - Success -- Performing Test HAVE_C_WUNDEF -- Performing Test HAVE_C_WUNDEF - Success -- Performing Test HAVE_CXX_WINIT_SELF -- Performing Test HAVE_CXX_WINIT_SELF - Success -- Performing Test HAVE_C_WINIT_SELF -- Performing Test HAVE_C_WINIT_SELF - Success -- Performing Test HAVE_CXX_WPOINTER_ARITH -- Performing Test HAVE_CXX_WPOINTER_ARITH - Success -- Performing Test HAVE_C_WPOINTER_ARITH -- Performing Test HAVE_C_WPOINTER_ARITH - Success -- Performing Test HAVE_CXX_WSHADOW -- Performing Test HAVE_CXX_WSHADOW - Success -- Performing Test HAVE_C_WSHADOW -- Performing Test HAVE_C_WSHADOW - Success -- Performing Test HAVE_CXX_WSIGN_PROMO -- Performing Test HAVE_CXX_WSIGN_PROMO - Success -- Performing Test HAVE_C_WSIGN_PROMO -- Performing Test HAVE_C_WSIGN_PROMO - Success -- Performing Test HAVE_CXX_WUNINITIALIZED -- Performing Test HAVE_CXX_WUNINITIALIZED - Success -- Performing Test HAVE_C_WUNINITIALIZED -- Performing Test HAVE_C_WUNINITIALIZED - Success -- Performing Test HAVE_CXX_WINCONSISTENT_MISSING_OVERRIDE -- Performing Test HAVE_CXX_WINCONSISTENT_MISSING_OVERRIDE - Success -- Performing Test HAVE_C_WINCONSISTENT_MISSING_OVERRIDE -- Performing Test HAVE_C_WINCONSISTENT_MISSING_OVERRIDE - Success -- Performing Test HAVE_CXX_WNO_DELETE_NON_VIRTUAL_DTOR -- Performing Test HAVE_CXX_WNO_DELETE_NON_VIRTUAL_DTOR - Success -- Performing Test HAVE_C_WNO_DELETE_NON_VIRTUAL_DTOR -- Performing Test HAVE_C_WNO_DELETE_NON_VIRTUAL_DTOR - Success -- Performing Test HAVE_CXX_WNO_UNNAMED_TYPE_TEMPLATE_ARGS -- Performing Test HAVE_CXX_WNO_UNNAMED_TYPE_TEMPLATE_ARGS - Success -- Performing Test HAVE_C_WNO_UNNAMED_TYPE_TEMPLATE_ARGS -- Performing Test HAVE_C_WNO_UNNAMED_TYPE_TEMPLATE_ARGS - Success -- Performing Test HAVE_CXX_WNO_COMMENT -- Performing Test HAVE_CXX_WNO_COMMENT - Success -- Performing Test HAVE_C_WNO_COMMENT -- Performing Test HAVE_C_WNO_COMMENT - Success -- Performing Test HAVE_CXX_FDIAGNOSTICS_SHOW_OPTION -- Performing Test HAVE_CXX_FDIAGNOSTICS_SHOW_OPTION - Success -- Performing Test HAVE_C_FDIAGNOSTICS_SHOW_OPTION -- Performing Test HAVE_C_FDIAGNOSTICS_SHOW_OPTION - Success -- Performing Test HAVE_CXX_PTHREAD -- Performing Test HAVE_CXX_PTHREAD - Failed -- Performing Test HAVE_C_PTHREAD -- Performing Test HAVE_C_PTHREAD - Failed -- Performing Test HAVE_CXX_QUNUSED_ARGUMENTS -- Performing Test HAVE_CXX_QUNUSED_ARGUMENTS - Success -- Performing Test HAVE_C_QUNUSED_ARGUMENTS -- Performing Test HAVE_C_QUNUSED_ARGUMENTS - Success -- Performing Test HAVE_CXX_FFUNCTION_SECTIONS -- Performing Test HAVE_CXX_FFUNCTION_SECTIONS - Success -- Performing Test HAVE_C_FFUNCTION_SECTIONS -- Performing Test HAVE_C_FFUNCTION_SECTIONS - Success -- Performing Test HAVE_CXX_FDATA_SECTIONS -- Performing Test HAVE_CXX_FDATA_SECTIONS - Success -- Performing Test HAVE_C_FDATA_SECTIONS -- Performing Test HAVE_C_FDATA_SECTIONS - Success -- Performing Test HAVE_CPU_BASELINE_FLAGS -- Performing Test HAVE_CPU_BASELINE_FLAGS - Success -- Performing Test HAVE_CXX_MFPMATH_387 -- Performing Test HAVE_CXX_MFPMATH_387 - Failed -- Performing Test HAVE_C_MFPMATH_387 -- Performing Test HAVE_C_MFPMATH_387 - Failed -- Performing Test HAVE_CXX_FVISIBILITY_HIDDEN -- Performing Test HAVE_CXX_FVISIBILITY_HIDDEN - Success -- Performing Test HAVE_C_FVISIBILITY_HIDDEN -- Performing Test HAVE_C_FVISIBILITY_HIDDEN - Success -- Performing Test HAVE_CXX_FVISIBILITY_INLINES_HIDDEN -- Performing Test HAVE_CXX_FVISIBILITY_INLINES_HIDDEN - Success -- Performing Test HAVE_C_FVISIBILITY_INLINES_HIDDEN -- Performing Test HAVE_C_FVISIBILITY_INLINES_HIDDEN - Success -- OpenCV disables pkg-config to avoid using of host libraries. Consider using PKG_CONFIG_LIBDIR to specify target SYSROOT -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for posix_memalign -- Looking for posix_memalign - found -- Looking for malloc.h -- Looking for malloc.h - found -- Looking for memalign -- Looking for memalign - found -- Looking for fseeko -- Looking for fseeko - found -- Looking for unistd.h -- Looking for unistd.h - found -- Looking for sys/types.h -- Looking for sys/types.h - found -- Looking for stdint.h -- Looking for stdint.h - found -- Looking for stddef.h -- Looking for stddef.h - found -- Check size of off64_t -- Check size of off64_t - failed -- Performing Test HAVE_C_WNO_SHORTEN_64_TO_32 -- Performing Test HAVE_C_WNO_SHORTEN_64_TO_32 - Success -- Performing Test HAVE_C_WNO_ATTRIBUTES -- Performing Test HAVE_C_WNO_ATTRIBUTES - Success -- Performing Test HAVE_C_WNO_STRICT_PROTOTYPES -- Performing Test HAVE_C_WNO_STRICT_PROTOTYPES - Success -- Performing Test HAVE_C_WNO_MISSING_PROTOTYPES -- Performing Test HAVE_C_WNO_MISSING_PROTOTYPES - Success -- Performing Test HAVE_C_WNO_MISSING_DECLARATIONS -- Performing Test HAVE_C_WNO_MISSING_DECLARATIONS - Success -- Performing Test HAVE_C_WNO_SHIFT_NEGATIVE_VALUE -- Performing Test HAVE_C_WNO_SHIFT_NEGATIVE_VALUE - Success -- Performing Test HAVE_C_WNO_UNDEF -- Performing Test HAVE_C_WNO_UNDEF - Success -- Performing Test HAVE_C_WNO_IMPLICIT_FALLTHROUGH -- Performing Test HAVE_C_WNO_IMPLICIT_FALLTHROUGH - Success -- Performing Test HAVE_CXX_WNO_DEPRECATED -- Performing Test HAVE_CXX_WNO_DEPRECATED - Success -- Performing Test HAVE_CXX_WNO_MISSING_PROTOTYPES -- Performing Test HAVE_CXX_WNO_MISSING_PROTOTYPES - Success -- Performing Test HAVE_CXX_WNO_MISSING_DECLARATIONS -- Performing Test HAVE_CXX_WNO_MISSING_DECLARATIONS - Success -- Performing Test HAVE_CXX_WNO_SHADOW -- Performing Test HAVE_CXX_WNO_SHADOW - Success -- Performing Test HAVE_CXX_WNO_UNUSED_PARAMETER -- Performing Test HAVE_CXX_WNO_UNUSED_PARAMETER - Success -- Performing Test HAVE_CXX_WNO_UNUSED_LOCAL_TYPEDEFS -- Performing Test HAVE_CXX_WNO_UNUSED_LOCAL_TYPEDEFS - Success -- Performing Test HAVE_CXX_WNO_SIGN_COMPARE -- Performing Test HAVE_CXX_WNO_SIGN_COMPARE - Success -- Performing Test HAVE_CXX_WNO_SIGN_PROMO -- Performing Test HAVE_CXX_WNO_SIGN_PROMO - Success -- Performing Test HAVE_CXX_WNO_UNDEF -- Performing Test HAVE_CXX_WNO_UNDEF - Success -- Performing Test HAVE_CXX_WNO_TAUTOLOGICAL_UNDEFINED_COMPARE -- Performing Test HAVE_CXX_WNO_TAUTOLOGICAL_UNDEFINED_COMPARE - Success -- Performing Test HAVE_CXX_WNO_IGNORED_QUALIFIERS -- Performing Test HAVE_CXX_WNO_IGNORED_QUALIFIERS - Success -- Performing Test HAVE_CXX_WNO_EXTRA -- Performing Test HAVE_CXX_WNO_EXTRA - Success -- Performing Test HAVE_CXX_WNO_UNUSED_FUNCTION -- Performing Test HAVE_CXX_WNO_UNUSED_FUNCTION - Success -- Performing Test HAVE_CXX_WNO_UNUSED_CONST_VARIABLE -- Performing Test HAVE_CXX_WNO_UNUSED_CONST_VARIABLE - Success -- Performing Test HAVE_CXX_WNO_SHORTEN_64_TO_32 -- Performing Test HAVE_CXX_WNO_SHORTEN_64_TO_32 - Success -- Performing Test HAVE_CXX_WNO_INVALID_OFFSETOF -- Performing Test HAVE_CXX_WNO_INVALID_OFFSETOF - Success -- Performing Test HAVE_CXX_WNO_ENUM_COMPARE_SWITCH -- Performing Test HAVE_CXX_WNO_ENUM_COMPARE_SWITCH - Success -- Performing Test HAVE_CXX_WNO_SUGGEST_OVERRIDE -- Performing Test HAVE_CXX_WNO_SUGGEST_OVERRIDE - Failed -- Performing Test HAVE_CXX_WNO_INCONSISTENT_MISSING_OVERRIDE -- Performing Test HAVE_CXX_WNO_INCONSISTENT_MISSING_OVERRIDE - Success -- Performing Test HAVE_CXX_WNO_IMPLICIT_FALLTHROUGH -- Performing Test HAVE_CXX_WNO_IMPLICIT_FALLTHROUGH - Success -- Performing Test HAVE_CXX_WNO_ARRAY_BOUNDS -- Performing Test HAVE_CXX_WNO_ARRAY_BOUNDS - Success -- OpenCV Python: during development append to PYTHONPATH: /home/share/Laava/AR/WEB/03_my_opencvjs/opencv/build_js/python_loader -- Excluding from source files list (optimization is disabled): modules/imgproc/src/corner.avx.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/imgwarp.avx2.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/imgwarp.sse4_1.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/resize.avx2.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/resize.sse4_1.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/sumpixels.avx512_skx.cpp -- Registering hook 'INIT_MODULE_SOURCES_opencv_dnn': /home/share/Laava/AR/WEB/03_my_opencvjs/opencv/modules/dnn/cmake/hooks/INIT_MODULE_SOURCES_opencv_dnn.cmake -- opencv_dnn: filter out ocl4dnn source code -- opencv_dnn: filter out cuda4dnn source code -- Excluding from source files list (optimization is disabled): modules/features2d/src/fast.avx2.cpp -- -- General configuration for OpenCV 4.2.0 ===================================== -- Version control: 4.2.0 -- -- Platform: -- Timestamp: 2020-05-20T08:22:51Z -- Host: Linux 5.3.0-51-generic x86_64 -- Target: Emscripten 1 x86 -- CMake: 3.16.3 -- CMake generator: Unix Makefiles -- CMake build tool: /usr/bin/make -- Configuration: Release -- -- CPU/HW features: -- Baseline: -- -- C/C++: -- Built as dynamic libs?: NO -- C++ Compiler: /usr/local/emsdk/upstream/emscripten/em++ (ver 11.0.0) -- C++ flags (Release): -s USE_PTHREADS=0 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -DNDEBUG -O2 -DNDEBUG -- C++ flags (Debug): -s USE_PTHREADS=0 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG -- C Compiler: /usr/local/emsdk/upstream/emscripten/emcc -- C flags (Release): -s USE_PTHREADS=0 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -DNDEBUG -O2 -DNDEBUG -- C flags (Debug): -s USE_PTHREADS=0 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG -- Linker flags (Release): -Wl,--gc-sections -O2 -- Linker flags (Debug): -Wl,--gc-sections -- ccache: NO -- Precompiled headers: NO -- Extra dependencies: -- 3rdparty dependencies: zlib libprotobuf -- -- OpenCV modules: -- To be built: calib3d core dnn features2d flann imgproc js objdetect photo video -- Disabled: highgui imgcodecs java_bindings_generator ml python_bindings_generator stitching videoio world -- Disabled by dependency: - -- Unavailable: gapi java python2 python3 ts -- Applications: - -- Documentation: js -- Non-free algorithms: NO -- -- GUI: -- -- Media I/O: -- ZLib: build (ver 1.2.11) -- HDR: YES -- SUNRASTER: YES -- PXM: YES -- PFM: YES -- -- Video I/O: -- -- Parallel framework: none -- -- Other third-party libraries: -- Custom HAL: NO -- Protobuf: build (3.5.1) -- -- Python (for build): /usr/bin/python2.7 -- -- Install to: /home/share/03_my_opencvjs/opencv/build_js/install -- ----------------------------------------------------------------- -- -- Configuring done -- Generating done -- Build files have been written to: /home/share/03_my_opencvjs/opencv/build_js
編譯輸出:
===== ===== Build finished ===== OpenCV.js location: /home/share/03_my_opencvjs/opencv/build_js/bin/opencv.js jeffrey@unsw-ThinkPad-T490:opencv$ ls build_js/ 3rdparty CMakeFiles CPackConfig.cmake cvconfig.h include opencv2 OpenCVModules.cmake tmp bin cmake_install.cmake CPackSourceConfig.cmake cv_cpu_config.h lib OpenCVConfig.cmake opencv_python_tests.cfg unix-install CMakeCache.txt cmake_uninstall.cmake CTestTestfile.cmake data Makefile OpenCVConfig-version.cmake python_loader version_string.tmp CMakeDownloadLog.txt CMakeVars.txt custom_hal.hpp doc modules opencv_data_config.hpp setup_vars.sh jeffrey@unsw-ThinkPad-T490:opencv$ ls build_js/bin/ opencv.js opencv_js.js perf
-
Build asm.js
開始編譯:
$ sudo python ./platforms/js/build_js.py build_wasm --build_wasm --emscripten_dir /usr/local/emsdk/upstream/emscripten

$ sudo python ./platforms/js/build_js.py build_wasm --build_wasm --emscripten_dir /usr/local/emsdk/upstream/emscripten Args: Namespace(build_dir='build_wasm', build_doc=False, build_flags=None, build_perf=False, build_test=False, build_wasm=True, build_wasm_intrin_test=False, clean_build_dir=False, cmake_option=None, config='/home/share/Lava/AR/WEB/03_my_opencvjs/opencv/platforms/js/opencv_js.config.py', config_only=False, disable_wasm=False, emscripten_dir='/usr/local/emsdk/upstream/emscripten', enable_exception=False, opencv_dir='/home/share/Lava/AR/WEB/03_my_opencvjs/opencv', simd=False, skip_config=False, threads=False) Check dir /home/share/Lava/AR/WEB/03_my_opencvjs/opencv/build_wasm (create: True, clean: False) Check dir /home/share/Lava/AR/WEB/03_my_opencvjs/opencv (create: False, clean: False) Check dir /usr/local/emsdk/upstream/emscripten (create: False, clean: False) ===== ===== Config OpenCV.js build for wasm ===== Executing: ['cmake', '-DENABLE_PIC=FALSE', '-DCMAKE_BUILD_TYPE=Release', "-DCMAKE_TOOLCHAIN_FILE='/usr/local/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake'", "-DCPU_BASELINE=''", "-DCPU_DISPATCH=''", '-DCV_TRACE=OFF', '-DBUILD_SHARED_LIBS=OFF', '-DWITH_1394=OFF', '-DWITH_ADE=OFF', '-DWITH_VTK=OFF', '-DWITH_EIGEN=OFF', '-DWITH_FFMPEG=OFF', '-DWITH_GSTREAMER=OFF', '-DWITH_GTK=OFF', '-DWITH_GTK_2_X=OFF', '-DWITH_IPP=OFF', '-DWITH_JASPER=OFF', '-DWITH_JPEG=OFF', '-DWITH_WEBP=OFF', '-DWITH_OPENEXR=OFF', '-DWITH_OPENGL=OFF', '-DWITH_OPENVX=OFF', '-DWITH_OPENNI=OFF', '-DWITH_OPENNI2=OFF', '-DWITH_PNG=OFF', '-DWITH_TBB=OFF', '-DWITH_TIFF=OFF', '-DWITH_V4L=OFF', '-DWITH_OPENCL=OFF', '-DWITH_OPENCL_SVM=OFF', '-DWITH_OPENCLAMDFFT=OFF', '-DWITH_OPENCLAMDBLAS=OFF', '-DWITH_GPHOTO2=OFF', '-DWITH_LAPACK=OFF', '-DWITH_ITT=OFF', '-DWITH_QUIRC=OFF', '-DBUILD_ZLIB=ON', '-DBUILD_opencv_apps=OFF', '-DBUILD_opencv_calib3d=ON', '-DBUILD_opencv_dnn=ON', '-DBUILD_opencv_features2d=ON', '-DBUILD_opencv_flann=ON', '-DBUILD_opencv_gapi=OFF', '-DBUILD_opencv_ml=OFF', '-DBUILD_opencv_photo=ON', '-DBUILD_opencv_imgcodecs=OFF', '-DBUILD_opencv_shape=OFF', '-DBUILD_opencv_videoio=OFF', '-DBUILD_opencv_videostab=OFF', '-DBUILD_opencv_highgui=OFF', '-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', '-DBUILD_PERF_TESTS=OFF', '-DBUILD_DOCS=OFF', '-DWITH_PTHREADS_PF=OFF', '-DCV_ENABLE_INTRINSICS=OFF', '-DBUILD_WASM_INTRIN_TESTS=OFF', "-DCMAKE_C_FLAGS='-s WASM=1 -s USE_PTHREADS=0 '", "-DCMAKE_CXX_FLAGS='-s WASM=1 -s USE_PTHREADS=0 '", '/home/share/Lava/AR/WEB/03_my_opencvjs/opencv'] Re-run cmake no build system arguments -- OpenCV: system-specific configuration file is not found: 'Emscripten' -- Detected processor: x86 -- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.17", minimum required is "2.7") -- Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) (Required is at least version "2.7") -- Cannot probe for Python/Numpy support (because we are cross-compiling OpenCV) -- If you want to enable Python/Numpy support, set the following variables: -- PYTHON2_INCLUDE_PATH -- PYTHON2_LIBRARIES (optional on Unix-like systems) -- PYTHON2_NUMPY_INCLUDE_DIRS -- PYTHON3_INCLUDE_PATH -- PYTHON3_LIBRARIES (optional on Unix-like systems) -- PYTHON3_NUMPY_INCLUDE_DIRS -- Found PythonInterp: /usr/bin/python3 (found suitable version "3.6.9", minimum required is "3.2") -- Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) (Required is at least version "3.6") -- Cannot probe for Python/Numpy support (because we are cross-compiling OpenCV) -- If you want to enable Python/Numpy support, set the following variables: -- PYTHON2_INCLUDE_PATH -- PYTHON2_LIBRARIES (optional on Unix-like systems) -- PYTHON2_NUMPY_INCLUDE_DIRS -- PYTHON3_INCLUDE_PATH -- PYTHON3_LIBRARIES (optional on Unix-like systems) -- PYTHON3_NUMPY_INCLUDE_DIRS -- Looking for ccache - not found -- Performing Test HAVE_CXX_FSIGNED_CHAR -- Performing Test HAVE_CXX_FSIGNED_CHAR - Success -- Performing Test HAVE_C_FSIGNED_CHAR -- Performing Test HAVE_C_FSIGNED_CHAR - Success -- Performing Test HAVE_CXX_W -- Performing Test HAVE_CXX_W - Success -- Performing Test HAVE_C_W -- Performing Test HAVE_C_W - Success -- Performing Test HAVE_CXX_WALL -- Performing Test HAVE_CXX_WALL - Success -- Performing Test HAVE_C_WALL -- Performing Test HAVE_C_WALL - Success -- Performing Test HAVE_CXX_WERROR_RETURN_TYPE -- Performing Test HAVE_CXX_WERROR_RETURN_TYPE - Success -- Performing Test HAVE_C_WERROR_RETURN_TYPE -- Performing Test HAVE_C_WERROR_RETURN_TYPE - Success -- Performing Test HAVE_CXX_WERROR_NON_VIRTUAL_DTOR -- Performing Test HAVE_CXX_WERROR_NON_VIRTUAL_DTOR - Success -- Performing Test HAVE_C_WERROR_NON_VIRTUAL_DTOR -- Performing Test HAVE_C_WERROR_NON_VIRTUAL_DTOR - Success -- Performing Test HAVE_CXX_WERROR_ADDRESS -- Performing Test HAVE_CXX_WERROR_ADDRESS - Success -- Performing Test HAVE_C_WERROR_ADDRESS -- Performing Test HAVE_C_WERROR_ADDRESS - Success -- Performing Test HAVE_CXX_WERROR_SEQUENCE_POINT -- Performing Test HAVE_CXX_WERROR_SEQUENCE_POINT - Success -- Performing Test HAVE_C_WERROR_SEQUENCE_POINT -- Performing Test HAVE_C_WERROR_SEQUENCE_POINT - Success -- Performing Test HAVE_CXX_WFORMAT -- Performing Test HAVE_CXX_WFORMAT - Success -- Performing Test HAVE_C_WFORMAT -- Performing Test HAVE_C_WFORMAT - Success -- Performing Test HAVE_CXX_WERROR_FORMAT_SECURITY -- Performing Test HAVE_CXX_WERROR_FORMAT_SECURITY - Success -- Performing Test HAVE_C_WERROR_FORMAT_SECURITY -- Performing Test HAVE_C_WERROR_FORMAT_SECURITY - Success -- Performing Test HAVE_CXX_WMISSING_DECLARATIONS -- Performing Test HAVE_CXX_WMISSING_DECLARATIONS - Success -- Performing Test HAVE_C_WMISSING_DECLARATIONS -- Performing Test HAVE_C_WMISSING_DECLARATIONS - Success -- Performing Test HAVE_CXX_WMISSING_PROTOTYPES -- Performing Test HAVE_CXX_WMISSING_PROTOTYPES - Success -- Performing Test HAVE_C_WMISSING_PROTOTYPES -- Performing Test HAVE_C_WMISSING_PROTOTYPES - Success -- Performing Test HAVE_CXX_WSTRICT_PROTOTYPES -- Performing Test HAVE_CXX_WSTRICT_PROTOTYPES - Success -- Performing Test HAVE_C_WSTRICT_PROTOTYPES -- Performing Test HAVE_C_WSTRICT_PROTOTYPES - Success -- Performing Test HAVE_CXX_WUNDEF -- Performing Test HAVE_CXX_WUNDEF - Success -- Performing Test HAVE_C_WUNDEF -- Performing Test HAVE_C_WUNDEF - Success -- Performing Test HAVE_CXX_WINIT_SELF -- Performing Test HAVE_CXX_WINIT_SELF - Success -- Performing Test HAVE_C_WINIT_SELF -- Performing Test HAVE_C_WINIT_SELF - Success -- Performing Test HAVE_CXX_WPOINTER_ARITH -- Performing Test HAVE_CXX_WPOINTER_ARITH - Success -- Performing Test HAVE_C_WPOINTER_ARITH -- Performing Test HAVE_C_WPOINTER_ARITH - Success -- Performing Test HAVE_CXX_WSHADOW -- Performing Test HAVE_CXX_WSHADOW - Success -- Performing Test HAVE_C_WSHADOW -- Performing Test HAVE_C_WSHADOW - Success -- Performing Test HAVE_CXX_WSIGN_PROMO -- Performing Test HAVE_CXX_WSIGN_PROMO - Success -- Performing Test HAVE_C_WSIGN_PROMO -- Performing Test HAVE_C_WSIGN_PROMO - Success -- Performing Test HAVE_CXX_WUNINITIALIZED -- Performing Test HAVE_CXX_WUNINITIALIZED - Success -- Performing Test HAVE_C_WUNINITIALIZED -- Performing Test HAVE_C_WUNINITIALIZED - Success -- Performing Test HAVE_CXX_WINCONSISTENT_MISSING_OVERRIDE -- Performing Test HAVE_CXX_WINCONSISTENT_MISSING_OVERRIDE - Success -- Performing Test HAVE_C_WINCONSISTENT_MISSING_OVERRIDE -- Performing Test HAVE_C_WINCONSISTENT_MISSING_OVERRIDE - Success -- Performing Test HAVE_CXX_WNO_DELETE_NON_VIRTUAL_DTOR -- Performing Test HAVE_CXX_WNO_DELETE_NON_VIRTUAL_DTOR - Success -- Performing Test HAVE_C_WNO_DELETE_NON_VIRTUAL_DTOR -- Performing Test HAVE_C_WNO_DELETE_NON_VIRTUAL_DTOR - Success -- Performing Test HAVE_CXX_WNO_UNNAMED_TYPE_TEMPLATE_ARGS -- Performing Test HAVE_CXX_WNO_UNNAMED_TYPE_TEMPLATE_ARGS - Success -- Performing Test HAVE_C_WNO_UNNAMED_TYPE_TEMPLATE_ARGS -- Performing Test HAVE_C_WNO_UNNAMED_TYPE_TEMPLATE_ARGS - Success -- Performing Test HAVE_CXX_WNO_COMMENT -- Performing Test HAVE_CXX_WNO_COMMENT - Success -- Performing Test HAVE_C_WNO_COMMENT -- Performing Test HAVE_C_WNO_COMMENT - Success -- Performing Test HAVE_CXX_FDIAGNOSTICS_SHOW_OPTION -- Performing Test HAVE_CXX_FDIAGNOSTICS_SHOW_OPTION - Success -- Performing Test HAVE_C_FDIAGNOSTICS_SHOW_OPTION -- Performing Test HAVE_C_FDIAGNOSTICS_SHOW_OPTION - Success -- Performing Test HAVE_CXX_PTHREAD -- Performing Test HAVE_CXX_PTHREAD - Failed -- Performing Test HAVE_C_PTHREAD -- Performing Test HAVE_C_PTHREAD - Failed -- Performing Test HAVE_CXX_QUNUSED_ARGUMENTS -- Performing Test HAVE_CXX_QUNUSED_ARGUMENTS - Success -- Performing Test HAVE_C_QUNUSED_ARGUMENTS -- Performing Test HAVE_C_QUNUSED_ARGUMENTS - Success -- Performing Test HAVE_CXX_FFUNCTION_SECTIONS -- Performing Test HAVE_CXX_FFUNCTION_SECTIONS - Success -- Performing Test HAVE_C_FFUNCTION_SECTIONS -- Performing Test HAVE_C_FFUNCTION_SECTIONS - Success -- Performing Test HAVE_CXX_FDATA_SECTIONS -- Performing Test HAVE_CXX_FDATA_SECTIONS - Success -- Performing Test HAVE_C_FDATA_SECTIONS -- Performing Test HAVE_C_FDATA_SECTIONS - Success -- Performing Test HAVE_CPU_BASELINE_FLAGS -- Performing Test HAVE_CPU_BASELINE_FLAGS - Success -- Performing Test HAVE_CXX_MFPMATH_387 -- Performing Test HAVE_CXX_MFPMATH_387 - Failed -- Performing Test HAVE_C_MFPMATH_387 -- Performing Test HAVE_C_MFPMATH_387 - Failed -- Performing Test HAVE_CXX_FVISIBILITY_HIDDEN -- Performing Test HAVE_CXX_FVISIBILITY_HIDDEN - Success -- Performing Test HAVE_C_FVISIBILITY_HIDDEN -- Performing Test HAVE_C_FVISIBILITY_HIDDEN - Success -- Performing Test HAVE_CXX_FVISIBILITY_INLINES_HIDDEN -- Performing Test HAVE_CXX_FVISIBILITY_INLINES_HIDDEN - Success -- Performing Test HAVE_C_FVISIBILITY_INLINES_HIDDEN -- Performing Test HAVE_C_FVISIBILITY_INLINES_HIDDEN - Success -- OpenCV disables pkg-config to avoid using of host libraries. Consider using PKG_CONFIG_LIBDIR to specify target SYSROOT -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for posix_memalign -- Looking for posix_memalign - found -- Looking for malloc.h -- Looking for malloc.h - found -- Looking for memalign -- Looking for memalign - found -- Looking for fseeko -- Looking for fseeko - found -- Looking for unistd.h -- Looking for unistd.h - found -- Looking for sys/types.h -- Looking for sys/types.h - found -- Looking for stdint.h -- Looking for stdint.h - found -- Looking for stddef.h -- Looking for stddef.h - found -- Check size of off64_t -- Check size of off64_t - failed -- Performing Test HAVE_C_WNO_SHORTEN_64_TO_32 -- Performing Test HAVE_C_WNO_SHORTEN_64_TO_32 - Success -- Performing Test HAVE_C_WNO_ATTRIBUTES -- Performing Test HAVE_C_WNO_ATTRIBUTES - Success -- Performing Test HAVE_C_WNO_STRICT_PROTOTYPES -- Performing Test HAVE_C_WNO_STRICT_PROTOTYPES - Success -- Performing Test HAVE_C_WNO_MISSING_PROTOTYPES -- Performing Test HAVE_C_WNO_MISSING_PROTOTYPES - Success -- Performing Test HAVE_C_WNO_MISSING_DECLARATIONS -- Performing Test HAVE_C_WNO_MISSING_DECLARATIONS - Success -- Performing Test HAVE_C_WNO_SHIFT_NEGATIVE_VALUE -- Performing Test HAVE_C_WNO_SHIFT_NEGATIVE_VALUE - Success -- Performing Test HAVE_C_WNO_UNDEF -- Performing Test HAVE_C_WNO_UNDEF - Success -- Performing Test HAVE_C_WNO_IMPLICIT_FALLTHROUGH -- Performing Test HAVE_C_WNO_IMPLICIT_FALLTHROUGH - Success -- Performing Test HAVE_CXX_WNO_DEPRECATED -- Performing Test HAVE_CXX_WNO_DEPRECATED - Success -- Performing Test HAVE_CXX_WNO_MISSING_PROTOTYPES -- Performing Test HAVE_CXX_WNO_MISSING_PROTOTYPES - Success -- Performing Test HAVE_CXX_WNO_MISSING_DECLARATIONS -- Performing Test HAVE_CXX_WNO_MISSING_DECLARATIONS - Success -- Performing Test HAVE_CXX_WNO_SHADOW -- Performing Test HAVE_CXX_WNO_SHADOW - Success -- Performing Test HAVE_CXX_WNO_UNUSED_PARAMETER -- Performing Test HAVE_CXX_WNO_UNUSED_PARAMETER - Success -- Performing Test HAVE_CXX_WNO_UNUSED_LOCAL_TYPEDEFS -- Performing Test HAVE_CXX_WNO_UNUSED_LOCAL_TYPEDEFS - Success -- Performing Test HAVE_CXX_WNO_SIGN_COMPARE -- Performing Test HAVE_CXX_WNO_SIGN_COMPARE - Success -- Performing Test HAVE_CXX_WNO_SIGN_PROMO -- Performing Test HAVE_CXX_WNO_SIGN_PROMO - Success -- Performing Test HAVE_CXX_WNO_UNDEF -- Performing Test HAVE_CXX_WNO_UNDEF - Success -- Performing Test HAVE_CXX_WNO_TAUTOLOGICAL_UNDEFINED_COMPARE -- Performing Test HAVE_CXX_WNO_TAUTOLOGICAL_UNDEFINED_COMPARE - Success -- Performing Test HAVE_CXX_WNO_IGNORED_QUALIFIERS -- Performing Test HAVE_CXX_WNO_IGNORED_QUALIFIERS - Success -- Performing Test HAVE_CXX_WNO_EXTRA -- Performing Test HAVE_CXX_WNO_EXTRA - Success -- Performing Test HAVE_CXX_WNO_UNUSED_FUNCTION -- Performing Test HAVE_CXX_WNO_UNUSED_FUNCTION - Success -- Performing Test HAVE_CXX_WNO_UNUSED_CONST_VARIABLE -- Performing Test HAVE_CXX_WNO_UNUSED_CONST_VARIABLE - Success -- Performing Test HAVE_CXX_WNO_SHORTEN_64_TO_32 -- Performing Test HAVE_CXX_WNO_SHORTEN_64_TO_32 - Success -- Performing Test HAVE_CXX_WNO_INVALID_OFFSETOF -- Performing Test HAVE_CXX_WNO_INVALID_OFFSETOF - Success -- Performing Test HAVE_CXX_WNO_ENUM_COMPARE_SWITCH -- Performing Test HAVE_CXX_WNO_ENUM_COMPARE_SWITCH - Success -- Performing Test HAVE_CXX_WNO_SUGGEST_OVERRIDE -- Performing Test HAVE_CXX_WNO_SUGGEST_OVERRIDE - Failed -- Performing Test HAVE_CXX_WNO_INCONSISTENT_MISSING_OVERRIDE -- Performing Test HAVE_CXX_WNO_INCONSISTENT_MISSING_OVERRIDE - Success -- Performing Test HAVE_CXX_WNO_IMPLICIT_FALLTHROUGH -- Performing Test HAVE_CXX_WNO_IMPLICIT_FALLTHROUGH - Success -- Performing Test HAVE_CXX_WNO_ARRAY_BOUNDS -- Performing Test HAVE_CXX_WNO_ARRAY_BOUNDS - Success -- OpenCV Python: during development append to PYTHONPATH: /home/share/Lava/AR/WEB/03_my_opencvjs/opencv/build_wasm/python_loader -- Excluding from source files list (optimization is disabled): modules/imgproc/src/corner.avx.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/imgwarp.avx2.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/imgwarp.sse4_1.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/resize.avx2.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/resize.sse4_1.cpp -- Excluding from source files list (optimization is disabled): modules/imgproc/src/sumpixels.avx512_skx.cpp -- Registering hook 'INIT_MODULE_SOURCES_opencv_dnn': /home/share/Lava/AR/WEB/03_my_opencvjs/opencv/modules/dnn/cmake/hooks/INIT_MODULE_SOURCES_opencv_dnn.cmake -- opencv_dnn: filter out ocl4dnn source code -- opencv_dnn: filter out cuda4dnn source code -- Excluding from source files list (optimization is disabled): modules/features2d/src/fast.avx2.cpp -- -- General configuration for OpenCV 4.2.0 ===================================== -- Version control: 4.2.0 -- -- Platform: -- Timestamp: 2020-05-20T09:06:16Z -- Host: Linux 5.3.0-51-generic x86_64 -- Target: Emscripten 1 x86 -- CMake: 3.16.3 -- CMake generator: Unix Makefiles -- CMake build tool: /usr/bin/make -- Configuration: Release -- -- CPU/HW features: -- Baseline: -- -- C/C++: -- Built as dynamic libs?: NO -- C++ Compiler: /usr/local/emsdk/upstream/emscripten/em++ (ver 11.0.0) -- C++ flags (Release): -s WASM=1 -s USE_PTHREADS=0 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -DNDEBUG -O2 -DNDEBUG -- C++ flags (Debug): -s WASM=1 -s USE_PTHREADS=0 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG -- C Compiler: /usr/local/emsdk/upstream/emscripten/emcc -- C flags (Release): -s WASM=1 -s USE_PTHREADS=0 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -DNDEBUG -O2 -DNDEBUG -- C flags (Debug): -s WASM=1 -s USE_PTHREADS=0 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG -- Linker flags (Release): -Wl,--gc-sections -O2 -- Linker flags (Debug): -Wl,--gc-sections -- ccache: NO -- Precompiled headers: NO -- Extra dependencies: -- 3rdparty dependencies: zlib libprotobuf -- -- OpenCV modules: -- To be built: calib3d core dnn features2d flann imgproc js objdetect photo video -- Disabled: highgui imgcodecs java_bindings_generator ml python_bindings_generator stitching videoio world -- Disabled by dependency: - -- Unavailable: gapi java python2 python3 ts -- Applications: - -- Documentation: js -- Non-free algorithms: NO -- -- GUI: -- -- Media I/O: -- ZLib: build (ver 1.2.11) -- HDR: YES -- SUNRASTER: YES -- PXM: YES -- PFM: YES -- -- Video I/O: -- -- Parallel framework: none -- -- Other third-party libraries: -- Custom HAL: NO -- Protobuf: build (3.5.1) -- -- Python (for build): /usr/bin/python2.7 -- -- Install to: /home/share/Lava/AR/WEB/03_my_opencvjs/opencv/build_wasm/install -- ----------------------------------------------------------------- -- -- Configuring done -- Generating done -- Build files have been written to: /home/share/Lava/AR/WEB/03_my_opencvjs/opencv/build_wasm
編譯輸出:
===== ===== Build finished ===== OpenCV.js location: /home/share/Laava/AR/WEB/03_my_opencvjs/opencv/build_wasm/bin/opencv.js
編譯的結果會出現在 build_dir/bin
文件夾中。
opencv 3.x 的版本下
會得到 opencv.js, opencv_js.js, opencv_js.wasm
三個文件,這也是網上各種教程中常使用的版本。 opencv.js
是引用的 js 文件, opencv_js.js
是中間生成的 asm.js ,opencv_js.wasm
是 WebAssembly 格式的二進制文件。
opencv 4.x 的版本下
只會有 opencv.js, opencv_js.js
這兩個文件,但其實 WebAssembly 的內容已經編譯成功,但已經嵌入.js文件中。(7.9M左右)
opencv$ ls build_wasm/bin/
opencv.js opencv_js.js perf
在.js文件中有:
var wasmBinaryFile="data:application/octet-stream;base64,....'
-
Build documents
開始編譯:
$ sudo python ./platforms/js/build_js.py build_js --build_doc --emscripten_dir /usr/local/emsdk/upstream/emscripten
編譯輸出:
===== ===== Build finished ===== OpenCV.js location: /home/share/Laava/AR/WEB/03_my_opencvjs/opencv/build_js/bin/opencv.js OpenCV.js tutorials location: /home/share/Laava/AR/WEB/03_my_opencvjs/opencv/build_js/doc/doxygen/html/d5/d10/tutorial_js_root.html
-
Build tests
開始編譯:
$ sudo python ./platforms/js/build_js.py build_js --build_test --emscripten_dir /usr/local/emsdk/upstream/emscripten
編譯輸出:
===== ===== Build finished ===== OpenCV.js location: /home/share/Lava/AR/WEB/03_my_opencvjs/opencv/build_js/bin/opencv.js OpenCV.js tests location: /home/share/Lava/AR/WEB/03_my_opencvjs/opencv/build_js/bin/tests.html
二、實踐出真知
電子書免費:Free eBook: Mastering OpenCV 4 - Third Edition,chapter six.
-
官網下載
可官網直接下載。
As for the opencv.js file, I used this version: https://docs.opencv.org/4.0.1/opencv.js but other versions are known to work too or there’s a nightly build at https://docs.opencv.org/master/opencv.js.
4.1.0 版本開始,貌似才默認為二進制 wasm,效果就是體積更小。
-
自定義編譯
自己編譯的 opencv.js 直接替換上述官方的,卻出現了這個問題。
問題:bindings.cpp:508:18: error: reference to 'index' is ambiguous
解決方案:OpenCV Emscripten 編譯 opencv.js
wasm不支持,有代碼,openCV.js簡單幾個demo(2018-09-08)
Debug: require('./opencv.js') is not enough for using OpenCV.js
Part II (Compiling from source)
Step 1: Considering following Part I
Step 2: Install Emscripten
Emscripten is basically an Open Source LLVM to JavaScript compiler (OpenCV is written in C/C++). Here are the steps for installation:
# Get the emsdk repo
git clone https://github.com/emscripten-core/emsdk.git# Enter that directory
cd emsdk# Download and install the latest SDK tools.
./emsdk install latest
# Make the "latest" SDK "active" for the current user. (writes ~/.emscripten file)
./emsdk activate latest
# Activate PATH and other environment variables in the current terminal
source ./emsdk_env.sh
Next time if you want to update it, just cd emsdk and git pull (not necessary for first time installations).
Step 3: Install Binaryen
This step is necessary to compile to WebAssembly. Cd into your emsdk directory first with:
cd emsdk
Next (make sure you’re in the emsdk directory), following the official Webassembly developer’s guide linked from the OpenCV page didn’t work for me because of this Github issue. So use this instead:
./emsdk install binaryen-master-64bit
./emsdk activate binaryen-master-64bit
Step 4: Install cmake and python
Make sure you have cmake installed:
brew install cmake
As for python installation, make sure your version is Python 2.7.12 or newer because older versions may not work due to a GitHub change with SSL. Based on some internet sources, some people ran into issues and had to rebuild python from source (so try that if you run into issues). Make sure python has the appropriate libraries like numpy.
Step 5: Install OpenCV
Installing using git (make sure you have git in your development environment but feel free to explore other ways to install OpenCV):
git clone https://github.com/opencv/opencv.git
Step 6: Build opencv.js
The official OpenCV docs didn’t work for me sadly but here’s some important points to take note of:
- I had to set emscripten_dir flag and specify the full path for it to work.
- The emscripten path should be /Users/fangran/emsdk/upstream/emscripten (update the /Users/fangran/ part with your own path).
So run this:
python /Users/fangran/opencv/platforms/js/build_js.py build_wasm --build_wasm --emscripten_dir /Users/fangran/emsdk/upstream/emscripten
At the end of the installation, you should see:
========== Build finished=====OpenCV.js location: /Users/fangran/opencv/build_wasm/bin/opencv.js
Happy OpenCV-ing! :)
$ sudo python ./platforms/js/build_js.py build_wasm --build_wasm --emscripten_dir /usr/local/emsdk/upstream/emscripten
Args: Namespace(build_dir='build_wasm', build_doc=False, build_flags=None, build_perf=False, build_test=False, build_wasm=True, build_wasm_intrin_test=False, clean_build_dir=False, cmake_option=None, config='/home/share/Laava/AR/WEB/03_my_opencvjs/opencv/platforms/js/opencv_js.config.py', config_only=False, disable_wasm=False, emscripten_dir='/usr/local/emsdk/upstream/emscripten', enable_exception=False, opencv_dir='/home/share/Laava/AR/WEB/03_my_opencvjs/opencv', simd=False, skip_config=False, threads=False) Check dir /home/share/Laava/AR/WEB/03_my_opencvjs/opencv/build_wasm (create: True, clean: False) Check dir /home/share/Laava/AR/WEB/03_my_opencvjs/opencv (create: False, clean: False) Check dir /usr/local/emsdk/upstream/emscripten (create: False, clean: False) ===== ===== Config OpenCV.js build for wasm ===== Executing: ['cmake', '-DENABLE_PIC=FALSE', '-DCMAKE_BUILD_TYPE=Release', "-DCMAKE_TOOLCHAIN_FILE='/usr/local/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake'", "-DCPU_BASELINE=''", "-DCPU_DISPATCH=''", '-DCV_TRACE=OFF', '-DBUILD_SHARED_LIBS=OFF', '-DWITH_1394=OFF', '-DWITH_ADE=OFF', '-DWITH_VTK=OFF', '-DWITH_EIGEN=OFF', '-DWITH_FFMPEG=OFF', '-DWITH_GSTREAMER=OFF', '-DWITH_GTK=OFF', '-DWITH_GTK_2_X=OFF', '-DWITH_IPP=OFF', '-DWITH_JASPER=OFF', '-DWITH_JPEG=OFF', '-DWITH_WEBP=OFF', '-DWITH_OPENEXR=OFF', '-DWITH_OPENGL=OFF', '-DWITH_OPENVX=OFF', '-DWITH_OPENNI=OFF', '-DWITH_OPENNI2=OFF', '-DWITH_PNG=OFF', '-DWITH_TBB=OFF', '-DWITH_TIFF=OFF', '-DWITH_V4L=OFF', '-DWITH_OPENCL=OFF', '-DWITH_OPENCL_SVM=OFF', '-DWITH_OPENCLAMDFFT=OFF', '-DWITH_OPENCLAMDBLAS=OFF', '-DWITH_GPHOTO2=OFF', '-DWITH_LAPACK=OFF', '-DWITH_ITT=OFF', '-DWITH_QUIRC=OFF', '-DBUILD_ZLIB=ON', '-DBUILD_opencv_apps=OFF', '-DBUILD_opencv_calib3d=ON', '-DBUILD_opencv_dnn=ON', '-DBUILD_opencv_features2d=ON', '-DBUILD_opencv_flann=ON', '-DBUILD_opencv_gapi=OFF', '-DBUILD_opencv_ml=OFF', '-DBUILD_opencv_photo=ON', '-DBUILD_opencv_imgcodecs=OFF', '-DBUILD_opencv_shape=OFF', '-DBUILD_opencv_videoio=OFF', '-DBUILD_opencv_videostab=OFF', '-DBUILD_opencv_highgui=OFF', '-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', '-DBUILD_PERF_TESTS=OFF', '-DBUILD_DOCS=OFF', '-DWITH_PTHREADS_PF=OFF', '-DCV_ENABLE_INTRINSICS=OFF', '-DBUILD_WASM_INTRIN_TESTS=OFF', "-DCMAKE_C_FLAGS='-s WASM=1 -s USE_PTHREADS=0 '", "-DCMAKE_CXX_FLAGS='-s WASM=1 -s USE_PTHREADS=0 '", '/home/share/Laava/AR/WEB/03_my_opencvjs/opencv'] Re-run cmake no build system arguments CMake Error at /usr/local/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake:131 (message): Failed to fetch compiler version information with command "'/usr/local/emsdk/upstream/emscripten/emcc' -v"! Process returned with error code 1. Call Stack (most recent call first): /usr/local/lib/python3.6/dist-packages/cmake/data/share/cmake-3.16/Modules/CMakeDetermineSystem.cmake:93 (include) CMakeLists.txt:106 (enable_language) CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool. -- Configuring incomplete, errors occurred! Traceback (most recent call last): File "./platforms/js/build_js.py", line 269, in <module> builder.config() File "./platforms/js/build_js.py", line 192, in config execute(cmd) File "./platforms/js/build_js.py", line 23, in execute raise Fail("Child returned: %s" % retcode) __main__.Fail: Child returned: 1
End.