Как передать несколько java.awt.image.BufferedImage в Matlab - PullRequest
0 голосов
/ 24 октября 2010

Я пишу Java-приложение для обработки изображений в реальном времени.Я хотел бы иметь возможность проверить используемые алгоритмы или представить данные, которые я получаю в приложении Java, с помощью Matlab.В приложении Java я использую java.awt.image.BufferedImage для внутренней обработки данных.Программа обычно работает около 1-2 минут и захватывает данные на частоте 25 Гц, 160x120 пикселей, 8-битная шкала серого, поэтому каждый кадр растра весит 19200 байт, что составляет 30 МБ полученных данных в минуту.лучший способ сделать эти данные доступными для Matlab?

Моя цель - получить массив Matlab со всеми кадрами в конце.Я рассмотрел хранение кадров в несжатом avi (что я пока не знаю, как это сделать), но, может быть, есть более простой, устоявшийся способ сделать это?Я уже прочитал this , но пока не знаю, как его использовать или если это правильный способ обработки нескольких кадров.

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 24 октября 2010

Вы должны иметь возможность хранить изображения в массиве в памяти - при условии, что вы предоставите JVM достаточно кучи памяти (опция -Xmx для java).

После того, как вы сделали снимки, вы можете записать их на диск, например, ImageIO.write(bufferedImage, "png", file)

Если вы поместите их все в каталог с простым именем файла, например, «img-00001.png», «img-00002.png», тогда вы сможете загружать последовательности изображений в Matlab.

0 голосов
/ 25 октября 2010

Я думаю, что нашел довольно чистое решение для своей проблемы, поэтому я опубликую его как ответ сам. Существует простая Java-инфраструктура с открытым исходным кодом для экспорта .mat-файлов, которая называется JMatIO (также доступна на SourceForge, но здесь обязательно загрузите новейшую версию 0.2). Это позволяет легко экспортировать данные в формате .mat, который затем доступен для Matlab простым способом. Если у вас возникли проблемы с его использованием, из-за небольшого количества документации загрузите исходный код здесь:

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

и посмотрите на юнит-тесты, они показывают, как его можно использовать.

Возвращаясь к моей проблеме: мне нужно было загрузить пакет кадров в Matlab. Изображение в Matlab - это двумерная матрица, поэтому пакет из них будет трехмерной матрицей. Я не понял, как экспортировать массивы Java как 3D-марши в Matlab, поэтому я экспортировал каждый java.awt.image.BufferedImage как строку в Matlab, что легко сделать. В 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 );
        }
    }

}

Не стесняйтесь использовать и изменять его, надеюсь, он кому-нибудь поможет. Добавочная запись .mat-файла также поддерживается, обратитесь к исходному коду для этого.

...