ARCore之路-图像识别实例之一

版权声明:David Wang原创ARCore文章,仅供学习研究之用,不得用于任何商业目的,未经授权不得转载! https://blog.csdn.net/yolon3000/article/details/83590410

  如前所述,ARCore图像识别还有较多的限制,随着技术的发展,相信会发展得越来越好。从计算机视觉技术来说,图像识别是一项非常复杂的技术,但ARCore将技术细节封装得非常好,使用起来非常方便。

一、创建图像库

  我们可以直接从图像文件创建图像库,也可以使用菜单创建图像库,图像库就是放置用来做对比的图像,按Google的说法,ARCore最大支持1000张图像。经过我们的测试,建议分辨率大于300 * 300,最好到1024 * 512左右,但分辨率高的图像会使识别速度变慢,重复元素很多的图像(例:高层大楼)和特征很少的图像(例:公园的广场等)ARCore的识别率还是比较低的,在使用前最好用我们之前提到的ARCoreimg查看一下分数,建议在50以上。创建与配置图像库(创建的图像数据库名为:FoxDataBase)操作如下:

DavidWang原创
DavidWang原创

二、设置配置文件

  创建了图像数据库,我们还得在配置文件里设置一下,首先我们需要创建一个配置文件(创建的配置文件名为:ARCoreSessionConfig),然后对配置文件进行设置,然后替换Scene 中的 ARCore Device中的配置文件,操作步骤如下:

DavidWang原创
DavidWang原创
DavidWang原创

三、制作取景框

  前文提到过,为了有效的识别图像,物理图像必须占据摄像头图像的 40%以上,为了更方便用户取图,我们制作一个取景框,确保图像能有效被ARCore采集,也就是所谓有Fit to Scan功能。首先,我们在Hirerachy中新建一个RawImage UI,然后将事先制作好的取景框图片(务必为png格式并设置好了透明度)设置为Raw Image 的 Texture,如下图所示:

DavidWang原创
  因为取景框只在取景时出现,在跟踪图像时应该隐藏,我们使用代码来控制取景框的显示与隐藏,这里我们先把取景框UI取消显示。

四、编写代码

  准备工作已基本做好,下面我们编写AppController代码如下:


   public Camera FirstPersonCamera;
   public GameObject mprefab;
   private bool mIsQuitting = false;
   private const float mModelRotation = 180.0f;
   public GameObject mFitToScanOverlay;
   private Dictionary<int, GameObject> mVisualizers = new Dictionary<int, GameObject>();
   private List<AugmentedImage> mTempAugmentedImages = new List<AugmentedImage>();
   private bool mTracking = false;

   void Start () {
       OnCheckDevice();
   }
   
   // Update is called once per frame
   void Update () {
       UpdateApplicationLifecycle();

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

       foreach (var image in mTempAugmentedImages)
       {
           GameObject prefab  = null;
           mVisualizers.TryGetValue(image.DatabaseIndex, out prefab);
           if (image.TrackingState == TrackingState.Tracking && prefab == null)
           {   
               Anchor anchor = image.CreateAnchor(image.CenterPose);
               var FoxObject = Instantiate(mprefab, anchor.transform.position, anchor.transform.rotation);
               FoxObject.transform.Rotate(-90.0f, mModelRotation, 0, Space.Self);
               mVisualizers.Add(image.DatabaseIndex, FoxObject);
               mTracking = true;
           }
           else if (image.TrackingState == TrackingState.Stopped && prefab != null)
           {
               mVisualizers.Remove(image.DatabaseIndex);
               GameObject.Destroy(prefab);
               mTracking = false;
           }
       }

       // Show the fit-to-scan overlay if there are no images that are Tracking.
       foreach (var visualizer in mVisualizers.Values)
       {
           if (mTracking)
           {
               mFitToScanOverlay.SetActive(false);
               return;
           }
       }
       mFitToScanOverlay.SetActive(true);
   }

  上面代码我们还需要引用 GoogleARCore.Examples.AugmentedImage 命名空间,代码逻辑很简单,如果识别图像成功,我们则实例化Fox对象,并且我们还处理了取景框,确保取景框只在没有跟踪到对象时才显示。
  编译、运行效果如下:

DavidWang原创
DavidWang原创
DavidWang原创

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/83590410