OpenCVをNaClに移植する方法を知っている人はいますか? 顔認識ベースの Chrome 拡張機能を作ろうとしています。助けていただければ幸いです。
1 に答える
以下の詳細な手順は、便宜上 (現在は廃止されたmetacaptcha.com/install_opencv_nacl ) から転載されています。
1.前提条件
OpenCV は、bzip2、zlib、NaclMounts などのいくつかの重要なライブラリと、少なくとも 1 つの解凍/圧縮ライブラリに依存して、libpng/jpeg/tiff などの一般的な画像を処理します。この記事では、libjpeg のみに焦点を当てます。これらのライブラリは、NaCl Glibc ツールチェーン (Pepper 28) を使用して動的ライブラリとして 32 ビットと 64 ビットの両方のアーキテクトでビルドする必要があります。
NaCl 用の 32 ビットおよび 64 ビット共有ライブラリをビルドするには、32 ビットおよび 64 ビット バージョンの NaCl gcc/linker をそれぞれ使用する必要があります。チュートリアルでこれを簡単にするために、次の環境変数を作成します。
注: 記事内のリンクの 1 つが機能しなかった場合は、ここにバックアップ リンクがあります。
export NACL_SDK_ROOT=/Users/thai/apps/nacl_sdk/pepper_28
export NACL_PREFIX="$NACL_SDK_ROOT"/toolchain/mac_x86_glibc/x86_64-nacl
export NACL_64="$NACL_SDK_ROOT"/toolchain/mac_x86_glibc/bin/x86_64-nacl
export NACL_32="$NACL_SDK_ROOT"/toolchain/mac_x86_glibc/bin/i686-nacl
1.1 ネイティブ クライアント用の Bzip2
Bzip2 v1.0.6をダウンロードし、ローカル ディレクトリに展開します。Makefile-libbz2_so は に使用するファイルですmake
。通常の OS を使用する代わりにgcc
、$NACL_SDK_ROOT/toolchain/mac_x86_glibc/x86_64-nacl/bin/ で NaCl gcc を使用するように gcc ツールチェーン パラメーターを変更します。 .
次のパラメーターを使用して bzip2 で実行make -f Makefile-libbz2_so
し、ライブラリを NaCl ツールチェーンにコピーします。
make -f Makefile-libbz2_so CC=$NACL_64-'gcc -m64'
cp libbz2.so.1.0.6 $NACL_PREFIX/lib64/libbz2.so
make clean
make -f Makefile-libbz2_so CC=$NACL_32-'gcc -m32'
cp libbz2.so.1.0.6 $NACL_PREFIX/lib32/libbz2.so
cp *.h $NACL_PREFIX/include
1.2 ネイティブ クライアント用の Zlib
Zlib-1.2.8をダウンロードし、ローカル ディレクトリに展開します。Zlib は autoconfig を使用して Makefile を生成します。最初にこのツールを実行してから、GCC ツールチェーンを NaCl ツールチェーンに変更する必要があります。
./configure --enable-shared
zlib で実行しmake
、次のパラメーターを指定して実行します。
./configure --enable-shared
make shared CC=$NACL_64-'gcc -m64' AR=$NACL_64-ar ARFLAGS=rc CFLAGS='-O3 -DHAVE_HIDDEN' LDFLAGS='-O3 -fPIC -DHAVE_HIDDEN' LDSHARED='$(CC) -shared -Wl,-soname -Wl,libz.so' SHAREDLIB=libz.so SHAREDLIBM=libz.so.1.2.8 SHAREDLIBV=libz.so.1
cp libz.so.1 $NACL_PREFIX/lib64/libz.so
make clean
make shared CC=$NACL_32-'gcc -m32' AR=$NACL_32-ar ARFLAGS=rc CFLAGS='-O3 -DHAVE_HIDDEN' LDFLAGS='-O3 -fPIC -DHAVE_HIDDEN' LDSHARED='$(CC) -shared -Wl,-soname -Wl,libz.so' SHAREDLIB=libz.so SHAREDLIBM=libz.so.1.2.8 SHAREDLIBV=libz.so.1
cp libz.so.1 $NACL_PREFIX/lib32/libz.so
cp zlib.h zconf.h $NACL_PREFIX/include
1.3 ネイティブ クライアント用 libJPEG
jpeg-v6b、NaCl jpeg makefile.cfg パッチをダウンロードして、ローカル ディレクトリに配置します。
jpeg-v6b ディレクトリに nacl-jpeg-makefile.cfg パッチを適用します。
cd jpeg-6b
patch < nacl-jpeg-v6b-makefile.cfg.patch
./configure
jpeg-6b で実行しmake libjpeg.so
、次のパラメーターで実行します。
./configure
make libjpeg.so CC=$NACL_64-gcc CFLAGS='-m64 -fPIC -O2 -I.' LDFLAGS='-shared -Wl,-soname -Wl,libjpeg.so -o libjpeg.so'
mv libjpeg.so $NACL_PREFIX/lib64/libjpeg.so
make clean
make libjpeg.so CC=$NACL_32-gcc CFLAGS='-m32 -fPIC -O2 -I.' LDFLAGS='-shared -Wl,-soname -Wl,libjpeg.so -o libjpeg.so'
mv libjpeg.so $NACL_PREFIX/lib32/libjpeg.so
make install-headers prefix=$NACL_PREFIX
1.4 ネイティブ クライアントの NaclMounts
NaclMounts、nacl-mounts.patch、およびカスタム Makefileをダウンロード します。ローカルの nacl-mount ディレクトリに移動し、Makefile をこのディレクトリにコピーして、パッチを適用し、次のコマンドを実行します (記事の冒頭で環境変数を既に設定していると仮定します)。 )
cp Makefile nacl-mounts/
cd nacl-mounts/
patch -p0 < ../nacl-mounts.patch
make ARCH=x86_64 BIT=64
cp libnaclmounts.so $NACL_PREFIX/lib64
make clean
make ARCH=i686 BIT=32
cp libnaclmounts.so $NACL_PREFIX/lib32
make install-headers
2. ネイティブ クライアント用の OpenCV
cmake (OpenCV のビルド ツール) で簡単に実行するには、OpenCV をクロス コンパイル モードでビルドする必要があります。CMAKE_SYSTEM_NAME=Linux を設定して、Linux ターゲットのクロスコンパイルを強制します。前のステップで環境変数をすでにセットアップしている場合は、ビルド プロセスを容易にするために、OpenCV-nacl-cmake スクリプトが記述されています。
2.1 ソースコードのセットアップ
OpenCV 2.4.2、opencv-nacl-cmake スクリプトをダウンロード します。OpenCV をローカル ディレクトリに抽出します。
OpenCV Native Client コードの 32/64 ビット バージョンをビルドするために、OpenCV-2.4.2/ にディレクトリをnacl/m32
作成します。nacl/m64
opencv-nacl-cmake スクリプトを nacl/ ディレクトリにコピーします。
tar xvf OpenCV-2.4.2.tar.gz
cd OpenCV-2.4.2
mkdir nacl
cd nacl
mkdir m64 m32
cp ~/Downloads/opencv-nacl-cmake ./
2.2 OpenCV I/O ライブラリ (persistance.cpp) にパッチを当てる / アプリのビルドを除外する
OpenCV が Native Client でファイルを読み書きできるようにするには、新しいファイル システム ライブラリを使用する必要があります。このパッチは、ファイル I/O のすべての OS システム コールを NaclMounts ライブラリに置き換えます。
OpenCV 2.4.2 用のpersistance.cpp パッチをダウンロードします。パッチを OpenCV ディレクトリにコピーし、これらのコマンドを使用してパスを適用します。
cp ~/Download/opencv-nacl-persistance.patch OpenCV-2.4.2
cd OpenCV-2.4.2
patch -p0 < opencv-nacl-persistance.patch
また、OpenCV でアプリ モジュールを除外するように cmake に指示する必要があります (アプリ モジュールを移植する必要はありません)。これは、CMakeList.txt ファイルを apps ディレクトリに移動するだけで実行できます。
mv apps/CMakeList.txt apps/CMakeList.txt.old
2.3 構成、ビルド、およびインストール
次のパラメーターを指定して ./opencv-nacl-cmake を実行し、ライブラリを構成してビルドします。次の bash コマンドも、OpenCV のライブラリの 32 ビット バージョンと 64 ビット バージョンの両方をインストールします。Native Client の命名規則により、アーキテクチャを正しくインストールするには、lib/、lib32/、lib64/ ディレクトリを移動する必要があります。
cd nacl/m32
../opencv-nacl-cmake i686 32
make -j8
unlink $NACL_PREFIX/lib64
mv $NACL_PREFIX/lib $NACL_PREFIX/lib64
mv $NACL_PREFIX/lib32 $NACL_PREFIX/lib
ln -s $NACL_PREFIX/lib $NACL_PREFIX/lib32
make install
unlink $NACL_PREFIX/lib32
mv $NACL_PREFIX/lib $NACL_PREFIX/lib32
mv $NACL_PREFIX/lib64 $NACL_PREFIX/lib
ln -s $NACL_PREFIX/lib $NACL_PREFIX/lib64
cd ../m64
../opencv-nacl-cmake x86_64 64
make -j8
make install
この時点で、Native Client Pepper 28 用の OpenCV 2.4.2 のインストールが完了しました。
Google Chrome で顔検出を実行するために OpenCV のチュートリアルから適用された単純なアプリケーションは、example_opencv_nacl_facedetectにあります。