Я работаю над проектом с использованием ARcore.
Мне нужен экран реального мира, который виден на камере ARcore, ранее использовался метод стирания пользовательского интерфейса и захвата.
Но этобыло так медленно, что я нашел Frame.CameraImage.Texture в Arcore API
Texture2D snap = (Texture2D)Frame.CameraImage.Texture;
Он работал нормально в среде редактора Unity.
Но если вы соберете его на своем телефоне и проверьте его, Texture is null.
Я знаю, что эта проблема связана с тем, что процессор недоступен на мобильных телефонах.
Итак, я нашел другой способ, и нашел этот, AcquireCameraImageBytes ().
LoadRawTextureData () недостаточно данных при ошибке в Unity
Было столько же проблем, что и в предыдущем вопросе, но проблема была решена, когда формат YUV был преобразован в формат RGB.
Однако обычно он работает только в Unity Editor, а при сборке с мобильным телефоном выводится серое изображение.
это мой полный код
namespace GoogleARCore
{
using System;
using UnityEngine;
using UnityEngine.UI;
public class TestFrameCamera : MonoBehaviour
{
private Texture2D m_TextureRender;
private void Update()
{
using (var image = Frame.CameraImage.AcquireCameraImageBytes()) {
if(!image.IsAvailable)
{
return;
}
_OnImageAvailable(image.Width, image.Height, image.Y, image.Width * image.Height);
}
}
private void _OnImageAvailable(int width, int height, IntPtr pixelBuffer, int bufferSize)
{
m_TextureRender = new Texture2D(width, height, TextureFormat.RGBA32, false, false);
byte[] bufferYUV = new byte[width * height * 3 / 2];
bufferSize = width * height * 3 / 2;
System.Runtime.InteropServices.Marshal.Copy(pixelBuffer, bufferYUV, 0, bufferSize);
Color color = new Color();
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
float Yvalue = bufferYUV[y * width + x];
float Uvalue = bufferYUV[(y / 2) * (width / 2) + x / 2 + (width * height)];
float Vvalue = bufferYUV[(y / 2) * (width / 2) + x / 2 + (width * height) + (width * height) / 4];
color.r = Yvalue + (float)(1.37705 * (Vvalue - 128.0f));
color.g = Yvalue - (float)(0.698001 * (Vvalue - 128.0f)) - (float)(0.337633 * (Uvalue - 128.0f));
color.b = Yvalue + (float)(1.732446 * (Uvalue - 128.0f));
color.r /= 255.0f;
color.g /= 255.0f;
color.b /= 255.0f;
if (color.r < 0.0f)
color.r = 0.0f;
if (color.g < 0.0f)
color.g = 0.0f;
if (color.b < 0.0f)
color.b = 0.0f;
if (color.r > 1.0f)
color.r = 1.0f;
if (color.g > 1.0f)
color.g = 1.0f;
if (color.b > 1.0f)
color.b = 1.0f;
color.a = 1.0f;
m_TextureRender.SetPixel(width - 1 - x, y, color);
}
}
m_TextureRender.Apply();
this.GetComponent<RawImage>().texture = m_TextureRender;
}
}
}
Я просто тестирую этот скрипт, добавляя его к объекту, который содержит Rawimage в примере кода ARCore.
что мне делать?