Page 1 sur 1

[RESOLU][DB-AL] Prise de photo/Enregistrement/Impression

Publié : 04 Oct 2017 18:09
par Master_Bruce_
Bonjour à tous,
Si je reviens encore vers vous aujourd'hui c'est simplement parce que je fais face à un petit problème.

Je suis en train de réaliser une sorte d'interface Unity qui permettrait de :
  • Prendre des photos avec une webCam
  • D'enregistrer ces mêmes photos dans un dossier de mon PC
  • D'imprimer ces mêmes photos

Aujourd'hui j'arrive à intégrer une webCamTexture à ma scène afin de visualiser le rendu de ma Camera.
Cependant je bloque au niveau de l'enregistrement de mes photos.
Unity me dit que ma variable de type WebCamTexture n'est assigné à aucun élément et que je dois l'assigner via l'inspector mais je ne sais pas à quoi l'assigner. J'ai essayer de créer un Empty GameObject mais le problème persiste :(

Voici mon code actuel :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class WebCam : MonoBehaviour
{
    public RawImage display;
    public WebCamTexture tex;

    private string _SavePath = "C:/_WebcamSnaps/";

    void Start()
    {
        if (WebCamTexture.devices.Length < 0)
        {
            Debug.Log("No camera detected");
        }
        else
        {
            Debug.Log("Camera detected");
            WebCamDevice device = WebCamTexture.devices[0];
            tex = new WebCamTexture(device.name);
            display.material.mainTexture = tex;
            tex.Play();
        }
    }

    public void TakeSnapshot()
    {      
            Debug.Log("Silence, ça tourne !");
            for(int _captureCounter = 0; _captureCounter < 3; _captureCounter++)
            {
                    Debug.Log("Et de " + _captureCounter.ToString()+1);
                    Texture2D snap = new Texture2D(tex.width, tex.height);
                    snap.SetPixels(tex.GetPixels());
                    snap.Apply();
                    System.IO.File.WriteAllBytes(_SavePath + _captureCounter.ToString() + ".png", snap.EncodeToPNG());
           }
    }
}
Je sais que ce genre de forum sont là pour apporter des réponses mais j'aimerai plutôt avoir une indication pour que je puisse avancer de moi même.
J'apporterai ma propre solution une fois que j'aurai résolu mon problème !

En vous remerciant !

MBruce :)

Re: [DB-AL] Prise de photo/Enregistrement/Impression

Publié : 05 Oct 2017 09:25
par boubouk50
Salut,

La Texture2D snap que tu crées n'est pas appliquée à un gameObject de la scène, je pense que c'est cela qu'Unity n'aime pas. Alors, après pourquoi... Fais une recherche sur le net avec le retour console d'Unity, si d'autres ont eu ce souci, peut-être trouveras-tu une explication.
Par contre, la mainTexture de display est disponible.

Re: [DB-AL] Prise de photo/Enregistrement/Impression

Publié : 05 Oct 2017 15:12
par Master_Bruce_
Merci de ton retour,
Très bien je vais faire quelques tests.

Je posterai une solution une fois que j'en aurait trouvé une. Je ferai de même avec mon projet une fois finis..
On sait jamais, si ça intéresse quelqu'un...

Je reviens vite !! :)

MBruce

Re: [DB-AL] Prise de photo/Enregistrement/Impression

Publié : 11 Oct 2017 17:07
par Master_Bruce_
Bonjour à tous,
Je reviens vers vous suite à mon problème.
Il semblerai que ce soit résolu mais je fais face à un nouveau problème, classique.. :

"NullReferenceException: Object reference not set to an instance of an object"

Et oui encore un !

L'objet considéré serait donc vide.. mais je ne vois pas comment c'est possible.
Voici mon code :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;

public class webCamModule : MonoBehaviour
{
    public RawImage display;
    private WebCamTexture wct;
    public string _savePath = "C:/snapShot";
    public Texture2D photo;

    // Use this for initialization
    void Start()
    {
        WebCamDevice device = WebCamTexture.devices[1];
        WebCamTexture wct = new WebCamTexture(device.name);
        display.texture = wct;
        display.material.mainTexture = wct;
        wct.Play();
      
    }


// Update is called once per frame
void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            TakeSnap();
        }
        
    }

    public void TakeSnap() {

        


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

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

    }

}
Je ne vois pas comment l'objet Texture2D photo pourrait-il être vie, de même pour l'objet webCamTexture wct !

Je m'en remet à vous chère communauté..

MBruce

Re: [DB-AL] Prise de photo/Enregistrement/Impression

Publié : 11 Oct 2017 17:28
par boubouk50
Quel objet est vide?
Si wct l'est, c’est qu'au Start () il ne trouve pas la caméra. Tu ne testes pas si la caméra est trouvée, donc source d'erreur.
Quant à photo, il en est dépendant. Mais si wct n'est pas vide, alors là, ça devient un peu plus bizarre.

Re: [DB-AL] Prise de photo/Enregistrement/Impression

Publié : 11 Oct 2017 17:41
par Master_Bruce_
Merci de ton retour !
Le soucis est que wct n'est pas vide puisque lorsque je lance mon Game et bah j'ai bien le rendu de caméra !
C'est à n'y rien comprendre !

Re: [DB-AL] Prise de photo/Enregistrement/Impression

Publié : 12 Oct 2017 09:45
par boubouk50
Fais des tests.
Mets un Debug.log (var) à chaque ligne et vois quelle ligne ne te renvoie pas ce qu'il faut.

Re: [DB-AL] Prise de photo/Enregistrement/Impression

Publié : 23 Oct 2017 12:00
par Master_Bruce_
Bonjour à tous,
Il y a quelque jour de cela j'ai finalement réussi à implémenter la prise de photo, l'enregistrement et l'impression !!
Voici quelques pistes pour ceux qui aimeraient réaliser ce petit projet :
  • Pour la prise de photo je vous invite à utiliser la classe Texture2D avec les méthode SetPixels et GetPixels accompagné d'un tableau de bytes à utiliser astucieusement !
  • Enregistrez votre photo avec l'une des méthodes de la classe System.IO.Files
  • Pour l'impression c'est plus délicat, Windows ne possède pas de librairie permettant de lancer une impression un bash, je vous laisse trouver une solution alternative
Bon courage à tous !

MBruce

PS : Sujet Résolu ;)