IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Grab Frame Video


Sujet :

Android

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut Grab Frame Video
    Salut tout le monde, Est ce quelqu'un peut m'aider à récupérer une frame (image) à partir d'un flux vidéo provenant de la caméra d'un smarthphone parce que je vois pas trop comment je peut procéder, y 'aurait il pas des tutoriels android dédiés à ce sujet, ou bien des méthodes java de traitement vidéo Merci.

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Déjà tu peux regarder à ce lien pour voir comment faire marcher la Caméra

    http://developer.android.com/resourc...raPreview.html

    Après pour pouvoir récupérer une image de la caméra regarde vers cette procédure , elle est pas compliqué à implémenter .

    http://developer.android.com/referen...ureCallback%29


    Tu as sur ce lien également la procédure expliquer pour pouvoir récupérer une image


    To take pictures with this class, use the following steps:

    1. Obtain an instance of Camera from open(int).
    2. Get existing (default) settings with getParameters().
    3. If necessary, modify the returned Camera.Parameters object and call setParameters(Camera.Parameters).
    4. If desired, call setDisplayOrientation(int).
    5. Important: Pass a fully initialized SurfaceHolder to setPreviewDisplay(SurfaceHolder). Without a surface, the camera will be unable to start the preview.
    6. Important: Call startPreview() to start updating the preview surface. Preview must be started before you can take a picture.
    7. When you want, call takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) to capture a photo. Wait for the callbacks to provide the actual image data.
    8. After taking a picture, preview display will have stopped. To take more photos, call startPreview() again first.
    9. Call stopPreview() to stop updating the preview surface.
    10. Important: Call release() to release the camera for use by other applications. Applications should release the camera immediately in onPause() (and re-open() it in onResume()).

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut video stream en android
    Je peux bien récupérer une image à partir de la camera mais des que je met en boucle, la méthode take picture, je récupère qu'une seule image dansla galerie à mon avis il s'écrase au fur et à mesure de la boucle du moment que je peux pas les nommer, j'ai entendu parler des librairie jar javacv j'opte plutot pour cette solution est ce que quelqu'un aurait une idée sur sa merci

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Je peux bien récupérer une image à partir de la camera mais des que je met en boucle, la méthode take picture, je récupère qu'une seule image dansla galerie à mon avis il s'écrase au fur et à mesure de la boucle du moment que je peux pas les nommer
    , euh tu peux changer le nom de ton image à sauvegarder , et même mieux tu peux récupérer le buffer de l'image pour en faire ce que tu veux .

    http://developer.android.com/referen...eCallback.html

    public abstract void onPictureTaken (byte[] data, Camera camera)
    Since: API Level 1

    Called when image data is available after a picture is taken. The format of the data depends on the context of the callback and Camera.Parameters settings.
    Parameters
    data a byte array of the picture data
    camera the Camera service object
    Après il te suffira juste de retourner le chemin de sauvegarde de tes fichiers ou directement le nom de tes fichiers à ta galerie.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut native méthodes
    Oh merci beaucoup j'ai suivi ton conseil j'ai pu récupérer le buffer en temps Réel en utilisant l'objet preview en gros je récupère les pixel de la surface, et bien maintenant j'ai un autre problème quand j'appelle mes fonctions native pour sommer par exemple les pixel de toute l'image ça crache et il me dit que
    the static method (ma method native) from the type (ma class library) should be accessed in a static way

    Merci.

  6. #6
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Tu as un endroit de ton code où tu appelles une méthode statique avec un objet.

    du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Camera camera = new Camera();
    camera.getNumberOfCameras();
    plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Camera camera = Camera.getNumberOfCameras();

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut Réponse
    C'est curieux car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    camera.getNumber(); retourne un entier et pas un objet camera
    si tu veux moi dans mon exemple , j'ai suivi ton conseil et je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    lib libo;
     
    int m=libo.som(s);

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut
    En fait ce que j'ai oublié de te dire aussi c'est quand je visualise le logcat, il me dit java.lang.unsatisfiedLinkError get data

  9. #9
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour

    C curieux car

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    camera.getNumber(); retourne un entier et pas un objet camera
    Arg je suis aller trop vite ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Camera camera = new Camera();
    int nb = camera.getNumberOfCameras();
    il faut plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nb = Camera.getNumberOfCameras();

    Donc justement mon conseil est que si ta méthode som est une statique alors il faut que tu l'appelles comme cela :

    NB: Désolé , j'étais dans le paté hier soir .

    Après pour la nouvelle erreur signalé tu dois avoir un souci avec la nouvelle librairie que tu as rajouté . essaye de voir si elle est bien rajouter dans le projet .

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut
    le crash persiste toujours , et je ne pense pas qu'il soit lié à la méthode native désolé puisque quand j'appelle même des méthodes java dans la méthode onPreview à titre d'exemple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    						bmp=BitmapFactory.decodeByteArray(data,0, data.length);
    int w=bmp.getWidth();
    text.setText(new integer(w).toString());
    Ça crache toujours, je sais que c'est un problème bidon mais je vois pas trop comment le contourner

    merci pour ton aide.

  11. #11
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Hmm , pas facile d'aider comme cela ,si tu n'as que java.lang.unsatisfiedLinkError get data comme erreur dans le logcat essaye de voir s'il n'y a pas de problème de linkage avec ta librairie . Si une autre erreur est présente dans le logcat fais nous en part .

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut
    cette méthode rempli les donnée à partir de la surface d'affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void onPreviewFrame(byte[] data, Camera camera) {
    text.setText(String.valueOf(data[1]));
    					}
    est ce que t'a une idée sur comment capture deux frame successives espacé de 40 ms, j'essayé de faire un
    Thread.sleep(40); mais ceci endore toutes l'application

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut On Preview frame
    salut tt le monde,
    m a chaque fois que je di j'ai réussi je me retrouve au point de départ, je récupère les data de la méthode onPreview frame qui fait par défaut un tableau de byte 1.5*Width*height qui emet de l'information en continu tant que ya pas de stop preview je stocke deux frame successives en remplissant deux tableaux de longeur w*h mais des je compare entre les deux dans le noir je retrouve une différence qui ne devrait pas avoir lieu, et ce qui est étrange c'est que elle est toujours négative

    here is my code

    ceci la méthode qui me permet d'avoir les deux frames
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ublic static int[] fullpix2(byte[] data,int w,int h)
    		{
    		int i,j,k=0;
    		int[] s= new int[2*w*h];
    		for(i=0;i<h;i++)
    		{
    			for (j=0;j<w;j++)
    			{
    			s[k]=((int)data[k]);
    				if(s[k]<0)
    				{
    					s[k]=127-s[k];	
    				}
    				k++;
    			}		
    		}
    		return s;	
    		}
    j'ai défini un tableau de 2 fois W*H qui comprend mes deux images, que je compare
    entre l'élémént 1 et l'élement 1+w*h que je pense qu'il est le meme pixel dans l'image prochaine mais non


    est ce quelqu'un à une idée merci d'avance

  14. #14
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,
    je stocke deux frame successives
    Si c'est deux frames successives , alors cela ne sera pas la même image ?

    je compare entre les deux dans le noir je retrouve une différence qui ne devrait pas avoir lieu, et ce qui est étrange c'est que elle est toujours négative
    Négative, c'est-à-dire ?

  15. #15
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut
    Et bien cela veut dire (-42,-18.....Etc)

    mais bon je vais droit au but j'ai deux problemes
    1- une piste pour récupérer deux image successives (l'équivalent de cvQuery frame en openCV = c'est pour calculer le flot optique)

    2- qu'est ce que contient byte data[], il contient des valeurs comprises entre -128 et 127 mais je n'ai aucune idée sur le codage (c'est à dire c'est quoi le noir c'est quoi le blanc)

    a première vue je me suis dit le noir c'est 0 le tout blanc serai -128 (puisque c'est un byte donc ce sont les négatives qui ont un msb lis à 1)

    voila

  16. #16
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    2- qu'est ce que contient byte data[], il contient des valeurs comprises entre -128 et 127 mais je n'ai aucune idée sur le codage (c'est à dire c'est quoi le noir c'est quoi le blanc)
    Maintenant il me semble que la data que tu récupères dans le onPreviewFrame est du YUV

    data the contents of the preview frame in the format defined by ImageFormat, which can be queried with getPreviewFormat(). If setPreviewFormat(int) is never called, the default will be the YCbCr_420_SP (NV21) format.

    Si tu veux le changer il faut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetPreviewFormat(ImageFormat.RGB_565 );
    et là tu auras du RGB

    Couleur RGB :
    Le blanc = "#FFFFFF"
    Le noir ="#000000"


    1- une piste pour récupérer deux image successives (l'équivalent de cvQuery frame en openCV = c'est pour calculer le flot optique)
    Tout dépends par ce que tu entends par successives .

    Tu peux toujours créer un handler répétitif qui prendra une image toutes les x milliseconds

  17. #17
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut
    merci pour le tuyau, merci beaucoup est ce que vous pouvez m'expliquer à travers d'un petit exemple comment je fais le handler répétititf merci

  18. #18
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    pour faire un handler répétitif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            private Runnable mRepeatTask = new Runnable() {
    		public void run() {
    			//clean callbacks
    			mHandler.removeCallbacks(mRepeatTask);
    			//start timer
    			mHandler.postDelayed(mRepeatTask,60*1000);
     
    		}
    	};
    Il te suffit d'appeler une seul fois le runnable mRepeatTask et celui ci s'appellera tout les minutes dans l'exemple que je t'ai montré.

  19. #19
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut
    concernant mon erreur de NDK, j'ai trouvé la cause mais pas la raison ma librairie est bien chargée, il trouve bien la fonction mais es que j'introduit cette ligne ça part en c*,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    holder.addCallback(this);
    voila un bout de code pour voir clair

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            this.text=(EditText)findViewById(R.id.tet);
            surface = (SurfaceView)findViewById(R.id.surfaceView1);   
        	//holder.addCallback(this);// c'est ici :cry: 
     
            int w=40;
        	int s=1;
        	libo=new lib();
        	s=libo.som(w);
        }

Discussions similaires

  1. [Free Pascal] Capture frame video et sauvegarder en jpg
    Par Coolman-2014 dans le forum Free Pascal
    Réponses: 4
    Dernier message: 26/01/2015, 00h15
  2. [Débutant] Erreur affectation d'un frame video à un pictureBox
    Par janyoura dans le forum Windows Forms
    Réponses: 0
    Dernier message: 11/07/2013, 13h23
  3. lire et capter des frames a partir d'une video
    Par jad777 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/01/2009, 11h34
  4. [Video] JMF infos video taille codec frame ..
    Par kitue dans le forum Multimédia
    Réponses: 1
    Dernier message: 02/06/2008, 10h21
  5. [Vidéo] Extraction des frames d'une vidéo
    Par jacques_henry dans le forum Multimédia
    Réponses: 1
    Dernier message: 23/01/2006, 20h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo