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

Если 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() также обычно убеждается, что последние свойства объектов получения изображений используются (см., что Реализация Добирается и Поддержка Набора Device-Specific Properties), и конфигурирует аппаратные триггеры, если поддержано и установлено (см. Аппаратные Триггеры Поддержки).

Отправка сообщения к потоку приобретения

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

Функция PostThreadMessage() принимает эти параметры:

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

Следующая таблица описывает, как установить эти параметры для адаптера. Для получения дополнительной информации о передающих сообщениях потока, см. документацию на веб-сайте Microsoft® Developer Network (msdn.microsoft.com).

Параметр

Описание

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() в демонстрационном адаптере обеспечивает другой пример того, как остановить цикл приобретения кадра. Адаптер задает переменную флага, которую он проверяет каждый раз, когда он вводит цикл приобретения кадра. Чтобы убежать из цикла приобретения кадра, демонстрационный адаптер устанавливает эту переменную флага на ложь. Дополнительную информацию см. в демонстрационном исходном коде адаптера.