2

有谁知道如何将 OpenCV 移植到 NaCl?我正在尝试基于人脸识别制作 Chrome 扩展。我会很感激一些帮助。

4

1 回答 1

6

为方便起见,以下详细说明已从(现已失效的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 中执行人脸检测的简单应用程序。

于 2013-12-13T22:46:15.853 回答