ARcore Camera текстура получается только из Unity Editor - PullRequest
2 голосов
/ 15 марта 2019

Я работаю над проектом с использованием ARcore.

Мне нужен экран реального мира, который виден на камере ARcore, ранее использовался метод стирания пользовательского интерфейса и захвата.

Но этобыло так медленно, что я нашел Frame.CameraImage.Texture в Arcore API

Texture2D snap = (Texture2D)Frame.CameraImage.Texture;

Он работал нормально в среде редактора Unity.

Но если вы соберете его на своем телефоне и проверьте его, Texture is null.

Я знаю, что эта проблема связана с тем, что процессор недоступен на мобильных телефонах.

Итак, я нашел другой способ, и нашел этот, AcquireCameraImageBytes ().

LoadRawTextureData () недостаточно данных при ошибке в Unity

Было столько же проблем, что и в предыдущем вопросе, но проблема была решена, когда формат YUV был преобразован в формат RGB.

Однако обычно он работает только в Unity Editor, а при сборке с мобильным телефоном выводится серое изображение.

enter image description here

это мой полный код

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.

что мне делать?

...