it-swarm.com.de

Kann ich mit der Kamera ein Foto in Unity aufnehmen?

Ich bin mit den komplexeren Funktionen von Unity3D völlig unbekannt und bin neugierig, ob es die Fähigkeit hat, ein Foto aufzunehmen und es dann zu manipulieren. Insbesondere möchte ich, dass der Benutzer ein Selfie nimmt und dann um sein Gesicht herum verfolgt, um ein PNG zu erstellen, das dann auf ein Modell texturiert wird. 

Ich weiß, dass die Gesichtsabbildung für ein Modell einfach ist, aber ich frage mich, ob ich die Foto-/Schnitzfunktionalität in die umfassende Chrome-App schreiben muss oder ob dies alles in Unity möglich ist. Ich brauche kein Tutorial, nur um zu fragen, ob etwas möglich ist.

19
Genia S.

Ja das ist möglich. Sie möchten sich die Funktionalität von WebCamTexture anschauen. 

Sie erstellen eine WebCamTexture und rufen ihre Play () - Funktion auf, mit der die Kamera gestartet wird. Mit WebCamTexture können Sie wie bei jeder beliebigen Textur die Pixel über einen GetPixels () - Aufruf abrufen. Auf diese Weise können Sie einen Schnappschuss aufnehmen, wenn Sie möchten, und Sie können dies in einer Texture2D speichern. Ein Aufruf von EncodeToPNG () und nachfolgendes Schreiben in eine Datei sollten Sie dorthin bringen. 

Beachten Sie, dass der folgende Code eine schnelle Beschreibung ist, die auf der Dokumentation basiert. Ich habe es nicht getestet. Sie müssen möglicherweise ein korrektes Gerät auswählen, wenn mehr als ein Gerät verfügbar ist.

using UnityEngine;
using System.Collections;
using System.IO;

public class WebCamPhotoCamera : MonoBehaviour 
{
    WebCamTexture webCamTexture;

    void Start() 
    {
        webCamTexture = new WebCamTexture();
        renderer.material.mainTexture = webCamTexture;
        webCamTexture.Play();
    }

    void TakePhoto()
    {

    // NOTE - you almost certainly have to do this here:

     yield return new WaitForEndOfFrame(); 

    // it's a rare case where the Unity doco is pretty clear,
    // http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html
    // be sure to scroll down to the SECOND long example on that doco page 

        Texture2D photo = new Texture2D(webCamTexture.width, webCamTexture.height);
        photo.SetPixels(webCamTexture.GetPixels());
        photo.Apply();

        //Encode to a PNG
        byte[] bytes = photo.EncodeToPNG();
        //Write out the PNG. Of course you have to substitute your_path for something sensible
        File.WriteAllBytes(your_path + "photo.png", bytes);
    }
}
19
Bart

Für diejenigen, die versuchen, die Kamera dazu zu bringen, Live-Feeds zu rendern, habe ich es hier geschafft. Zuerst habe ich Barts Antwort so bearbeitet, dass die Textur beim Update zugewiesen wurde und nicht nur beim Start:

void Start()
{
    webCamTexture = new WebCamTexture();
    webCamTexture.Play();
}

void Update()
{
    GetComponent<RawImage>().texture = webCamTexture;
}

Dann habe ich das Skript mit einer RawImage-Komponente an ein GameObject angehängt. Sie können eines mit Rechtsklick -> Benutzeroberfläche -> RawImage in der Hierarchie im Unity-Editor erstellen (dies erfordert Unity 4.6 und höher). Beim Ausführen sollte ein Live-Feed der Kamera in Ihrer Ansicht angezeigt werden. Derzeit unterstützt Unity 5 die Verwendung von Webcams in der kostenlosen Personal Edition von Unity 5.

Ich hoffe, dass dies jedem hilft, der nach einer guten Möglichkeit sucht, Live-Kamera-Feed in Unity aufzunehmen.

7
dammahom59

Es ist möglich. Ich empfehle Ihnen dringend, sich die WebcamTexture Unity API anzusehen. Es hat einige nützliche Funktionen:

  1. GetPixel () - Gibt die Pixelfarbe in Koordinaten (x, y) zurück. 
  2. GetPixels () - Liefert einen Block von Pixelfarben. 
  3. GetPixels32 () - Gibt die Pixeldaten im Rohformat zurück. 
  4. MarkNonReadable () - Markiert WebCamTexture als nicht lesbar 
  5. Pause () - Hält die Kamera an.
  6. Wiedergabe () - Startet die Kamera.
  7. Stop () - Stoppt die Kamera.
5
FunctionR

Bart Antwort hat eine erforderliche Modifikation. Ich habe seinen Code benutzt und das Bild, das ich bekam, war schwarz. Erforderlich ist, dass wir TakePhoto in eine Coroutine konvertieren und hinzufügen müssen 

yield return new WaitForEndOfFrame(); 

am Anfang von Coroutine. (Courtsey @fafase) Weitere Informationen finden Sie unter http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html

Sie können sich auch darauf beziehen 

Foto mit einer Webcam aufnehmen zeigt schwarze Ausgabe [Unity3D]

4
Keymaker

Ja, du kannst. Ich habe Android Native Camera Plugin erstellt, mit dem Sie die Kamera Ihres Android-Geräts öffnen, Bilder aufnehmen, Videos aufnehmen und diese mit nur wenigen Codezeilen am gewünschten Ort Ihres Geräts speichern können.

0

Wenn Sie dies ohne die Verwendung eines Plugins eines Drittanbieters tun möchten, hilft Ihnen die @FuntionR-Lösung. Wenn Sie das aufgenommene Foto jedoch in der Galerie speichern möchten (Android & iOS), ist dies innerhalb von Unity nicht möglich. Sie müssen nativen Code schreiben, um das Foto in die Galerie zu übertragen, und es dann von Unity aus aufrufen.

Hier ist ein zusammenfassender Blog, der Sie bei der Erreichung Ihres Ziels unterstützt. http://unitydevelopers.blogspot.com/2018/07/pick-image-from-gallery-in-unity3d.html

Bearbeiten: Beachten Sie, dass im obigen Thread die Auswahl von Bildern aus der Galerie beschrieben wird. Der gleiche Vorgang wird jedoch für das Speichern des Bildes in der Galerie durchgeführt.

0
TechnoLover

Für diese Art von Funktionalität ist ein Plugin mit dem Namen Camera Capture Kit - https://www.assetstore.unity3d.com/de/#!/content/56673 verfügbar. Die bereitgestellten Funktionen sind zwar auf mobile Geräte ausgerichtet Eine Demo, wie Sie mit WebCamTexture ein Standbild aufnehmen können.

0
Chris