本文介绍了两种在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教程:如何获取摄像机图像?
发布评论