适用于Android的Python的食谱dlib

时间:2019-07-16 18:36:07

标签: python android dlib

我正在尝试打包以python制成的应用程序以在Android上运行。我正在使用Dlib来识别面部和面部。要打包精确的应用程序,请生成供Buildozer使用的R4 P4a(适用于Android的Python)。 Revenue下载dlib,但无法编译和复制该库在Android上运行所需的依赖项。当我通过Buildozer -v android debug deploy运行运行Buildozer时,将打包应用程序并生成Apk,但是在Android上安装时,由于缺少Dlib库,它只能启动和关闭。

from pythonforandroid.recipe import CppCompiledComponentsPythonRecipe
import sh
from os.path import join
from multiprocessing import cpu_count
from pythonforandroid.logger import shprint
from pythonforandroid.util import current_directory


class DlibRecipe(CppCompiledComponentsPythonRecipe):
    site_packages_name = 'dlib'
    version = '19.17'
    url = 'http://dlib.net/files/dlib-{version}.zip'
    depends = ['opencv','numpy']
    call_hostpython_via_targetpython = False

    def get_lib_dir(self, arch):
        return join(self.get_build_dir(arch.arch), 'build', 'lib', arch.arch)

    def get_recipe_env(self, arch):
        env = super(DlibRecipe, self).get_recipe_env(arch)
        env['ANDROID_NDK'] = self.ctx.ndk_dir
        env['ANDROID_SDK'] = self.ctx.sdk_dir
        return env

    def build_arch(self, arch):
        build_dir = join(self.get_build_dir(arch.arch), 'build')
        shprint(sh.mkdir, '-p', build_dir)
        with current_directory(build_dir):
            env = self.get_recipe_env(arch)

            python_major = self.ctx.python_recipe.version[0]
            python_include_root = self.ctx.python_recipe.include_root(arch.arch)
            python_site_packages = self.ctx.get_site_packages_dir()
            python_link_root = self.ctx.python_recipe.link_root(arch.arch)
            python_link_version = self.ctx.python_recipe.major_minor_version_string
            if 'python3' in self.ctx.python_recipe.name:
                python_link_version += 'm'
            python_library = join(python_link_root,
                                  'libpython{}.so'.format(python_link_version))
            python_include_numpy = join(python_site_packages,
                                        'numpy', 'core', 'include')
            python_include_opencv = join(python_site_packages,
                                        'opencv', 'core', 'include')


            shprint(sh.cmake,
                    '-DP4A=ON',
                    '-DANDROID_ABI={}'.format(arch.arch),
                    '-DANDROID_STANDALONE_TOOLCHAIN={}'.format(self.ctx.ndk_dir),
                    '-DANDROID_NATIVE_API_LEVEL={}'.format(self.ctx.ndk_api),
                    '-DANDROID_EXECUTABLE={}/tools/android'.format(env['ANDROID_SDK']),

                    '-DCMAKE_TOOLCHAIN_FILE={}'.format(
                        join(self.ctx.ndk_dir, 'build', 'cmake',
                             'android.toolchain.cmake')),
                    # Make the linkage with our python library, otherwise we
                    # will get dlopen error when trying to import dlib's module.
                    '-DCMAKE_SHARED_LINKER_FLAGS=-L{path} -lpython{version}'.format(
                        path=python_link_root,
                        version=python_link_version),

                    '-DBUILD_WITH_STANDALONE_TOOLCHAIN=ON',
                    # Force to build as shared libraries the dlib's dependant
                    # libs or we will not be able to link with our python
                    '-DBUILD_SHARED_LIBS=OFF',
                    '-DBUILD_STATIC_LIBS=ON',

                    # Disable some dlib's features
                    '-DBUILD_dlib_java=OFF',
                    '-DBUILD_dlib_java_bindings_generator=OFF',
                    # '-DBUILD_dlib_highgui=OFF',
                    # '-DBUILD_dlib_imgproc=OFF',
                    # '-DBUILD_dlib_flann=OFF',
                    '-DBUILD_TESTS=OFF',
                    '-DBUILD_PERF_TESTS=OFF',
                    '-DENABLE_TESTING=OFF',
                    '-DBUILD_EXAMPLES=OFF',
                    '-DBUILD_ANDROID_EXAMPLES=OFF',

                    # Force to only build our version of python
                    '-DBUILD_DLIB_PYTHON{major}=ON'.format(major=python_major),
                    '-DBUILD_DLIB_PYTHON{major}=OFF'.format(
                        major='2' if python_major == '3' else '3'),

                    # Force to install the `dlib.so` library directly into
                    # python's site packages (otherwise the dlib's loader fails
                    # on finding the dlib.so library)
                    '-DDLIB_SKIP_PYTHON_LOADER=OFF',
                    '-DDLIB_PYTHON{major}_INSTALL_PATH={site_packages}'.format(
                        major=python_major, site_packages=python_site_packages),

                    # Define python's paths for: exe, lib, includes, numpy...
                    '-DPYTHON_DEFAULT_EXECUTABLE={}'.format(self.ctx.hostpython),
                    '-DPYTHON{major}_EXECUTABLE={host_python}'.format(
                        major=python_major, host_python=self.ctx.hostpython),
                    '-DPYTHON{major}_INCLUDE_PATH={include_path}'.format(
                        major=python_major, include_path=python_include_root),
                    '-DPYTHON{major}_LIBRARIES={python_lib}'.format(
                        major=python_major, python_lib=python_library),
                    '-DPYTHON{major}_NUMPY_INCLUDE_DIRS={numpy_include}'.format(
                        major=python_major, numpy_include=python_include_numpy),
                    '-DPYTHON{major}_PACKAGES_PATH={site_packages}'.format(
                        major=python_major, site_packages=python_site_packages),


                    self.get_build_dir(arch.arch),
                    _env=env)
            # Install python bindings (dlib.so)
            shprint(sh.cmake, '-DCOMPONENT=python', '-P', './cmake_install.cmake')
            # Copy third party shared libs that we need in our final apk
            #sh.cp('-a', sh.glob('./lib/{}/lib*.so'.format(arch.arch)),
             #     self.ctx.get_libs_dir(arch.arch))

recipe = DlibRecipe()

0 个答案:

没有答案