Unity_AR技术之ARCore图片识别功能

1、概述

针对AR界的图片识别功能大致有3家;

1、ARkit:苹果的开发AR的SDK;

2、ARCore:GoogleAR的开发SDK;

3、Vuforia:高通的AR开发SDK;

以上SDK都有实现图片识别的功能,但是各有特点。

ARkit只针对苹果ios开发,可以实现图片的锚点定位,并且相机可以实现在现实空间中的移动;

ARCore开发Android,和ios,同样能实现ARkit的功能,目前支持的手机机型有限;

Vuforia高通的ARSDK基本的功能就是图片识别,稳定性也不错,只是它不能实现相机的现实空间的交互;

ARkit和Vuforia的教程在网上有很多,今天就着重讲一下ARcore的图像识别功能的实现。

2.ARCore增强图片功能

https://developers.google.cn/ar/develop/unity/augmented-images/Google官方的图片识别的展示与基本入门

被识别的图片以及一些配置要求等请参考上面的官方网站

下载ARCoreSDKForUnity地址:GitHub - google-ar/arcore-unity-sdk: ARCore SDK for Unity

3、新建一个unity工程,将下载好的SDK导入到unity中


会增加这两个文件夹

然后新建一个unity场景:这里就命名为ARCoreImageScene

官方的例子功能是扫描一个图片后会在图片位置实例化一个对象,而且官方的脚本不能确定扫描的图片和此图片的对应的对象是那个;

这里就实现官方没有的功能:

1、扫描图片让想要出现的对象显示,而不是实例化出来

2、实现扫描不同的图片显示出此图片对应的对象

3、添加重置位置的功能(AR的通病:会因为不同原因可能造成不同程度的对象偏移),这样就需要在偏移后重置隐藏对象并再次扫描图片使其回到原来的位置

3.1场景内容



场景的内容:

1:重置对象位置的功能按钮

2:实现AR扫描工能的控制对象

3:ARCore功能实现的必要对象体(官方的预设体相当AR相机)

4:扫描图片出现的对象

5:扫面过程提示框(扫描到后框隐藏,反之显示。。这个也是官方的工能可以参见官方demo或者说明)

3.2功能的实现

1、首先配置文件

1.0创建场景AR工能管理器

新建一个这个命名为ImageSessionConfig


plane Finding mode :Disable

1.1创建识别的图片库

选中要使用的图片右键创建上图文件命名ARCoreImage


点击刚创建的图片库配置内容

Name:识别图片的名字

Width:图片在现实中的尺寸单位米(这个要接近现实,对于对象的放置有影响)

Quality:图片可被识别的质量,评分越高越好,建议不要低于60

这个图片库中是有顺序的,图片会有一个参数DatabaseIndex是后面我们要用到的一个用来区别不同图片对应不同对象的参数。


配置好的图片库按照上图拖到相应位置


然后配置场景ARCoreDevice

1.2核心控制脚本

新建一个脚本ARCoreImageContoller.cs挂在到上图1上;

上图3:扫描图片会出现的对象拖拽到此 (注意:此处对象的顺序就是图片库的顺序这样才能使扫描的图片对应相应的对象)

上图4:扫描的那个提示范围框拖到此


新建脚本AugmentedImageVisualizerOverride.cs.挂在到扫描图片需要显示的对象上,用来收集一些数据属性等内容的脚本。可能会被使用的内容:图片的属性啥的用来判断用


按照官方的PlayerSeting配置好,打包APK测试吧


上脚本:

ARCoreImageContoller.cs


//-----------------------------------------------------------------------

// <copyright file="AugmentedImageExampleController.cs" company="Google">

//

// Copyright 2018 Google Inc. All Rights Reserved.

//

// Licensed under the Apache License, Version 2.0 (the "License");

// you may not use this file except in compliance with the License.

// You may obtain a copy of the License at

//

// http://www.apache.org/licenses/LICENSE-2.0

//

// Unless required by applicable law or agreed to in writing, software

// distributed under the License is distributed on an "AS IS" BASIS,

// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

// See the License for the specific language governing permissions and

// limitations under the License.

//

// </copyright>

//-----------------------------------------------------------------------

namespace GoogleARCore.Examples.AugmentedImage

{

    using System.Collections.Generic;

    using System.Runtime.InteropServices;

    using GoogleARCore;

    using UnityEngine;

    using UnityEngine.UI;


    public class ARCoreImageController : MonoBehaviour

    {

        [Header("Drag Augmented Image prefab to this")]

        public List<AugmentedImageVisualizerOverride>  AugmentedImageVisualizerPrefab;

        [Header("Drag FitToScanOverlay to this")]

        public GameObject FitToScanOverlay;

        private Dictionary<int, AugmentedImageVisualizerOverride> m_Visualizers

            = new Dictionary<int, AugmentedImageVisualizerOverride>();

        private List<AugmentedImage> m_TempAugmentedImages = new List<AugmentedImage>();


        public void Update()

        {


            if (Input.GetKey(KeyCode.Escape))

            {

                Application.Quit();

            }


            if (Session.Status != SessionStatus.Tracking)

            {

                return;

            }


            Session.GetTrackables<AugmentedImage>(m_TempAugmentedImages, TrackableQueryFilter.Updated);


            foreach (var image in m_TempAugmentedImages)

            {

                Debug.Log("name1111111" + image.Name);

                Debug.Log("index1111111" + image.DatabaseIndex);

                AugmentedImageVisualizerOverride visualizer = null;

                m_Visualizers.TryGetValue(image.DatabaseIndex, out visualizer);

                if (image.TrackingState == TrackingState.Tracking && visualizer == null)

                {


                    Debug.Log("name" + image.Name);

                    Debug.Log("index" + image.DatabaseIndex);

                    Anchor anchor = image.CreateAnchor(image.CenterPose);


                    visualizer =AugmentedImageVisualizerPrefab[image.DatabaseIndex];

                    visualizer.gameObject.SetActive(true);


                    visualizer.transform.parent = anchor.transform;

                    visualizer.transform.localPosition = Vector3.zero;

                    visualizer.transform.localRotation = new Quaternion(0,0,0,0);

                    visualizer.transform.parent = null;

                    visualizer.Image = image;

                    m_Visualizers.Add(image.DatabaseIndex, visualizer);



                }

          }


            foreach (var visualizer in m_Visualizers.Values)

            {

                if (visualizer.Image.TrackingState == TrackingState.Tracking)

                {

                    FitToScanOverlay.SetActive(false);

                    return;

                }

            }


        }

        //重置位置方法

        public void OnclickRe(int index)

        {

            AugmentedImageVisualizerOverride visualizer = null;

            m_Visualizers.TryGetValue(index, out visualizer);

            if (visualizer!=null)

            {

                m_Visualizers.Remove(index);

                visualizer.gameObject.SetActive(false);

                FitToScanOverlay.SetActive(true);

            }

        }

    }

}



AugmentedImageVisualizerOverride.cs


//-----------------------------------------------------------------------

// <copyright file="AugmentedImageVisualizer.cs" company="Google">

//

// Copyright 2018 Google Inc. All Rights Reserved.

//

// Licensed under the Apache License, Version 2.0 (the "License");

// you may not use this file except in compliance with the License.

// You may obtain a copy of the License at

//

// http://www.apache.org/licenses/LICENSE-2.0

//

// Unless required by applicable law or agreed to in writing, software

// distributed under the License is distributed on an "AS IS" BASIS,

// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

// See the License for the specific language governing permissions and

// limitations under the License.

//

// </copyright>

//-----------------------------------------------------------------------

namespace GoogleARCore.Examples.AugmentedImage

{

    using System;

    using System.Collections.Generic;

    using System.Runtime.InteropServices;

    using GoogleARCore;

    using GoogleARCoreInternal;

    using UnityEngine;

    /// <summary>

    /// Uses 4 frame corner objects to visualize an AugmentedImage.

    /// </summary>

    public class AugmentedImageVisualizerOverride : MonoBehaviour

    {

        /// <summary>

        /// The AugmentedImage to visualize.

        /// </summary>

        public AugmentedImage Image;


        public void Update()

        {

            if (Image == null || Image.TrackingState != TrackingState.Tracking)

            {


                return;

            }


        }

    }

}



©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容