如何用AR引擎技术, 5步优雅实现物体识别和跟踪

article/2025/9/11 18:07:31

AR技术让应用实现虚拟世界和现实世界的融合,让开发者的创意和脑洞能够拥有更多炫酷有趣的呈现方式。AR拍照、AR购物、AR教育、AR搜索等丰富应用场景,凭借着AR技术的加持,为用户带来更优质的沉浸式体验,为用户创造更多价值。

例如,在运动健身应用中,AR的人体识别技术,能精准识别用户健身操练时的姿态是否符合规范动作,从而达到有效健身的作用;

博物馆等展览展厅,AR技术也大有用处,用户在参览展品过程中,通过识别展品,手机根据识别出的展品自动呈现展品介绍信息,辅助用户参观;……

下面手把手教你,如何运用华为AR Engine 快速实现简单的物体识别和跟踪。

效果示例

1

 

基本原理和实现步骤

物体识别通过对图像中的物体进行识别辨认,从而报告出物体在图像所呈现场景中的位置和方向。

实现步骤:

  • 图片预处理:在图像预处理环节,通过编码、阈值及滤波、改善模式、离散模式运算等基本运算方式,在尽可能保留图像所有内容信息的基础上,整理突出图像特征,以达到最佳图像特征提取的状态。
  • 图像特征提取:经过预处理的图像在特征提取环节,提取出价值高的特征,使高维特征空间拥有更好的分离性,更便于进行算法识别。图像特征提取一般细分成几个模块来进行:灰度值、亮度值、形状、纹理等视觉上的基本特征提取;基于像素点颜色的颜色特征提取;物体纹理及结构材质的纹理特征提取;基于轮廓和基于区域的形状特征提取;以及图像分割出的多个目标之间空间位置关系信息的空间特征提取。
  • 特征选择:特征提取后,可根据具体物体识别情况进行特征选择。比如在特征种类繁多、物体种类多的情况下,通过特征选择找到各个特征适配的场合。
  • 建模:特征选择之后,在建模环节建立特征集合,分辨异同点,提取相同点,主要建模对象是特征与特征之间的空间结构关系。
  • 匹配:匹配环节是用模型去识别匹配新图像,识别图像属于哪类物体,条件符合可将物体与图像其他部分分离。
  • 定位:物体识别后进行对目标物体的定位,即将识别到的物体坐标与实际物理空间坐标结合起来,之后可以进行对应的跟踪和模型叠加处理。

AR Engine提供三大能力

华为AR Engine提供的三大能力分别是运动跟踪、环境跟踪、人体和人脸跟踪。

  1. 运动跟踪主要通过终端设备摄像头标识特征点,并跟踪这些特征点的移动变化,来不断跟踪终端设备位置和姿态。
  2. 环境跟踪可以识别平面,如地面、墙壁等,也可估测平面周围的光照强度。
  3. 人体和人脸跟踪让终端设备具备了对人的理解能力。通过定位人的手部位置和对特定手势的识别,可将虚拟物体或内容特效放置在人的手上;结合深度器件,还可精确还原手部的21个骨骼点的运动跟踪,做更为精细化的交互控制和特效叠加;当识别范围扩展到人的全身时,可利用识别到的23个人体关键位置,实时的检测人体的姿态,为体感和运动健康类的应用开发提供能力支撑。
     

开发准备

Maven仓和SDK的配置步骤可以参考开发者网站中的应用开发介绍

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/preparations-0000001059812995?ha_source=hms1

在AndroidManifest.xml中添加权限

打开main中的AndroidManifest.xml文件,在<application 前添加对相机的权限声明,需要注意的是代码中还需要动态进行权限申请,否则会有Permission Denied报错

<uses-permission android:name="android.permission.CAMERA" />

开发步骤

配置MainActivity的显示效果

首先通过 MainActivity extends Activity implements GLSurfaceView.Renderer创建MainActivity,在MainActivitylayout文件中新建一个GLSurfaceView,用于显示摄像头拍摄的实时画面,提供给AREngine进行识别:

<android.opengl.GLSurfaceViewandroid:id="@+id/surfaceview"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_gravity="top" />

在MainActivity的onCreate阶段进行SurfaceView的配置:

private GLSurfaceView mSurfaceView;private static final int CONFIG_CHOOSER_RED_SIZE = 8;
private static final int CONFIG_CHOOSER_GREEN_SIZE = 8;
private static final int CONFIG_CHOOSER_BLUE_SIZE = 8;
private static final int CONFIG_CHOOSER_ALPHA_SIZE = 8;
private static final int CONFIG_CHOOSER_DEPTH_SIZE = 16;
private static final int CONFIG_CHOOSER_STENCIL_SIZE = 0;
private static final int OPENGLES_VERSION = 2;mSurfaceView = findViewById(R.id.surfaceview);
mSurfaceView.setPreserveEGLContextOnPause(true);
mSurfaceView.setEGLContextClientVersion(OPENGLES_VERSION);
mSurfaceView.setEGLConfigChooser(CONFIG_CHOOSER_RED_SIZE, // Alpha used for plane blending.CONFIG_CHOOSER_GREEN_SIZE,CONFIG_CHOOSER_BLUE_SIZE,CONFIG_CHOOSER_ALPHA_SIZE,CONFIG_CHOOSER_DEPTH_SIZE,CONFIG_CHOOSER_STENCIL_SIZE); // Alpha used for plane blending.
mSurfaceView.setRenderer(this);
mSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

加载一张框图文件,用于标记识别的位置,引导用户进行物体识别:

fitToScanView = findViewById(R.id.image_view_fit_to_scan);
InputStream bitmapstream;
try {bitmapstream = getAssets().open("fit_to_scan.png");
} catch (IllegalArgumentException | IOException e) {Log.d(TAG, "open bitmap failed!");return;
}
Bitmap bitmap = BitmapFactory.decodeStream(bitmapstream);
fitToScanView.setImageBitmap(bitmap);

AREngine检测和配置权限申请

物体识别功能的使用需要设备支持AREngine,并且已经安装了AREngine的APK包,所以要对运行的设备进行判断,是否支持该功能

private boolean arEngineAbilityCheck() {boolean isInstallArEngineApk = AREnginesApk.isAREngineApkReady(this);if (!isInstallArEngineApk && isRemindInstall) {Toast.makeText(this, "Please agree to install.", Toast.LENGTH_LONG).show();finish();}Log.d(TAG, "Is Install AR Engine Apk: " + isInstallArEngineApk);if (!isInstallArEngineApk) {//Code of jumping to AppGallery to download the APKisRemindInstall = true;}return AREnginesApk.isAREngineApkReady(this);
}

AREngine检测完成之后,再进行相机权限的动态申请

private static final String[] PERMISSIONS_ARRAYS = new String[]{Manifest.permission.CAMERA};
public static void requestPermission(final Activity activity) {Log.d(TAG, "requestPermission >>");for (String permission : PERMISSIONS_ARRAYS) {if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {permissionsList.add(permission);}}ActivityCompat.requestPermissions(activity,permissionsList.toArray(new String[permissionsList.size()]),REQUEST_CODE_ASK_PERMISSIONS);Log.d(TAG, "requestPermission <<");
}

以上步骤完成之后,说明设备支持AREngine的物体识别功能,并且已经获得了相机的使用权限,接下来就可以创建ARSession,并进行识别数据库的配置

配置物体识别数据库

在进行物体识别之前,要将想识别的对象的图片添加到数据库中,使用的是ARAugmentedImageDatabase,创建一个boolean函数,进行数据库的图片添加,并给后续是否进行识别作判断:

private boolean setupAugmentedImageDatabase(ARWorldTrackingConfig config) {ARAugmentedImageDatabase augmentedImageDatabase;Optional<Bitmap> augmentedImageBitmapOptional = loadAugmentedImageBitmap();Bitmap augmentedImageBitmap = null;if (augmentedImageBitmapOptional.isPresent()) {augmentedImageBitmap = loadAugmentedImageBitmap().get();} else {return false;}if (augmentedImageBitmap == null) {return false;}augmentedImageDatabase = new ARAugmentedImageDatabase(mSession);augmentedImageDatabase.addImage("image_name", augmentedImageBitmap);config.setAugmentedImageDatabase(augmentedImageDatabase);String text = String.format(Locale.ROOT, "has set ImageNum: %d", augmentedImageDatabase.getNumImages());messageSnackbarHelper.showMessage(this, text);return true;}

所添加的识别图片源可以放置在Assets文件夹内,通过InputStream打开为Bitmap的格式

private Optional<Bitmap> loadAugmentedImageBitmap() {try (InputStream is = getAssets().open("cup.jpg")) {return Optional.of(BitmapFactory.decodeStream(is));} catch (IOException e) {Log.e(TAG, "IO exception loading augmented image bitmap.", e);}return Optional.empty();
}

配置识别后显示效果

在MainActivity的onDrawFrame中配置识别到物体之后的显示效果,在检测到要识别的物体后,用一个方框将识别的物体标识出来。

public void onDrawFrame(GL10 unused) {Log.d(TAG, "onDrawFrame >>");GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);if (mSession == null) {Log.d(TAG, "onDrawFrame mSession is null");return;}try {ARFrame frame = mSession.update();ARCamera camera = frame.getCamera();if (camera.getTrackingState() == ARTrackable.TrackingState.PAUSED) {return;}Log.d(TAG, "ARTrackable.TrackingState" + camera.getTrackingState());drawAugmentedImages(frame, projmtx, viewmtxs, colorCorrectionRgbas);} catch (Throwable t) {Log.e(TAG, "Exception on the OpenGL thread", t);}Log.d(TAG, "onDrawFrame <<");
}

判断是否识别到物体时,调用ARAugmentedImage的getTrackingStatus方法,如果是TRACKING的话,则为识别到了

switch (augmentedImage.getTrackingState()) {case TRACKING:augmentedImageRenderer.draw(viewmtxs, projmtx, augmentedImage, centerAnchor, colorCorrectionRgbas);break;default:break;
}

之后通过getCenterPose获取物体的中心位置信息,将边框添加到显示中

anchorPose = augmentedImage.getCenterPose();
float scaleFactor = 1.0f;
float[] modelMatrixs = new float[MODEL_MATRIX_SIZE];
float[] tintColors = convertHexToColor(TINT_COLORS_HEXS[augmentedImage.getIndex() % TINT_COLORS_HEXS.length]);
worldBoundaryPoses[0].toMatrix(modelMatrixs, 0);
imageFrameUpperLeft.updateModelMatrix(modelMatrixs, scaleFactor);
imageFrameUpperLeft.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColors);
worldBoundaryPoses[1].toMatrix(modelMatrixs, 0);
imageFrameUpperRight.updateModelMatrix(modelMatrixs, scaleFactor);
imageFrameUpperRight.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColors);
worldBoundaryPoses[2].toMatrix(modelMatrixs, 0);
imageFrameLowerRight.updateModelMatrix(modelMatrixs, scaleFactor);
imageFrameLowerRight.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColors);
worldBoundaryPoses[3].toMatrix(modelMatrixs, 0);
imageFrameLowerLeft.updateModelMatrix(modelMatrixs, scaleFactor);
imageFrameLowerLeft.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColors);

 

 

>>访问华为AR Engine 官网,了解更多相关内容

>>获取华为AR Engine 开发指导文档

>>华为AR Engine开源仓库地址:GitHub 、Gitee

>>访问华为开发者联盟官网,了解更多相关内容

>>获取开发指导文档

>>华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解华为移动服务最新技术资讯~

 


http://chatgpt.dhexx.cn/article/r1c3txbT.shtml

相关文章

物体识别全流程(Ubuntu16.04)结合ROS

物体识别全流程&#xff08;Ubuntu16.04&#xff09;结合ROS 1.使用labellmg&#xff0c;标记图片&#xff0c;生成xml标签 在此下载labellmg包 下载之后解压到要放置的目录 推荐使用Python3Qt5 打开labellmg包 在当前目录终端下运行如下命令行 sudo apt-get install pyqt5-…

opencv人脸识别以及自定义物体识别系统

目录 一、简介&#xff1a; 二、软硬件应用&#xff1a; 三、模块介绍&#xff1a; &#xff08;一&#xff09;人脸识别&#xff1a; &#xff08;二&#xff09;、自定义物体识别&#xff1a; &#xff08;三&#xff09;、图片展示&#xff1a; &#xff08;四&#x…

opencv物体识别-识别水果

前言 玩一玩用opencv做一些简单的物体识别 1.思路讲解 我们基于简单的opencv的阈值分割&#xff0c;通过这个阈值分割&#xff0c;我们能把我们需要识别的物体在二值图里面变成白色&#xff0c;其余的变成黑色。然后对我们分割出来的物体部分提取轮廓&#xff0c;算出覆盖轮…

物体识别

一、物体识别 图像识别&#xff1a;很重要&#xff0c;是很多算法的基础 图像识别定位&#xff1a;识别出来是猫&#xff0c;且定位出猫的位置 物体检测&#xff1a;每个图像中含有多物体&#xff0c;检测出有几个个体&#xff0c;并框出来位置 图像分割&#xff1a;不仅仅框…

【AI技术】物体识别概述1

【AI技术】物体识别概述1 1、背景2、物体识别3、应用 1、背景 主要针对客户以及初学者概述物体识别。 2、物体识别 物体识别又叫目标识别&#xff0c;物体分类&#xff0c;图像分类&#xff0c;习惯性称为图像分类&#xff0c;即对整张图片进行分类。 物体识别针对的是物体分…

目标检测和物体识别的方法有哪些?如何进行物体定位和分类?

目标检测和物体识别是计算机视觉领域中重要的任务&#xff0c;旨在从图像或视频中自动定位和识别出不同类别的物体。这些任务在许多应用领域中具有广泛的应用&#xff0c;如自动驾驶、视频监控、人机交互等。本文将介绍目标检测和物体识别的方法以及如何进行物体定位和分类。 一…

小程序 跳转 公众号 文章

1.通过组件 web-view https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html <web-view src"https://mp.weixin.qq.com/s/Cz4x4QpvF_Pozn7xjYOVyw"></web-view>2.如果是关联好小程序的公众号 1.如果是 左图文章 都是 https://m…

微信小程序跳转公众号h5页面

小程序提供了web- view组件进行用来内嵌网页 根据限制说明准备域名即可&#xff0c;开发阶断可以使用http的域名&#xff0c;在开发者工具中勾选不验证https证书即可&#xff0c;发布上线时必须使用https的域名。 同时需要小程序后台配置业务域名。

微信小程序跳转微信公众号

1 webview 嵌套 微信公众号的页面 然后 文章里 添加 公众号二维码 然后引导用户长按识别公众号 2 公众号有关注的页面 路径 需要自己找 我记得是替换什么officeid啥的 百度即可 3 利用<official-account bindload"lookSuccess" binderror"lookFai…

微信小程序跳转公众号

长按识别跳转 步骤&#xff1a; 新建一个页面使用web-view组件的src链接到公众号编辑好的一篇带有公众号的二维码的文章 微信规则只有小程序关联的公众号里的文章可以长按识别二维码 <template><view><!--微信规则只有小程序关联的公众号里的文章可以长按识别…

小程序直接跳转公众号的必要条件记录

1、小程序必须关联公众号主体&#xff0c;可以从图1查看是否已被关联&#xff0c;如果没有被关联&#xff0c;则可以去图2进行关联 图1&#xff1a; 图2&#xff1a;登录微信公众平台&#xff0c;进入图片广告-小程序管理&#xff0c;进行关联 2.小程序不能直接打开公众号首…

小程序跳转公众号文章

这是首页的代码 <image class"seedingBannar" data-id"{{item.id}}" bindtap"goTweet" src"{{resourceUrlitem.iconPath}}"></image>// 跳转到推文页面goTweet: function (e) {console.log(e.currentTarget.dataset.id)wx…

uni-app微信小程序跳转公众号;微信小程序打开公众号;微信小程序识别二维码添加好友;微信小程序通过公众号添加好友;小程序里识别企业微信二维码点击联系人名片无反应?

需求&#xff1a; 在微信小程序页面中&#xff0c;长按识别图片二维码&#xff0c;识别出联系人后&#xff0c;点击添加好友&#xff1b; 问题&#xff1a;微信官方社区说是小程序添加不了好友&#xff1b; 解决方案&#xff1a; 目前只能通过微信小程序跳转至公众号&#xf…

uniapp写小程序跳转公众号H5链接

需求&#xff1a; 需求是小程序的首页banner图来自pc端配置生产。 在小程序点击轮播的banner图后&#xff0c;跳到对应的linkurl&#xff0c;但是我们和客户约定好&#xff0c;只能跳转公众号。 一开始看了小程序的文档&#xff0c;需要配置什么业务域名&#xff0c;下载校验…

微信小程序如何跳转微信公众号

目录 一、微信公众号配置二、微信小程序配置三、添加代码 一、微信公众号配置 登录微信公众号&#xff0c;点击【小程序管理】&#xff1a; 点击【添加】&#xff1a; 点击【关联小程序】&#xff1a; 输入小程序进行关联&#xff1a; 二、微信小程序配置 登录微信小程序…

小程序跳转公众号关注页面的两种方法

一、web-view方法 这个种方法有一个必须要达到的条件就是&#xff1a;小程序的公众号必须是认证的企业号&#xff0c;而且要在小程序公众号的后台添加“veb-view业务域名”&#xff01;不然会出现如下情况 <!--pages/webview666/webview.wxml--> <view class"ty…

小程序 小程序跳转公众号页面

web-view 基础库 1.6.4 开始支持&#xff0c;低版本需做兼容处理。 承载网页的容器。会自动铺满整个小程序页面&#xff0c;个人类型的小程序暂不支持使用。 客户端 6.7.2 版本开始&#xff0c;navigationStyle: custom 对 web-view 组件无效 小程序插件中不能使用。 属性类…

微信小程序跳转公众号推文

注&#xff1a;笔者是自学小程序&#xff0c;自身开发经验不足&#xff0c;代码肯定存在不规范和不足&#xff0c;该博客参考一下就好 完整项目代码&#xff1a;https://github.com/zim-keavin/wxapp-cloud-demo 实现在小程序中&#xff0c;点击某个组件后跳转到公众号的推文…

微信小程序跳转公众号链接

小程序跳转微信公众号文章&#xff0c;是通过web-view实现的。 1.web-view会默认自动打开所跳转的页面&#xff0c;但我们一般项目需求是点击某一按钮或下一步进行跳转&#xff0c;所以在小程序中我们需要新建一个页面来承载web-view 在页面点击按钮后跳转至承载页面&#xff0…

React + Taro 小程序跳转公众号

Taro小程序跳转公众号的文章 步骤&#xff1a;登录公众号后台-小程序-小程序管理-添加-关联小程序 关联后就可以在微信的公众平台查看(设置-关联设置-关联公众号) 如图所示&#xff1a; 然后使用web-view 我这个是使用广告轮播实现的代码如下 注意&#xff1a;一个页面使用…