【发布时间】:2013-04-03 21:39:08
【问题描述】:
有谁知道如何将 OpenCV 移植到 NaCl?我正在尝试基于人脸识别制作 Chrome 扩展。我将不胜感激。
【问题讨论】:
标签: google-chrome opencv google-nativeclient
有谁知道如何将 OpenCV 移植到 NaCl?我正在尝试基于人脸识别制作 Chrome 扩展。我将不胜感激。
【问题讨论】:
标签: google-chrome opencv google-nativeclient
为方便起见,以下详细说明已从(现已失效的 metacaptcha.com/install_opencv_nacl)重新发布。
OpenCV 依赖于几个重要的库,例如 bzip2、zlib、NaclMounts 和至少一个解压缩/压缩库来处理常见的图像,例如 libpng/jpeg/tiff。本文将只关注 libjpeg。这些库需要使用 NaCl Glibc 工具链 (Pepper 28) 在 32 位和 64 位架构师中构建为动态库。
为了构建 NaCl 的 32 位和 64 位共享库,需要分别使用 32 位和 64 位版本的 NaCl gcc/linker。为了在本教程中更容易做到这一点,我们制作了以下环境变量:
注意:如果文章中的某个链接失效,可以找到备用链接here。
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
下载Bzip2 v1.0.6,解压到本地目录。 Makefile-libbz2_so 是我们要用于make 的文件,我们要更改 gcc 工具链参数,以便使用 $NACL_SDK_ROOT/toolchain/mac_x86_glibc/ 中的 NaCl gcc 而不是使用常规操作系统 gcc x86_64-nacl/bin/.
使用以下参数在 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
下载Zlib-1.2.8,解压到本地目录。 Zlib 使用 autoconfig 生成 Makefile,我们需要先运行该工具,然后将 GCC 工具链修改为 NaCl 工具链。
在 zlib 上运行 ./configure --enable-shared,然后使用以下参数运行 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
下载jpeg-v6b、NaCl jpeg makefile.cfg patch并将它们放到你的本地目录中。
使用 nacl-jpeg-makefile.cfg 补丁修补 jpeg-v6b 目录。
cd jpeg-6b
patch < nacl-jpeg-v6b-makefile.cfg.patch
在 jpeg-6b 上运行 ./configure,然后使用以下参数运行 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
下载NaclMounts、nacl-mounts.patch 和我们的custom 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
OpenCV 需要在交叉编译模式下构建,使用 cmake(OpenCV 的构建工具)轻松实现。我们设置 CMAKE_SYSTEM_NAME=Linux 来强制 Linux 目标的交叉编译。如果您已经在上一步中设置了环境变量,则会编写一个 OpenCV-nacl-cmake 脚本以促进构建过程。
下载OpenCV 2.4.2, opencv-nacl-cmake script 将 OpenCV 解压到本地目录。
在 OpenCV-2.4.2/ 中创建 nacl/m32、nacl/m64 目录,用于构建 32/64 位版本的 OpenCV Native Client 代码。
将 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 ./
为了让 OpenCV 在 Native Client 中读取/写入文件,需要使用新的文件系统库。这个补丁用 NaclMounts 库替换了所有文件 I/O 的操作系统系统调用。
为 OpenCV 2.4.2 下载 persistance.cpp patch 将补丁复制到您的 OpenCV 目录,并使用这些命令应用路径
cp ~/Download/opencv-nacl-persistance.patch OpenCV-2.4.2
cd OpenCV-2.4.2
patch -p0 < opencv-nacl-persistance.patch
我们还需要告诉 cmake 排除 OpenCV 中的应用程序模块(应用程序模块不需要移植)。这可以通过简单地移动apps目录中的CMakeList.txt文件来完成
mv apps/CMakeList.txt apps/CMakeList.txt.old
使用以下参数运行 ./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。
可以在example_opencv_nacl_facedetect 中找到根据 OpenCV 教程改编的用于在 Google Chrome 中执行人脸检测的简单应用程序。
【讨论】: