单击按钮时 ARCore 保存相机图像(Unity C#) [英] ARCore Save Camera Image (Unity C#) on Button click

查看:24
本文介绍了单击按钮时 ARCore 保存相机图像(Unity C#)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类似的问题,例如以下三个 SO 问题:

I have a similar question like the follow three SO questions:

我的目标是通过单击按钮保存相机图像(没有增强对象)和相机的姿势.今天我尝试了用 ARCore 保存相机图像一整天.我尝试了上面链接的三个问题的不同方法,但没有奏效.附加到按钮的我的 C# 脚本:

My aim is to save the camera image (without the augmented objects) and the pose of the camera on a button click. Today I tried the whole day on saving the camera image with ARCore. I tried the different approaches from the three questions linked above, but it didn't work. My C# Script which is attached to a button:

using UnityEngine;
using UnityEngine.UI;
using GoogleARCore;
using System.IO;
public class takeimg : MonoBehaviour
{
    private Texture2D m_TextureRender;
    public Button yourButton;
    private byte[] m_EdgeDetectionResultImage = null;

    void Start()
    {
        Button btn = yourButton.GetComponent<Button>();
        btn.onClick.AddListener(TaskOnClick);
    }

    void TaskOnClick()
    {
        var image = Frame.CameraImage.AcquireCameraImageBytes();

        m_TextureRender = new Texture2D(image.Width, image.Height, TextureFormat.RGBA32, false, false);
        m_EdgeDetectionResultImage = new byte[image.Width * image.Height * 4];


        System.Runtime.InteropServices.Marshal.Copy(image.Y, m_EdgeDetectionResultImage, 0, image.Width * image.Height * 4);

        m_TextureRender.LoadRawTextureData(m_EdgeDetectionResultImage);
        m_TextureRender.Apply();

        var encodedJpg = m_TextureRender.EncodeToJPG();
        var path = Application.persistentDataPath;

        File.WriteAllBytes(path + "/test.jpg", encodedJpg);
    }
}

目前我得到的图像看起来:保存的图片它看起来类似于我上面链接的第三个 SO 问题.所以有些东西仍然是错误的/缺失的.有人可以帮助我有什么问题吗?与缓冲区有关的东西?

Currently the image I get looks: Saved Image It looks similar to the third SO question I linked above. So something is still wrong/missing. Can someone help me what's wrong? Something with the buffers?

更新:与此同时,我设法找回了一张黑色/带有黑色的图片:bw 图片这是我的新 TaskOnClick 函数:

Update: In the meantime, I managed to get back a black/withe picture: bw picture Here my new TaskOnClick function:

void TaskOnClick()
{
    var image = Frame.CameraImage.AcquireCameraImageBytes();

    byte[] bufferY = new byte[image.Width * image.Height];
    byte[] bufferU = new byte[image.Width * image.Height / 2];
    byte[] bufferV = new byte[image.Width * image.Height / 2];
    System.Runtime.InteropServices.Marshal.Copy(image.Y, bufferY, 0, image.Width * image.Height);
    System.Runtime.InteropServices.Marshal.Copy(image.U, bufferU, 0, image.Width * image.Height / 2);
    System.Runtime.InteropServices.Marshal.Copy(image.V, bufferV, 0, image.Width * image.Height / 2);


    m_TextureRender = new Texture2D(image.Width, image.Height, TextureFormat.RGBA32, false, false);


    Color c = new Color();
    for (int y = 0; y < image.Height; y++) {
        for (int x =0; x<image.Width;x++) {
            float Y = bufferY[y * image.Width + x];
            float U = bufferU[(y/2) * image.Width + x];
            float V = bufferV[(y/2) * image.Width + x];
            c.r = Y;
            c.g = Y;
            c.b = Y;

            c.r /= 255.0f;
            c.g /= 255.0f;
            c.b /= 255.0f;

            if (c.r < 0.0f) c.r = 0.0f;
            if (c.g < 0.0f) c.g = 0.0f;
            if (c.b < 0.0f) c.b = 0.0f;

            if (c.r > 1.0f) c.r = 1.0f;
            if (c.g > 1.0f) c.g = 1.0f;
            if (c.b > 1.0f) c.b = 1.0f;

            c.a = 1.0f;
            m_TextureRender.SetPixel(image.Width-1-x, y, c);      
        }
    }

    var encodedJpg = m_TextureRender.EncodeToJPG();
    var path = Application.persistentDataPath;
    File.WriteAllBytes(path + "/test.jpg", encodedJpg);
}

谁能告诉我,Google ARCore 使用的实际 YUV 到 RGB 对话是什么?我尝试了一些,但图片中的颜色看起来总是错误的......有没有比我的解决方案更简单的方法来保存当前帧中的相机图像?

Can someone tell, which is the actual YUV to RGB conversation Google ARCore is using? I tried some, but the colors in the pictures looked always wrong... Is there an easier way to save the camera image from the current frame than my solution?

推荐答案

您可以使用 NatCam API 轻松完成此操作:https://assetstore.unity.com/packages/tools/integration/natcam-webcam-api-52154

You could do this pretty easily with the NatCam API: https://assetstore.unity.com/packages/tools/integration/natcam-webcam-api-52154

如果你想要视频,还有 NatCorder

There is also NatCorder if you want video

这篇关于单击按钮时 ARCore 保存相机图像(Unity C#)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆