有谁知道如何将 OpenCV 移植到 NaCl?我正在尝试基于人脸识别制作 Chrome 扩展。我会很感激一些帮助。
1 回答
为方便起见,以下详细说明已从(现已失效的metacaptcha.com/install_opencv_nacl)重新发布。
1. 先决条件
OpenCV 依赖于几个重要的库,如 bzip2、zlib、NaclMounts 和至少一个解压缩/压缩库来处理常见的图像,如 libpng/jpeg/tiff。本文将只关注 libjpeg。这些库需要使用 NaCl Glibc 工具链 (Pepper 28) 在 32 位和 64 位架构师中构建为动态库。
为了构建 NaCl 的 32 位和 64 位共享库,需要分别使用 32 位和 64 位版本的 NaCl gcc/linker。为了在本教程中更容易做到这一点,我们制作了以下环境变量:
注意:如果文章中的某个链接失效,可以在此处找到备份链接。
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
,我们要更改 gcc 工具链参数,以便gcc
使用 $NACL_SDK_ROOT/toolchain/mac_x86_glibc/x86_64-nacl/bin/ 中的 NaCl gcc而不是使用常规 OS .
使用以下参数在 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 补丁并将它们放到你的本地目录中。
使用 nacl-jpeg-makefile.cfg 修补程序修补 jpeg-v6b 目录。
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
OpenCV 需要以交叉编译模式构建,以便使用 cmake(OpenCV 的构建工具)轻松完成。我们设置 CMAKE_SYSTEM_NAME=Linux 来强制 Linux 目标的交叉编译。如果您已经在上一步中设置了环境变量,则会编写一个 OpenCV-nacl-cmake 脚本以促进构建过程。
2.1 设置源代码
下载OpenCV 2.4.2 , opencv-nacl-cmake 脚本 将 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 ./
2.2 修补 OpenCV I/O 库 (persistance.cpp) / 排除应用程序的构建
为了让 OpenCV 在 Native Client 中读取/写入文件,需要使用新的文件系统库。此补丁用 NaclMounts 库替换文件 I/O 的所有操作系统系统调用。
下载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
我们还需要告诉 cmake 排除 OpenCV 中的应用程序模块(应用程序模块不需要移植)。这可以通过简单地移动应用目录中的 CMakeList.txt 文件来完成
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。
可以在example_opencv_nacl_facedetect中找到一个改编自 OpenCV 教程以在 Google Chrome 中执行人脸检测的简单应用程序。