こんにちは、次男は野菜を少しずつ食べるようになっているものの、相変わらず便秘気味な状態が続く中、長男が先日誕生日を迎えました。@kjunichiです。
OpenCVはEmscriptenでビルドできる
さすがに、そのままでは難しいが、CMakeのファイルをちょっと編集するだけで行ける。
以下にEmscripten向けにCMakeを変更したバージョンを起きてくれている方がいた。
うごかしてみる
OpenCVライブラリ構築編
READMEの通りではお目当てのブランチに入れないので、以下のようにやった。
git clone https://github.com/kakukogou/opencv.git cd opencv git checkout -b opencvjs origin/opencvjs
まずは、libopencvXXX.so系をビルドすることになる。cmakeコマンドの前にecmakeコマンドをかます だけで、あとは、多少Emscriptenを意識したビルドオプションを指定する程度
自分の環境では、READMEのオプションの他に IPPを無効にする必要があったので、
-DWITH_IPP=OFF
を追加して、最終的には以下の指定でecmakeを実行。
emcmake cmake -DBUILD_CUDA_STUBS=OFF -DBUILD_DOCS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_JASPER=OFF -DBUILD_JPEG=OFF -DBUILD_OPENEXR=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_PNG=OFF -DBUILD_TBB=OFF -DBUILD_TESTS=OFF -DBUILD_TIFF=OFF -DBUILD_WITH_DEBUG_INFO=OFF -DBUILD_ZLIB=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_ts=OFF -DBUILD_opencv_world=OFF -DWITH_1394=OFF -DWITH_CLP=OFF -DWITH_CUBLAS=OFF -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_FFMPEG=OFF -DWITH_GDAL=OFF -DWITH_GIGEAPI=OFF -DWITH_GSTREAMER=OFF -DWITH_GSTREAMER_0_10=OFF -DWITH_GTK=OFF -DWITH_GTK_2_X=OFF -DWITH_JASPER=OFF -DWITH_JPEG=OFF -DWITH_LIBV4L=OFF -DWITH_NVCUVID=OFF -DWITH_OPENCL=OFF -DWITH_OPENCLAMDBLAS=OFF -DWITH_OPENCLAMDFFT=OFF -DWITH_OPENEXR=OFF -DWITH_OPENGL=OFF -DWITH_OPENMP=OFF -DWITH_OPENNI=OFF -DWITH_OPENNI2=OFF -DWITH_PNG=OFF -DWITH_PVAPI=OFF -DWITH_QT=OFF -DWITH_TBB=OFF -DWITH_TIFF=OFF -DWITH_UNICAP=OFF -DWITH_V4L=OFF -DWITH_VTK=OFF -DWITH_WEBP=OFF -DWITH_XIMEA=OFF -DWITH_XINE=OFF -DBUILD_SHARED_LIBS=ON -DBUILD_PACKAGE=ON -DCMAKE_COLOR_MAKEFILE=ON -DWITH_EIGEN=ON -DCMAKE_BUILD_TYPE=RELEASE -DWITH_IPP=OFF -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG -O3 -s PRECISE_F32=1 -Wno-warn-absolute-paths" -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="-O3 -s PRECISE_F32=1" -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -O3 -s PRECISE_F32=1" -DCMAKE_C_FLAGS_RELWITHDEBINFO="-O3 -s PRECISE_F32=1" -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-O3 -s PRECISE_F32=1" -DCMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO="-O3 -g -s PRECISE_F32=1" -DCMAKE_MODULE_LINKER_FLAGS_RELEASE="-O3 -s PRECISE_F32=1" -DCMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO="-O3 -g -s PRECISE_F32=1" -DCMAKE_SHARED_LINKER_FLAGS_RELEASE="-O3 -s PRECISE_F32=1" -DCMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO="-O3 -g -s PRECISE_F32=1" ..
その後emake,emake installでOK。
サンプルを動かす
先の方が、OpenCV本体の他にサンプルも公開されているので、
を動かしてみる。
こちらも、REAMEのとおりではうまく行かない箇所があった。
Emscripteのportable sdkが更新され、
-s FORCE_ALIGNED_MEMORY=1
オプションが無効化されているので、この指定をMakefileから削除した。
Moduleが未定義
<script> var Module = { 'print': function(text) { console.log('stdout: ' + text) }, 'printErr': function(text) { console.log('stderr: ' + text) } }; </script>
を
<script type="text/javascript" src="segmentation.js"></script>
の前に入れることで、Moduleがundeinfedエラーとなることを回避できた。
成果物
関連記事
- slコマンドをWebAssembly化して動かした
- SLコマンドをEmscriptenでWeb化する 2014年秋編
- Emscriptenでファイルを読み込む
- libiconvをemscriptenでjs化し、node.jsで使った
- emscriptenでOpenGL
- 公式のOpenCVでWASM版のOpenCV.jsがビルドできたのnode.jsで動かそうとした件