如何将一些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中载入图像序列。
我认为我发现了一个非常干净的解决方案,因此我将自己发布为答案。 .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文件写入也支持,请参阅源代码。
谢谢你回答adnrewmu。我一定会记住与堆相关的提示。 – mmm 2010-10-25 07:35:49