簡體   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