有谁知道如何将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-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 for Native Client
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本机客户端代码。将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中执行人脸检测。