Класс MATLAB для загрузки файлов

Новичок с MATLAB здесь. Я пытаюсь написать класс, который будет загружать изображения из папки, и вот что у меня есть:

classdef ImageLoader
    %IMAGELOADER Summary of this class goes here
    %   Detailed explanation goes here

    properties
        currentImage = 0;
        filenames={};
        filenamesSorted={};
    end

    methods
        function imageLoader = ImageLoader(FolderDir)
            path = dir(FolderDir);
            imageLoader.filenames = {path.name};
            imageLoader.filenames = sort(imageLoader.filenames);
        end

        function image = CurrentImage(this)
            image = imread(this.filenames{this.currentImage});
        end

        function image = NextImage(this)
            this.currentImage = this.currentImage + 1;
            image = imread(this.filenames{this.currentImage});
        end
    end    
end

Вот как я это называю:

i = ImageLoader('football//Frame*');
image=i.NextImage;

imshow(image);

Файлы называются Frame0000.jpg, Frame0001.jpg ... и т. д. Я хочу, чтобы конструктор загружал все имена файлов, чтобы я мог затем получить следующий файл, просто вызвав i.NextImage, но я не могу заставить его работать.


Получил это работает.

сорт:

classdef ImageLoader
    %IMAGELOADER Summary of this class goes here
    %   Detailed explanation goes here

    properties(SetAccess = private)
        currentImage
        filenames
        path
        filenamesSorted;
    end

    methods
        function imageLoader = ImageLoader(Path,FileName)
            imageLoader.path = Path;
            temp = dir(strcat(Path,FileName));
            imageLoader.filenames = {temp.name};
            imageLoader.filenames = sort(imageLoader.filenames);
            imageLoader.currentImage = 0;
        end

        function image = CurrentImage(this)
            image = imread(this.filenames{this.currentImage});
        end

        function [this image] = NextImage(this)
            this.currentImage = this.currentImage + 1;
            image = imread(strcat(this.path,this.filenames{this.currentImage}));
        end
    end    
end

вызов:

i = ImageLoader('football//','Frame*');
[i image]=i.NextImage;

imshow(image);

person Eamonn McEvoy    schedule 26.11.2012    source источник


Ответы (1)


Насколько я знаю, вы не можете изменить состояние объекта (как вы делаете при инкрементировании указателя currentimage) без явного обновления значения самого объекта в конце. AFAIK каждый вызов функции передает объекты byval, это означает, что NextImage просто изменяет локальную копию this (которая не является указателем/ссылкой на текущий объект, а копией).

Таким образом, вы можете написать свой метод как

  function [this image] = NextImage(this)
        this.currentImage = this.currentImage + 1;
        image = imread(this.filenames{this.currentImage});
  end

и назовите это как

 [i image]=i.NextImage;
person Acorbe    schedule 26.11.2012
comment
Обратите внимание, что вы можете добиться такого поведения без использования явного возврата объекта с помощью объектов-дескрипторов. mathworks.com/help/matlab/ref/handle.html Хотя Я нахожу их невероятно сложными в использовании, поскольку, несмотря на то, что поведение этих объектов радикально отличается от поведения всех других переменных MATLAB, синтаксис идентичен - person Pete; 27.11.2012
comment
@Pete, большое спасибо за эту информацию! Действительно, я вижу огромные накладные расходы в коде, который я разместил; handles, дающие java-подобные ссылки, определенно могут это исправить. - person Acorbe; 27.11.2012