2010-10-24 105 views
0

我正在爲實時圖像處理編寫一個Java應用程序。我希望能夠驗證所使用的算法,或者隨後將使用Matlab在Java應用程序中獲取的數據呈現給用戶。在Java應用程序中,我使用java.awt.image.BufferedImage來內部處理數據。該程序通常運行約1-2分鐘,以25Hz,160x120像素8位灰度抓取數據,因此每幀的柵格權重爲19200字節,因此每分鐘可獲得30MB的採集數據。如何將一些java.awt.image.BufferedImage傳遞給Matlab

將這些數據提供給Matlab的最佳方法是什麼?

我的目標是在最後有一個Matlab數組,並在其中包含所有幀。我曾考慮將幀存儲在一個未壓縮的AVI文件中(我不知道該怎麼做),但也許有一種更簡單,更成熟的方法呢?我已經閱讀this,但不知道如何使用它,或者如果這是處理多個幀的正確方法。

感謝您的任何幫助。

回答

1

您應該可以將圖像存儲在內存中的數組中 - 只要您確保爲JVM提供了足夠的內存(Java的-Xmx選項)即可。

一旦你拍攝的圖像,你可以用它們寫入到磁盤,例如:ImageIO.write(bufferedImage, "png", file)

如果你把他們都在目錄中有一個簡單的文件名如「img-00001.png」,「img-00002.png」,那麼你應該可以在Matlab中載入圖像序列。

+0

謝謝你回答adnrewmu。我一定會記住與堆相關的提示。 – mmm 2010-10-25 07:35:49

0

我認爲我發現了一個非常乾淨的解決方案,因此我將自己發佈爲答案。 .mat文件導出有一個簡單的開源java框架,名爲JMatIO(也可在SourceForge上獲得,但在這裏一定要下載最新版本0.2)。它允許以.mat格式輕鬆導出數據,然後直接向Matlab提供。如果您在使用它,因爲小的文​​件有任何問題,從這裏下載源:

svn co https://jmatio.svn.sourceforge.net/svnroot/jmatio jmatio 

,並看看單元測試,他們展示如何使用。

回到我的問題:我需要上傳一幀幀到Matlab。 Matlab中的圖像是一個二維矩陣,所以它們中的一個會是一個3D矩陣。我沒有弄清楚如何在Matlab中將Java數組導出爲3D martices,所以我在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文件寫入也支持,請參閱源代碼。

相關問題