有谁知道如何将OpenCV移植到NaCl?我正在尝试基于面部识别功能开发Chrome扩展程序。我将不胜感激。

最佳答案

为了方便起见,以下详细说明已从(现已失效的metacaptcha.com/install_opencv_nacl)中重新发布。

1.先决条件

OpenCV依赖于几个重要的库,例如bzip2,zlib,NaclMounts和至少一个解压缩/压缩库来处理常见的图像,例如libpng / jpeg / tiff。本文仅关注libjpeg。这些库需要使用NaCl Glibc工具链在32位和64位架构器中作为动态库进行构建(Pepper 28)。

为了为NaCl构建32位和64位共享库,需要分别使用32位和64位版本的NaCl gcc /链接器。为了使本教程更轻松,我们制作了以下环境变量:

注意:如果本文中的链接之一无法正常工作,则可以找到一个备用链接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

1.1适用于本机客户端的Bzip2

下载Bzip2 v1.0.6,解压缩到本地目录。 Makefile-libbz2_so是我们要用于make的文件,我们想要更改gcc工具链参数,以便代替使用常规OS gcc,它将在$ NACL_SDK_ROOT / toolchain / mac_x86_glibc / x86_64-nacl /中使用NaCl gcc 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

1.2适用于本机客户端的Zlib

下载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

1.3本机客户端的libJPEG

下载jpeg-v6bNaCl 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

1.4用于本地客户端的NaclMounts

下载NaclMountsnacl-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

2. OpenCV for Native Client

OpenCV需要以交叉编译模式构建,以便使用cmake(OpenCV的构建工具)轻松地做到这一点。我们将CMAKE_SYSTEM_NAME = Linux设置为强制对Linux目标进行交叉编译。如果您已经在上一步中设置了环境变量,则编写OpenCV-nacl-cmake脚本是为了简化构建过程。

2.1设置源代码

下载OpenCV 2.4.2opencv-nacl-cmake script
将OpenCV提取到本地目录。

在OpenCV-2.4.2 /中创建nacl/m32nacl/m64目录,以构建32/64位版本的OpenCV本机客户端代码。

将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库替换了所有OS I / O操作系统对文件I / O的调用。

下载persistance.cpp patch for OpenCV 2.4.2
将补丁复制到您的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模块(不需要移植apps模块)。只需在apps目录中移动CMakeList.txt文件即可完成此操作
mv apps/CMakeList.txt apps/CMakeList.txt.old

2.3配置,构建和安装

使用以下参数运行./opencv-nacl-cmake来配置和构建库。以下bash命令还为OpenCV安装了32位和64位版本的库。由于本机客户端的命名约定,我们必须移动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中执行人脸检测。

10-08 18:03