exponenta event banner

Запуск и остановка получения изображения

Однажды openDevice() возврат выполнен успешно, обработчик вызывает адаптер startCapture() для начала получения данных.

Движок вызывает ваш адаптер stopCapture() при вызове пользователем stop или closepreview функция на объекте ввода видео или когда было получено заданное количество кадров и получение завершено. Например,

vid = videoinput('winvideo',1);
set(vid,'FramesPerTrigger',1000); // 
start(vid);
stop(vid);

Рекомендуемый алгоритм для startCapture ()

startCapture() обычно выполняет следующие задачи.

  1. Проверьте, не произошло ли уже приобретение, с помощью IAdaptor функция-член isAcquiring(). Если это так, выйдите.

  2. Отправка сообщения в поток сбора данных с помощью Windows ®PostThreadMessage() функция, указывающая ей начать получение кадров изображения от устройства. Дополнительные сведения см. в разделе Отправка сообщения в поток сбора данных.

    Примечание

    Отправка начального сообщения в поток сбора данных требуется только в том случае, если адаптер использует конструкцию на основе потока. Адаптеры также могут использовать асинхронные прерывания (обратные вызовы) для получения кадров, если устройство поддерживает это. Дополнительные сведения см. в документации, поставляемой с SDK устройства.

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

Отправка сообщения в поток сбора данных

Чтобы отправить сообщение потоку, используйте Windows PostThreadMessage() функция. Функция потока сбора данных адаптера использует Windows GetMessage() функция для получения этих сообщений - см. Пример: Открытие соединения.

PostThreadMessage() функция принимает следующие параметры:

BOOL PostThreadMessage( DWORD idThread,
                        UINT Msg,
                        WPARAM wParam,
                        LPARAM lParam
);

В следующей таблице описано, как установить эти параметры для адаптера. Дополнительные сведения об отправке сообщений потока см. в разделе Microsoft Docs.

Параметр

Описание

idThread

Идентификатор потока, в который должно быть отправлено сообщение, возвращаемое CreateThread().

Msg

Сообщение для проводки. Microsoft ® определяет диапазон значений для сообщений пользователя, начиная со значенияWM_USER.

wParam

Дополнительная специфичная для сообщения информация

lParam

Дополнительная специфичная для сообщения информация

Пример: Инициирование получения

Этот пример иллюстрирует простой startCapture() функция. Эта функция не принимает аргументов и возвращает логическое значение, указывающее, находится ли объект ввода видео в start состояние.

  1. Замените реализацию заглушки в MyDeviceAdaptor.cpp с этим кодом, а затем перестроить адаптер.

    bool MyDeviceAdaptor::startCapture(){
        // Check if device is already acquiring frames. 
        if (isAcquiring())
            return false; 
    
        // Send start message to acquisition thread 
        PostThreadMessage(_acquireThreadID, WM_USER, 0, 0);
        
        return true;
    }
    
  2. Запустите программное обеспечение MATLAB ® и запустите адаптер, чтобы убедиться, что поток сбора данных получает начальное сообщениеfrom startCapture().

Предлагаемый алгоритм для stopCapture ()

stopcapture() функция обычно выполняет эти задачи.

  1. Проверка того, что адаптер уже остановлен путем вызова isAcquiring() функция. Если устройство не получает данные, вернитесь true.

  2. Останавливает цикл захвата кадра и при необходимости останавливает устройство

    Примечание

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

Пример

Следующий пример иллюстрирует простой stopCapture() функция. Эта функция не принимает аргументов и возвращает логическое значение, указывающее, находится ли объект ввода видео в stopped состояние. Замените реализацию заглушки в MyDeviceAdaptor.cpp с этим кодом, а затем перестроить адаптер.

bool MyDeviceAdaptor::stopCapture(){

// If the device is not acquiring data, return. 
   if (!isOpen()) 
      return true;

//**********************************************************
// Insert calls to your device's SDK to stop the device, if
// necessary.
//**********************************************************

   return true;
}

stopCapture() функция в демонстрационном адаптере предоставляет другой пример того, как остановить цикл захвата кадра. Адаптер определяет переменную флага, которую он проверяет каждый раз при входе в цикл захвата кадра. Чтобы выйти из цикла захвата кадра, демонстрационный адаптер устанавливает для этой переменной флага значение false. Дополнительные сведения см. в исходном коде демонстрационного адаптера.