web-dev-qa-db-fra.com

Puis-je prendre une photo dans Unity à l'aide de l'appareil photo de l'appareil?

Je ne connais absolument pas l'ensemble de fonctionnalités plus complexes d'Unity3D et je suis curieux de savoir s'il a la capacité de prendre une photo puis de la manipuler. Plus précisément, je souhaite que l'utilisateur prenne un selfie, puis les trace autour de son visage pour créer un fichier PNG qui serait ensuite mappé sur un modèle. 

Je sais que la correspondance des visages sur un modèle est simple, mais je me demande si j'ai besoin d'écrire la fonctionnalité de photo/gravure dans l'application Chrome, ou si tout peut être fait à partir de Unity. Je n'ai pas besoin d'un tutoriel sur la façon de le faire, je demande simplement si c'est quelque chose qui est possible.

19
Genia S.

Oui, c'est possible Vous voudrez regarder la fonctionnalité WebCamTexture

Vous créez une WebCamTexture et appelez sa fonction Play () qui démarre la caméra. WebCamTexture, comme toute texture, vous permet d'obtenir les pixels via un appel GetPixels (). Cela vous permet de prendre un instantané quand vous le souhaitez, et vous pouvez l'enregistrer dans une Texture2D. Un appel à EncodeToPNG () et une écriture ultérieure dans un fichier devraient vous y amener. 

Notez que le code ci-dessous est une rédaction rapide basée sur la documentation. Je ne l'ai pas testé. Vous devrez peut-être sélectionner le bon périphérique s'il en existe plusieurs.

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

Pour ceux qui essaient d’obtenir un rendu en direct de la caméra, voici comment j’ai réussi à le faire. Tout d'abord, j'ai édité la réponse de Bart pour que la texture soit assignée sur Mise à jour plutôt que sur Démarrer:

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

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

Ensuite, j'ai attaché le script à un GameObject avec un composant RawImage. Vous pouvez facilement en créer un par clic droit -> Interface utilisateur -> RawImage dans la hiérarchie de l'éditeur Unity (cela nécessite Unity 4.6 et versions ultérieures). En cours d'exécution, vous devriez voir un flux en direct de la caméra. Au moment de la rédaction de ce document, Unity 5 prend en charge l’utilisation des webcams dans l’édition personnelle gratuite de Unity 5.

J'espère que cela aidera tous ceux qui recherchent un bon moyen de capturer des flux vidéo en direct dans Unity.

7
dammahom59

C'est possible. Je vous recommande vivement de consulter WebcamTexture Unity API . Il a quelques fonctions utiles:

  1. GetPixel () - Renvoie la couleur du pixel aux coordonnées (x, y). 
  2. GetPixels () - Obtenir un bloc de couleurs de pixels. 
  3. GetPixels32 () - Renvoie les données de pixels au format brut. 
  4. MarkNonReadable () - Marque WebCamTexture comme illisible 
  5. Pause () - Met l'appareil photo en pause.
  6. Lecture () - Démarre l'appareil photo.
  7. Arrêter () - Arrête l'appareil photo.
5
FunctionR

La réponse de Bart nécessite une modification. J'ai utilisé son code et l'image que je devenais noire. La modification requise est que nous devons Convertir TakePhoto en coroutine et ajouter 

yield return new WaitForEndOfFrame(); 

au début de Coroutine. (Courtsey @fafase) Pour plus de détails, voir http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html

Vous pouvez également vous référer à 

Prendre une photo en utilisant la webcam donne une sortie en noir [Unity3D]

4
Keymaker

Oui, vous pouvez. J'ai créé Android Native Camera plugin qui permet d'ouvrir la caméra de votre appareil Android, de capturer une image, d'enregistrer une vidéo et de l'enregistrer à l'emplacement souhaité de votre appareil avec seulement quelques lignes de code.

0
Habibur Rahman Ovie

Un plugin est disponible pour ce type de fonctionnalité, appelé Camera Capture Kit - https://www.assetstore.unity3d.com/fr/#!/content/56673 et, bien que la fonctionnalité fournie s'adresse au mobile qu'il contient. une démonstration de l’utilisation de la WebCamTexture pour prendre une image fixe.

0
Chris