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

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://www.rhkb.cn/news/41222.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主流AR眼镜参数对比、AR SDK最全功能特性对比

1、主流AR眼镜参数对比 最近有好多小伙伴分享了干货&#xff0c;成员LalaLand分享了一个目前市场主流AR眼镜参数对比&#xff08;扫码可查看原文&#xff09;: 1、Hololens 2 2、Magic Leap 1 3、Nreal Light 4、Spectacles 2021 2、移动AR SDK 功能特性最全比较 本次…

web端实现AR人脸特效

前言 直播、短视频、在线会议等应用越来越多地进入人们的生活&#xff0c;随之诞生的是丰富的各类创意玩法与新鲜体验&#xff0c;其中大量应用了以AI检测和图形渲染为基础的AR技术。 而随着Web技术的不断成熟&#xff0c;AR技术在Web上的实现成为了一种可能。今天就总结了在…

DataFunCon:2021热点技术和未来趋势预测

12月18-19日&#xff0c;由DataFun主办的DataFunCon 2021&#xff0c;将如期而至&#xff01;本次大会由百度深圳研发中心自然语言处理部技术总监 何径舟、腾讯云大数据产品中心研发副总经理 雷小平、腾讯信息平台与服务业务线AI算法负责人 文镇、达摩院人工智能科学家 杨红霞等…

未来计算的十大趋势预测,你觉得能中几条?

作者 | Adrian Mouat 译者 | 平川 本文最初发布于 Container Solutions WASM 将无所不在&#xff1a;编译目标、部署目标、IoT、插件生态系统。这是正在发生的事。&#xff08;1 到 5 年&#xff09; Rust 的流行度将继续增加&#xff0c;未来几年有望在 RedMonk 排行榜上超…

未来的趋势————以ChatGPT为标杆的AI对生活的影响是巨大的

文章目录 前言1.AI的发展历程2.我是如何接触到人工智能的概念和产品的3.对于ChatGPT的一点看法4.AI对大学毕业生的职业发展的利与弊5.对于AI的思考和问题 前言 随着ChatGPT的爆火&#xff0c;生成式AI&#xff0c;大模型的人工智能被越来越多的人注意到&#xff0c;同时他也带…

2023年五大趋势预测 | 大数据分析、人工智能和云产业展望

随着我们迈入2023年&#xff0c;大数据分析、人工智能和云产业将迎来蓬勃的创新和发展阶段 以下是我们预测的&#xff0c;将对行业格局产生重大影响的五大趋势&#xff1a; 世界在剧变&#xff0c;我们需要尽快寻找行业中的方向&#xff0c;迅速重回轨道 2023年&#xff0c;全…

快收藏!手把手教你用AI绘画

点个关注&#x1f446;跟腾讯工程师学技术 最近看到一篇有趣的文章&#xff0c;一副名为《太空歌剧院》&#xff08;如下图&#xff09;的艺术品在某美术比赛上&#xff0c;获得了第一名的成绩&#xff0c; 有意思的是这件作品是通过AI来实现的画作&#xff0c; 顿时觉得非常神…

用K8s的公司有多少人会部署K8s?

作者&#xff1a;51CTO技术栈 译者 | 布加迪 Kubernetes是如今最知名最流行的容器编排引擎。Kubernetes之所以成为云原生计算的中心&#xff0c;是由于它是开源的&#xff0c;还有一个快速增长的生态系统。如果观察它在过去几年的发展和采用趋势&#xff0c;尤其是在云原生世界…

LLM_StableDiffusion_studio发布

背景&#xff1a; 从chatgpt发布到现在已经超过半年时间&#xff0c;AGI的势头越来越猛。大家都在做各种的尝试和组合&#xff0c;把chatgpt通用的强大的知识表达和理解能力尝试应用在自己的业务场景。前期也是出现非常多的业务应用&#xff0c;但是主要还是围绕chatgpt本身已…

智能AI抢了元宇宙的风头?

前几天&#xff0c;微博突然出现这么一条热搜。 #ChatGPT官方APP登录美国苹果应用商店 这绝对是一条相当火爆的新闻&#xff0c;因为这意味着智能聊天机器人ChatGPT终于有自己的App了。值得一提的是&#xff0c;ChatGPT不仅仅登录了美国苹果应用商店&#xff0c;而且下载量迅…

AI VS 好莱坞?新时代电影工作流;MJ制作微信表情包的麻瓜教程;关于ControlNet的一切;AI创业真钱景 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『OpenAI通过了一大批GPT-4申请』大量放号ing~快去看邮箱&#xff01; &#x1f916; 『小马智行 | 广州南沙区开启车内无安全员的自动…

C++ 正在向 C 发起“进攻”!TIOBE 7 月榜单发布

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一月一度的 TIOBE 榜单又发布了&#xff0c;快来看看 7 月的编程语言排行榜有什么最新变化吧&#xff01; C 正在向 C 发起“进攻”&#xff01; 自从去年 12 月 C 在 TIOBE 排名历史上首次超过 Java…

chatgpt赋能python:Python访问Word文档的方法

Python访问Word文档的方法 在现代社会&#xff0c;文档是人们日常生活和工作中必不可少的一部分。特别是在办公和教育中&#xff0c;Word文档被广泛使用。Python是目前应用最广泛的编程语言之一&#xff0c;在一些编程任务中&#xff0c;需要访问和修改Word文档。在这篇文章中…

chatgpt赋能python:Python处理Word文档

Python处理Word文档 介绍 Microsoft Word是业界最流行的办公文档编辑工具之一。对于文档处理工作&#xff0c;Word是必不可少的工具之一。然而&#xff0c;尽管Word是十分强大的&#xff0c;但在处理大量数据时&#xff0c;手动处理每个文件是费时费力的。幸运的是&#xff0…

chatgpt赋能python:Python下载jieba:优化中文分词的必备工具

Python下载jieba&#xff1a;优化中文分词的必备工具 在中文自然语言处理的领域中&#xff0c;分词是一项基础且重要的任务。jieba是一个优秀的中文分词组件&#xff0c;它支持三种分词模式&#xff0c;并且具有高效、准确、易用等优点。本文将介绍如何通过Python来下载jieba&…

为什么ChatGPT非得用强化学习,而不直接用监督学习?

为什么ChatGPT非得用强化学习&#xff0c;而不直接用监督学习&#xff1f;原因不是那么显而易见。OpenAI联合创始人、ChatGPT主要负责人John Schulman分享了OpenAI在人类反馈的强化学习&#xff08;RLHF&#xff09;方面的进展&#xff0c;分析了监督学习和强化学习各自存在的挑…

大咖,我能转行做UX设计师吗?

前几天&#xff0c;有个朋友找到我&#xff0c;叫我给分析下他适不适合转UX设计。他的专业是建筑设计&#xff0c;之所以要辞职&#xff0c;也就是公司破事多&#xff0c;老板又不看重他。看到UX设计这个行业的前景很不错&#xff0c;想要转行。他说的也没错&#xff0c; 现在的…

想成为一名成功的UX设计师吗?做好这13件事情吧

以下内容由Mockplus团队翻译整理&#xff0c;仅供学习交流&#xff0c;Mockplus是更快更简单的原型设计工具。 丢掉那些阻碍你前进的东西 每个人对成功的定义都不同。如果想在重要事情上取得成功&#xff0c;学会给予才是关键。只有放弃一些阻碍你前进的东西&#xff0c;你才能…

人工智能在医学影像中的研究与应用

人工智能在医学影像中的研究与应用 韩冬, 李其花, 蔡巍, 夏雨薇, 宁佳, 黄峰 沈阳东软医疗系统有限公司&#xff0c;辽宁 沈阳 110167 慧影医疗科技&#xff08;北京&#xff09;有限公司&#xff0c;北京 100192 东软集团股份有限公司&#xff0c;辽宁 沈阳 110179 摘要&#…

人工智能在癌症和精准医学领域的研究

目录 介绍 卷积神经网络&#xff1a;图像分类的主力军 从其他大型数据集生成预测模型 数据质量和模型选择是关键 癌症的早期检测、诊断和分期 使癌症诊断更准确 癌症分期和分级 在早期癌症检测的道路上 使用机器学习检测癌症突变 充分利用突变 确定来源的肿瘤细胞 表…