Google ARCore 学习——ARCore与人脸识别相结合

本文介绍了将Google ARCore与人脸识别技术相结合的实践过程。首先概述了ARCore的基础概念,包括运动跟踪、环境理解及光线估计。接着讲述了如何在Android环境下接入人脸识别SDK,并通过OpenGL获取并处理摄像头数据。在实现过程中遇到的图像横屏、上下翻转等问题也进行了讨论。最后,文章展示了如何加载带mtl的obj格式3D模型,并分享了在fbx模型转换和加载中遇到的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Google于8月份正式推出了ARCore,ARCore的介绍可以参见官网。作为ARKit的竞赛对手,ARCore有一个致命的缺点,就是支持的机型较少,目前只支持Google的Pixel和三星S8手机。不过刚好有一个Pixel手机。于是想要开发一个ARCore的应用,后来有了一个想法就是ARCore和人脸结合的Demo。

一、ARCore的基础概念
根据官网上的介绍,ARCore的核心功能是:
Motion tracking:allows the phone to understand and track its position relative to the world.
Environmental understanding: allows the phone to detect the size and location of flat horizontal surfaces like the ground or a coffee table.
Light estimation :allows the phone to estimate the environment’s current lighting conditions.

Environmental understanding功能如下所示
这里写图片描述
Light estimation 的效果如下所示
这里写图片描述

二、接入人脸识别
由于检测人脸的代码是之前项目中写的,所以使用Unity来实现不太好实现,所以选用Android对应的SDK。SDK地址:https://github.com/google-ar/arcore-android-sdk

首先看一下Demo中如何使用OpenGL实时渲染Camera数据的,整个流程位于BackgroundRenderer.class

    /**
     * This class renders the AR background from camera feed. It creates and hosts the texture
     * given to ARCore to be filled with the camera image.
     */
public class BackgroundRenderer {
   
   
    //可以看到这个定义了textureId,所以是通过surfaceTexture对摄像头的数据进行了处理
    private int mTextureId = -1;
    public void setTextureId(int textureId) {
        mTextureId = textureId;
    }

    public void createOnGlThread(Context context) {
        // Generate the background texture.
        int textures[] = new int[1];
        GLES20.glGenTextures(1, textures, 0);
        mTextureId = textures[0];
        //可以看到我们在这里生成了一个textureId。然后绑定纹理对象ID。
        GLES20.glBindTexture(mTextureTarget, mTextureId);
        ...
   }
   public void draw(Frame frame) {
        // If display rotation changed (also includes view size change), we need to re-query the uv
        // coordinates for the screen rect, as they may have changed as well.
        //这两行很重要,用来更新视图矩阵
        if (frame.isDisplayRotationChanged()) {
            frame.transformDisplayUvCoords(mQuadTexCoord, mQuadTexCoordTransformed);
        }

        // No need to test or write depth, the screen quad has arbitrary depth, and is expected
        // to be drawn first.
        GLES20.glDisable(GLES20.GL_DEPTH_TEST);
        //禁止向深度缓冲区写入数据
        GLES20.glDepthMask(false);

        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureId);

        // Restore the depth state for further drawing.
        
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值