読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

OpenCVをEmscriptenでJS化して動かせた

こんにちは、次男は野菜を少しずつ食べるようになっているものの、相変わらず便秘気味な状態が続く中、長男が先日誕生日を迎えました。kjunichiです。
 

OpenCVEmscriptenでビルドできる

さすがに、そのままでは難しいが、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エラーとなることを回避できた。

成果物

関連記事

9年前の記事

3年前の記事

2年前の記事