【问题标题】:How to pass a number of java.awt.image.BufferedImage's to Matlab如何将多个 java.awt.image.BufferedImage 传递给 Matlab
【发布时间】:2011-04-29 21:25:38
【问题描述】:

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

将这些数据提供给 Matlab 的最佳方式是什么?

我的目标是在最后创建一个包含所有帧的 Matlab 数组。我考虑过将帧存储在未压缩的 avi 中(我还不知道该怎么做),但也许有一种更简单、更成熟的方法?我已经阅读了this,但还不知道如何使用它,或者这是否是处理多个帧的正确方法。

感谢您的帮助。

【问题讨论】:

    标签: java matlab image-processing image-manipulation


    【解决方案1】:

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

    捕获图像后,您可以使用例如:ImageIO.write(bufferedImage, "png", file) 将它们写入磁盘

    如果您将它们全部放在具有简单文件名的目录中,例如"img-00001.png", "img-00002.png",那么你应该可以在Matlab中加载图像序列。

    【讨论】:

    • 感谢您回答adnrewmu。我一定会记住与堆相关的提示。
    【解决方案2】:

    我想我为我的问题找到了一个非常干净的解决方案,所以我会自己发布它作为答案。有一个用于导出 .mat 文件的简单开源 java 框架,名为 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 中需要一些琐碎的数据操作来表示数据,就像之后想要的那样(矩阵转置和重塑函数)。看看下面的代码sn-p。函数 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 文件写入,请参阅源代码。

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2015-05-15
      • 2018-08-01
      相关资源
      最近更新 更多