Я думаю, что нашел довольно чистое решение для своей проблемы, поэтому я опубликую его как ответ сам. Существует простая Java-инфраструктура с открытым исходным кодом для экспорта .mat-файлов, которая называется JMatIO (также доступна на SourceForge, но здесь обязательно загрузите новейшую версию 0.2). Это позволяет легко экспортировать данные в формате .mat, который затем доступен для Matlab простым способом. Если у вас возникли проблемы с его использованием, из-за небольшого количества документации загрузите исходный код здесь:
svn co https://jmatio.svn.sourceforge.net/svnroot/jmatio jmatio
и посмотрите на юнит-тесты, они показывают, как его можно использовать.
Возвращаясь к моей проблеме: мне нужно было загрузить пакет кадров в Matlab. Изображение в Matlab - это двумерная матрица, поэтому пакет из них будет трехмерной матрицей. Я не понял, как экспортировать массивы Java как 3D-марши в Matlab, поэтому я экспортировал каждый java.awt.image.BufferedImage
как строку в Matlab, что легко сделать. В Matlab требуются некоторые тривиальные манипуляции с данными, чтобы представить данные так, как хотелось бы впоследствии (функция транспонирования матрицы и ее изменения). Посмотрите на фрагмент кода ниже. Функция export буферизует 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-файла также поддерживается, обратитесь к исходному коду для этого.