2010-10-24 9 views
0

J'écris une application Java pour le traitement d'image en temps réel. J'aimerais pouvoir valider les algorithmes utilisés ou présenter les données acquises dans l'application Java avec Matlab par la suite. Dans l'application Java, j'utilise java.awt.image.BufferedImage pour traiter les données en interne. Le programme s'exécute généralement environ 1-2 minutes et saisit les données à 25Hz, 160x120 pixels 8 bits en niveaux de gris, de sorte que chaque trame raster 19200 octets, ce qui en fait 30 Mo de données acquises par minute.Comment passer un certain nombre de java.awt.image.BufferedImage à Matlab

Quelle est la meilleure façon de mettre ces données à la disposition de Matlab?

Mon but est d'avoir un tableau Matlab avec tous les cadres à la fin. J'ai envisagé de stocker des images dans un avi non compressé (que je ne sais pas encore comment faire), mais peut-être y a-t-il une façon plus facile et plus établie de le faire? J'ai déjà lu this, mais je ne sais pas encore comment l'utiliser ou si c'est la bonne façon de gérer plusieurs images.

Merci pour toute aide.

Répondre

1

Vous devriez être en mesure de stocker les images dans un tableau en mémoire - pour autant que vous vous assuriez de donner à la JVM suffisamment de mémoire de tas (option -Xmx pour java).

Une fois que vous avez capturé les images, vous pouvez les écrire sur le disque en utilisant, par exemple .: ImageIO.write(bufferedImage, "png", file)

Si vous les mettez tous dans le répertoire avec un nom de fichier simple, par exemple "img-00001.png", "img-00002.png", alors vous devriez pouvoir charger dans la séquence d'images dans Matlab.

+0

Merci pour votre réponse adnrewmu. Je vais sûrement garder à l'esprit l'indice lié au tas. – mmm

0

Je pense que j'ai trouvé une solution assez propre pour mon problème, donc je vais le publier comme une réponse moi-même. Il existe un framework Java open source simple pour l'exportation de fichier .mat appelé JMatIO (également disponible sur SourceForge, mais ici, assurez-vous de télécharger la version la plus récente 0.2). Il permet d'exporter facilement des données au format .mat qui est ensuite directement accessible à Matlab. Si vous avez des problèmes pour l'utiliser, en raison de peu de documentation, téléchargez la source ici:

svn co https://jmatio.svn.sourceforge.net/svnroot/jmatio jmatio 

et jeter un oeil à des tests unitaires, ils montrent comment il peut être utilisé.

Retour à mon problème: J'avais besoin de télécharger une rafale d'images vers Matlab. Une image dans Matlab est une matrice 2D, donc une explosion d'entre eux serait une matrice 3D. Je n'ai pas compris comment exporter des baies Java en tant que matrices 3D dans Matlab, donc j'ai exporté chaque java.awt.image.BufferedImage en tant que ligne dans Matlab, ce qui est facile à faire. Il faut une manipulation de données triviales dans Matlab pour représenter les données comme on le voudrait après (fonction de transposition matricielle et de remodelage). Jetez un oeil à l'extrait de code ci-dessous. L'exportation de la fonction mettra en mémoire tampon 100 images et si elle est appelée à nouveau, elle les exportera dans un fichier avec une profondeur de couleur de 8 bits.

public class MatFileExporter { 

    private BufferedImage frame; 
    private int[][] frames; 
    private int frameSize; 
    private int numFrames = 100; 
    private int frameNumber = 0; 

    protected void export() { 
     //This will only work with 8-bit coded SampleModels, change if needed 
     if (frames == null) { 
      frameSize = frame.getData().getWidth() * frame.getHeight(); 
      frames = new int[numFrames][frameSize]; 
     } 

     if (frameNumber < numFrames) { 
      frame.getData().getPixels(0, 0, frame.getWidth(), 
          frame.getHeight(), frames[frameNumber++]); 
     } else { 
      byte[][] framesByte = new byte[numFrames][frameSize]; 
      for (int i=0; i<numFrames; i++) { 
       for (int j=0; j<frameSize; j++) { 
        framesByte[i][j] = (byte) frames[i][j]; 
       } 
      } 

      MLUInt8 array = new MLUInt8("frames", framesByte); 

      ArrayList<MLArray> list = new ArrayList<MLArray>(); 
      list.add(array); 

      new MatFileWriter("frames.mat", list); 
     } 
    } 

} 

N'hésitez pas à l'utiliser et à le changer, espérons que cela aidera quelqu'un. L'écriture incrémentielle de fichiers .mat est également supportée, consultez le code source pour cela.

Questions connexes