如何传递一些java.awt.image.buffereImage';s到Matlab
我正在编写一个用于实时图像处理的Java应用程序。我希望能够验证所使用的算法,或者在之后用Matlab展示我在Java应用程序中获取的数据。在Java应用程序中,我使用如何传递一些java.awt.image.buffereImage';s到Matlab,java,matlab,image-processing,image-manipulation,Java,Matlab,Image Processing,Image Manipulation,我正在编写一个用于实时图像处理的Java应用程序。我希望能够验证所使用的算法,或者在之后用Matlab展示我在Java应用程序中获取的数据。在Java应用程序中,我使用Java.awt.image.buffereImage在内部处理数据。该程序通常运行约1-2分钟,以25Hz、160x120像素的8位灰度采集数据,因此每帧光栅的权重为19200字节,每分钟采集的数据量为30MB 将这些数据提供给Matlab的最佳方法是什么? 我的目标是要有一个Matlab数组,它的所有帧都在最后。我曾经考虑过在
Java.awt.image.buffereImage
在内部处理数据。该程序通常运行约1-2分钟,以25Hz、160x120像素的8位灰度采集数据,因此每帧光栅的权重为19200字节,每分钟采集的数据量为30MB
将这些数据提供给Matlab的最佳方法是什么?
我的目标是要有一个Matlab数组,它的所有帧都在最后。我曾经考虑过在未压缩的avi中存储帧(我还不知道怎么做),但也许有一种更简单、更成熟的方法可以做到这一点?我已经读过了,但还不知道如何使用它,或者这是否是处理多帧的正确方法
感谢您的帮助。您应该能够将映像存储在内存中的数组中-只要您确保为JVM提供足够的堆内存(-Xmx选项给java) 捕获图像后,您可以使用,例如:
ImageIO.write(bufferedImage,“png”,file)将图像写入磁盘。
如果你用一个简单的文件名将它们都放在目录中,例如“img-00001.png”、“img-00002.png”,那么你应该能够在Matlab中加载图像序列。我想我找到了一个非常干净的解决方案,所以我会自己发布它作为答案。有一个用于.mat文件导出的简单开源java框架,名为(也可在SourceForge上获得,但这里一定要下载最新版本0.2)。它允许以.mat格式轻松导出数据,然后以简单的方式将其提供给Matlab。如果您在使用它时遇到任何问题,由于文档很少,请从此处下载源代码:
svn co https://jmatio.svn.sourceforge.net/svnroot/jmatio jmatio
看看单元测试,它们展示了如何使用它
回到我的问题:我需要上传一系列帧到Matlab。Matlab中的图像是2D矩阵,所以一组图像就是3D矩阵。不过,我不知道如何在Matlab中将Java数组导出为3D材质,所以我在Matlab中将每个Java.awt.image.buffereImage
导出为一行,这很容易做到。需要在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 );
}
}
}
公共类MatFileExporter{
专用缓冲图像帧;
私有int[][]帧;
私有整数帧大小;
私有int numFrames=100;
私有int frameNumber=0;
受保护的无效导出(){
//这将仅适用于8位编码的样本模型,如果需要,请进行更改
if(frames==null){
frameSize=frame.getData().getWidth()*frame.getHeight();
frames=新的int[numFrames][frames];
}
if(帧编号 for(int i=0;我希望您回答adnrewmu。我一定会记住与堆相关的提示。