我認爲我發現了一個非常乾淨的解決方案,因此我將自己發佈爲答案。 .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文件寫入也支持,請參閱源代碼。
來源
2010-10-25 07:30:49
mmm
謝謝你回答adnrewmu。我一定會記住與堆相關的提示。 – mmm 2010-10-25 07:35:49