如何将一些java.awt.image.BufferedImage传递给Matlab

如何将一些java.awt.image.BufferedImage传递给Matlab

问题描述:

我正在为实时图像处理编写一个Java应用程序。我希望能够验证所使用的算法,或者随后将使用Matlab在Java应用程序中获取的数据呈现给用户。在Java应用程序中,我使用java.awt.image.BufferedImage来内部处理数据。该程序通常运行约1-2分钟,以25Hz,160x120像素8位灰度抓取数据,因此每帧的栅格权重为19200字节,因此每分钟可获得30MB的采集数据。如何将一些java.awt.image.BufferedImage传递给Matlab

将这些数据提供给Matlab的最佳方法是什么?

我的目标是在最后有一个Matlab数组,并在其中包含所有帧。我曾考虑将帧存储在一个未压缩的AVI文件中(我不知道该怎么做),但也许有一种更简单,更成熟的方法呢?我已经阅读this,但不知道如何使用它,或者如果这是处理多个帧的正确方法。

感谢您的任何帮助。

您应该可以将图像存储在内存中的数组中 - 只要您确保为JVM提供了足够的内存(Java的-Xmx选项)即可。

一旦你拍摄的图像,你可以用它们写入到磁盘,例如:ImageIO.write(bufferedImage, "png", file)

如果你把他们都在目录中有一个简单的文件名如“img-00001.png”,“img-00002.png”,那么你应该可以在Matlab中载入图像序列。

+0

谢谢你回答adnrewmu。我一定会记住与堆相关的提示。 – mmm 2010-10-25 07:35:49

我认为我发现了一个非常干净的解决方案,因此我将自己发布为答案。 .mat文件导出有一个简单的开源java框架,名为JMatIO(也可在SourceForge上获得,但在这里一定要下载最新版本0.2)。它允许以.mat格式轻松导出数据,然后直接向Matlab提供。如果您在使用它,因为小的文​​件有任何问题,从这里下载源:

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

,并看看单元测试,他们展示如何使用。

回到我的问题:我需要上传一帧帧到Matlab。 Matlab中的图像是一个二维矩阵,所以它们中的一个会是一个3D矩阵。我没有弄清楚如何在Matlab中将Java数组导出为3D martices,所以我在Matlab中将每个java.awt.image.BufferedImage作为一行导出,这很容易完成。它需要在Matlab中进行一些简单的数据处理来表示随后会想要的数据(矩阵转置和重塑函数)。看看下面的代码片段。函数导出将缓冲100帧,如果在此之后再次调用,它会将它们导出到具有8位颜色深度的文件。

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); 
     } 
    } 

} 

随意使用和改变它,希望它可以帮助别人。增量.mat文件写入也支持,请参阅源代码。