Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何传递一些java.awt.image.buffereImage';s到Matlab_Java_Matlab_Image Processing_Image Manipulation - Fatal编程技术网

如何传递一些java.awt.image.buffereImage';s到Matlab

如何传递一些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应用程序。我希望能够验证所使用的算法,或者在之后用Matlab展示我在Java应用程序中获取的数据。在Java应用程序中,我使用
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。我一定会记住与堆相关的提示。