有谁知道如何将OpenCV移植到NaCl?我正在尝试基于人脸识别进行Chrome扩展。我将不胜感激。
答案 0 :(得分:6)
下面的详细说明已经从(现已解散的 metacaptcha.com/install_opencv_nacl )转发,以方便使用。
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
下载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
下载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
下载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
下载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
OpenCV需要在交叉编译模式下构建,以便使用cmake(OpenCV的构建工具)轻松实现。我们设置CMAKE_SYSTEM_NAME = Linux以强制对Linux目标进行交叉编译。如果您已经在上一步中设置了环境变量,那么编写OpenCV-nacl-cmake脚本是为了便于构建过程。
下载OpenCV 2.4.2,opencv-nacl-cmake script 将OpenCV解压缩到您的本地目录。
在OpenCV-2.4.2 /中创建nacl/m32
,nacl/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
使用以下参数运行./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中执行面部检测。