如何将OpenCv移植到NaCl

时间:2013-04-03 21:39:09

标签: google-chrome opencv google-nativeclient

有谁知道如何将OpenCV移植到NaCl?我正在尝试基于人脸识别进行Chrome扩展。我将不胜感激。

1 个答案:

答案 0 :(得分:6)

下面的详细说明已经从(现已解散的 metacaptcha.com/install_opencv_nacl )转发,以方便使用。

1。 Prerequitsites

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

为了构建用于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 for Native Client

下载Bzip2 v1.0.6,解压缩到您的本地目录。 Makefile-libbz2_so是我们想要用于make的文件,我们想要更改gcc工具链参数,使其不使用常规操作系统gcc,而是使用$ NACL_SDK_ROOT /中的NaCl gcc工具链/ mac_x86_glibc / x86_64的-氯化钠/ 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 for Native Client

下载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 for Native Client

下载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目录,用于构建OpenCV Native Client代码的32/64位版本。

将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的所有OS系统调用。

为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

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中执行面部检测。