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

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

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

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

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

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

  1. Проверьте, происходит ли приобретение, используя IAdaptor функции представителя isAcquiring(). Если это так, выход.

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

    Примечание

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

The startCapture() функция также обычно гарантирует, что используются последние свойства объекта сбора изображений (см. «Реализация Get and Set Support for Device-Specific Properties»), и конфигурирует аппаратные триггеры, если они поддерживаются и устанавливаются (см. «Support Hardware Triggers»).

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

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

The 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 ()

The 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;
}

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