Обеспечение данных изображения в рабочее пространство MATLAB

Обзор

Тулбокс обеспечивает три способа переместить кадры от буфера памяти в рабочую область MATLAB®:

  • При удалении нескольких кадров из буфера — Чтобы переместить конкретное количество кадров от буфера памяти в рабочую область, используйте функцию getdata. Функция getdata удаляет кадры из буфера памяти, когда это перемещает их в рабочую область. Функциональные блоки командная строка MATLAB до всех требуемых кадров доступна, или до значения тайм-аута, истекают. Для получения дополнительной информации смотрите Перемещение Нескольких Кадров в Рабочую область.

  • При просмотре последний раз полученных кадров в буфере — Чтобы принести последний раз полученные кадры в буфере памяти в рабочую область, не удаляя их из буфера, используйте функцию peekdata. При возврате кадров peekdata запускается с последний раз полученного кадра и работает назад в буфере памяти. Напротив, getdata запускается в начале буфера, возвращая самый старый полученный кадр сначала. peekdata не блокирует командную строку и, как гарантируют, не возвратит все кадры, которые вы запрашиваете. Для получения дополнительной информации смотрите Кадры Просмотра в Буфере памяти.

  • Принося один кадр данных в рабочую область — Как удобство, тулбокс обеспечивает функцию getsnapshot, которая возвращает один кадр данных в рабочее пространство MATLAB. Поскольку функция getsnapshot не требует запуска объекта или инициирования приобретения, это - самый легкий способ принести данные изображения в рабочую область. getsnapshot независим от буфера памяти; это может возвратить кадр, даже если буфер памяти пуст, и возвращенный кадр не влияет на значение свойства FramesAvailable. Для получения дополнительной информации смотрите Обеспечение Одного Кадра в Рабочую область. Для примера использования getsnapshot смотрите, что пример Image Acquisition Toolbox™ Получает Одно Изображение в Цикле в списке Examples наверху Image Acquisition Toolbox основная страница Documentation Center или откройте файл demoimaq_GetSnapshot.m в редакторе MATLAB.

Перемещение нескольких кадров в рабочую область

Чтобы переместить несколько кадров данных из буфера памяти в рабочее пространство MATLAB, используйте функцию getdata. По умолчанию getdata получает количество кадров, заданных в свойстве FramesPerTrigger, но можно задать любой номер. Смотрите страницу с описанием getdata для полной информации об этой функции.

Примечание

Когда getdata функционирует кадры перемещений от буфера памяти в рабочую область, это удаляет кадры из буфера памяти.

В этой фигуре в getdata заходят T1 с запросом о 15 кадрах, но только шесть кадров доступны в буфере памяти. блоки getdata до конкретного количества кадров становятся доступными в T2, в которой точке getdata перемещает кадры в рабочее пространство MATLAB и возвращает управление в командную строку.

Блоки getdata До Кадров Становятся Доступными

Получение 10 секунд данных изображения

Этот пример показывает, как можно сконфигурировать аппроксимированное основанное на времени приобретение с помощью свойства FramesPerTrigger:

  1. Создайте объект получения изображений — Этот пример создает объект ввода видео для устройства получения изображений Windows®. Чтобы запустить этот пример в вашей системе, используйте функцию imaqhwinfo, чтобы получить конструктора Object для вашего устройства получения изображений и заменить тем синтаксисом следующий код.

    vid = videoinput('winvideo',1);
  2. Сконфигурируйте свойства — Чтобы получить 10 секунд данных, определить частоту кадров вашего устройства получения изображений и затем умножить частоту кадров на номер секунд данных, которые вы хотите получить. Продуктом этого умножения является значение свойства FramesPerTrigger.

    В данном примере примите частоту кадров 30 кадров в секунду (фут в секунду). Умножаясь 30 10, необходимо установить свойство FramesPerTrigger на значение 300.

    vid.FramesPerTrigger = 300;
  3. Запустите объект получения изображений — Вызывают функцию start, чтобы запустить объект получения изображений.

    start(vid)

    Объект выполняет мгновенный триггер и начинает получать кадры данных. Функция start возвращает управление в командную строку сразу, но объект продолжает регистрировать данные к буферу памяти. После журналирования конкретного количества кадров объект прекращает запускаться.

  4. Принесите полученные данные в рабочую область — Чтобы проверить, что вы получили объем данных, который вы хотели, используйте дополнительный синтаксис getdata, который возвращает метку времени каждого полученного кадра. Различие между первой меткой времени и последней меткой времени должно аппроксимировать объем данных, который вы ожидали.

    [data time] = getdata(vid,300);
    
    elapsed_time = time(300) - time(1)
    
         10.0467
  5. Вымойтесь — Всегда удаляют объекты получения изображений из памяти и переменные, которые ссылаются на них, когда вам больше не нужны они.

    delete(vid)
    clear vid

Просмотр кадров в буфере памяти

Чтобы просмотреть демонстрационные кадры от буфера памяти, не удаляя их, используйте функцию peekdata.

Функция peekdata всегда возвращает последний раз полученные кадры в буфере памяти. Например, если вы запрашиваете три кадра, peekdata возвращает последний раз полученный кадр в буфере во время запроса и два кадра, которые сразу предшествуют ему.

Следующая фигура иллюстрирует этот процесс. Команда peekdata(vid,3) называется в три различных раза (T1, T2 и T3). Теневые кадры указывают на кадры, возвращенные peekdata в каждом вызове. (peekdata возвращает кадры, не удаляя их из буфера памяти.)

Обратите внимание в фигуре, что в T3 только два кадра стали доступными начиная с последней возможности к peekdata. В этом случае peekdata возвращает только два кадра с предупреждением, что он возвратил меньше данных, чем требовалось.

Кадры Возвращены peekdata

Примечание

Функция peekdata не возвращает данных при выполнении если в дисковом режиме журналирования.

Следующий пример иллюстрирует, как использовать peekdata:

  1. Создайте объект получения изображений — Этот пример создает объект ввода видео для устройства получения изображений Data Translation®. Чтобы запустить этот пример в вашей системе, используйте функцию imaqhwinfo, чтобы получить конструктора Object для вашего устройства получения изображений и заменить тем синтаксисом следующий код.

    vid = videoinput('dt',1);
  2. Сконфигурируйте свойства — В данном примере конфигурируют ручной триггер. Необходимо использовать функцию triggerconfig, чтобы задать триггерный тип.

    triggerconfig(vid,'manual')

    Кроме того, сконфигурируйте достаточно большое приобретение, чтобы позволить несколько вызовов peekdata, прежде чем он закончится.

    vid.FramesPerTrigger = 300;
  3. Запустите объект получения изображений — Вызывают функцию start, чтобы запустить объект получения изображений.

    start(vid)

    Видео объект теперь запускает, но не регистрирует.

    isrunning(vid)
    
    ans =
    
         1
    
    islogging(vid)
    
    ans =
    
         0
  4. Используйте peekdata, чтобы просмотреть кадры перед триггером — Если вы вызываете peekdata, прежде чем вы инициируете приобретение, peekdata может только возвратить один кадр данных, потому что регистрация данных не инициировалась, и буфер памяти пуст. Если больше чем один кадр требуют, peekdata выдает предупреждение, что это возвращает меньше, чем требуемое количество кадров.

    pdata = peekdata(vid,50);
    Warning: PEEKDATA could not return all the frames requested.

    Проверьте, что peekdata возвратил один кадр. Один кадр данных должен иметь ту же ширину и высоту, как задано свойством ROIPosition и тем же количеством полос, как задано свойством NumberOfBands. В этом примере формат видео данных является RGB, таким образом, значение свойства NumberOfBands равняется 3.

    whos
      Name        Size                   Bytes  Class
    
      pdata       96x128x3               36864  uint8 array
      vid          1x1                    1060  videoinput object

    Проверьте, что объект не получил кадров.

    vid.FramesAcquired
    ans = 
    	0
  5. Инициируйте приобретение — Вызывают функцию trigger, чтобы инициировать приобретение.

    trigger(vid)

    Объект начинает регистрировать кадры к буферу памяти.

  6. Просмотрите последний раз полученные кадры — В то время как приобретение происходит, вызовите peekdata несколько раз, чтобы просмотреть последние кадры в буфере памяти. В зависимости от количества кадров вы запрашиваете, и синхронизация этих запросов, peekdata может возвратить меньше, чем количество кадров, которые вы задаете.

    pdata = peekdata(vid,50);

    Чтобы проверить, что peekdata возвратил кадры, которые вы запросили, проверяйте размерности pdata. peekdata возвращает четырехмерный массив кадров, где последняя размерность указывает на количество возвращенных кадров.

    whos
      Name        Size                  Bytes   Class
    
      pdata       4-D                 1843200   uint8 array
      vid         1x1                    1060   videoinput object
    
    size(pdata)
    
    ans =
    
        96   128     3    50
  7. Вымойтесь — Всегда удаляют объекты получения изображений из памяти и переменные, которые ссылаются на них, когда вам больше не нужны они.

    delete(vid)
    clear vid

Обеспечение одного кадра в рабочую область

Чтобы принести один кадр данных изображения в рабочее пространство MATLAB, используйте функцию getsnapshot. Можно вызвать функцию getsnapshot в любое время после создания объекта.

Этот пример иллюстрирует, как простой это должно использовать функцию getsnapshot.

  1. Создайте объект получения изображений — Этот пример создает объект ввода видео для устройства Matrox®. Чтобы запустить этот пример в вашей системе, используйте функцию imaqhwinfo, чтобы получить конструктора Object для вашего устройства получения изображений и заменить тем синтаксисом следующий код.

    vid = videoinput('matrox',1);
  2. Принесите кадр в рабочую область — Вызывают функцию getsnapshot, чтобы принести кадр в рабочую область. Обратите внимание на то, что вы не должны запускать объект ввода видео прежде, чем вызвать функцию getsnapshot.

    frame = getsnapshot(vid);

    Функция getsnapshot возвращает изображение той же ширины и высоты, как задано свойством ROIPosition и тем же количеством полос, как задано свойством NumberOfBands. В этом примере формат видео данных является RGB, таким образом, значение свойства NumberOfBands равняется 3.

    whos
      Name        Size                   Bytes  Class
    
      frame      96x128x3                36864  uint8 array
      vid         1x1                     1060  videoinput object

    Обратите внимание на то, что кадр, возвращенный getsnapshot, не удален из буфера памяти, если кадры хранятся там, и не влияет на значение свойства FramesAvailable.

  3. Вымойтесь — Всегда удаляют объекты получения изображений из памяти и переменные, которые ссылаются на них, когда вам больше не нужны они.

    delete(vid)
    clear vid 

Для примера использования getsnapshot смотрите, что пример Image Acquisition Toolbox Получает Одно Изображение в Цикле в списке Examples наверху Image Acquisition Toolbox основная страница Documentation Center или откройте файл demoimaq_GetSnapshot.m в редакторе MATLAB.