菜鸟在线Unity3d教程:如何获取摄像机图像?

  本文介绍了两种在Unity中获得相机图像的方法:

  1.使用image 类

  2.使用图像作为OpenGL的纹理

  使用image类

  使用image类更像是原生版本。

  1.注册所需的图像格式使用CameraDevice.SetframeFormat 方法:

  CameraDevice.Instance.SetframeFormat(Image.PIXEL_FORMAT.RGB888, true);

  2.在QCARBehaviour运行之后调用此方法

  使用Unity的脚本排序功能,或在一个更新的回调中做一次。

  3.使用CameraDevice.GetCameraImage方法检索图像。

  在 ITrackerEventHandler.OnTrackablesUpdated 的回调中执行这样的行为。这样您就可以确保您检索当前帧的最新的摄像机图像。

  一定要确保相机的图像不是空的,因为在注册了图像格式之后,图像会在几帧之后才可用。

  这里是完整的脚本:

  using UnityEngine;
  using System.Collections;
  public class CameraImageAccess : MonoBehaviour
  {
  private Image.PIXEL_FORMAT m_PixelFormat = Image.PIXEL_FORMAT.RGB888;
  private bool m_RegisteredFormat = false;
  private bool m_LogInfo = true;
  void Start()
  {
  QCARBehaviour qcarBehaviour = (QCARBehaviour) FindObjectOfType(typeof(QCARBehaviour));
  if (qcarBehaviour)
  {
  qcarBehaviour.RegisterTrackablesUpdatedCallback(OnTrackablesUpdated);
  }
  }
  public void onTrackablesUpdated()
  {
  if (!m_RegisteredFormat)
  {
  CameraDevice.Instance.SetframeFormat(m_PixelFormat, true);
  m_RegisteredFormat = true;
  }
  if (m_LogInfo)
  {
  CameraDevice cam = CameraDevice.Instance;
  Image image = cam.GetCameraImage(m_PixelFormat);
  if (image == null)
  {
  Debug.Log(m_PixelFormat + " image is not available yet");
  }
  else
  {
  string s = m_PixelFormat + " image: \n";
  s += " size: " + image.Width + "x" + image.Height + "\n";
  s += " bufferSize: " + image.BufferWidth + "x" + image.BufferHeight + "\n";
  s += " stride: " + image.Stride;
  Debug.Log(s);
  m_LogInfo = false;
  }
  }
  }
  }

  使用OpenGL的纹理

  image类提供了一个摄像头像素的字节数组。这种方法对一些图像处理任务是有用的,但有时更好的是作为一个OpenGL纹理来找到它。你可以获得的图像的OpenGL纹理使用范例backgroundtextureaccess 中的方法。

  1.注册一个Texture2D对象在每一帧充满摄像头像素,而不是让vuforia渲染相机本身在每一帧渲染图像。

  2.看范例中的readme.txt(在assets文件夹)中的两种方式使用这种方法渲染相机图像。

你可能感兴趣的:(菜鸟在线Unity3d教程:如何获取摄像机图像?)