繁体   English   中英

如何将多个java.awt.image.BufferedImage传递给Matlab

[英]How to pass a number of java.awt.image.BufferedImage's to Matlab

我正在编写一个用于实时图像处理的Java应用程序。 之后,我希望能够验证使用的算法或展示我在Matlab的Java应用程序中获取的数据。 在Java应用程序中,我正在使用java.awt.image.BufferedImage在内部处理数据。 该程序通常运行约1-2分钟,并以25Hz,160x120像素的8位灰度级捕获数据,因此每帧栅格的权重为19200字节,每分钟获取30MB的数据。

将数据提供给Matlab的最佳方法是什么?

我的目标是要有一个Matlab数组,最后包含所有框架。 我曾考虑过将帧存储在未压缩的avi中(我尚不知道如何做),但是也许有一种更简单,既定的方式来做到这一点? 我已经读过 ,但是还不知道如何使用它,或者这是否是处理多个帧的正确方法。

谢谢你的帮助。

只要确保为JVM提供足够的堆内存(java的-Xmx选项),就应该能够将图像存储在内存中的数组中。

捕获图像后,可以使用以下命令将其写入磁盘: ImageIO.write(bufferedImage, "png", file)

如果将它们全部以简单的文件名(例如“ img-00001.png”,“ img-00002.png”)放在目录中,则应该能够在Matlab中加载图像序列。

我想我找到了一个非常干净的解决方案,所以我将自己发布为答案。 有一个简单的开源Java框架,用于.mat文件导出,称为JMatIO (也可以从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.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文件编写,请参考源代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM