【问题标题】:How to port OpenCv to NaCl如何将 OpenCv 移植到 NaCl
【发布时间】:2013-04-03 21:39:08
【问题描述】:

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

【问题讨论】:

    标签: google-chrome opencv google-nativeclient


    【解决方案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。为了在本教程中更容易做到这一点,我们制作了以下环境变量:

    注意:如果文章中的某个链接失效,可以找到备用链接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 工具链参数,以便使用 $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
    

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

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

    1.4 本地客户端的 NaclMounts

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

    2。本机客户端的 OpenCV

    OpenCV 需要在交叉编译模式下构建,使用 cmake(OpenCV 的构建工具)轻松实现。我们设置 CMAKE_SYSTEM_NAME=Linux 来强制 Linux 目标的交叉编译。如果您已经在上一步中设置了环境变量,则会编写一个 OpenCV-nacl-cmake 脚本以促进构建过程。

    2.1 设置源码

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

    2.2 修补 OpenCV I/O 库 (persistance.cpp) / 排除应用程序的构建

    为了让 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
    

    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 中执行人脸检测的简单应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      相关资源
      最近更新 更多