2015-04-23 1 views
3

Я работаю над проектом, где мне нужно установить fps видеопотока (как 10) из камеры и захватить кадр каждые 5 кадров. Я работаю над программой, которая уже была написана кем-то еще наполовину. Дело в том, что они использовали DLL Matrox Framegrabber. На устройстве также есть Matrox Frame Grabber. Но я не могу найти какие-либо команды для framegrab в C#. Я нашел следующий код для C++.Захват кадра с использованием команд Matrox

MIL_ID MdispAlloc(SystemId, DispNum, DispFormat, InitFlag, 
DisplayIdPtr) 

где

MIL_ID SystemId; System identifier 
long DispNum; Display number 
char *DispFormat; Display format name or file name 
long InitFlag; Initialization flag 
MIL_ID *DisplayIdPtr; Storage location for the display identifier 

Эта команда выделяет дисплей. Может кто-то, пожалуйста, помогите мне написать программу на C#. Кроме того, любой, кто имеет опыт работы с DLL Matrox, дайте мне представление о том, как подойти к захвату кадров и настроить fps. Спасибо.

ответ

1

Это для всех, кто не знаком с matrox framegrabber. Первое, что вам нужно сделать, это добавить ссылку matrox dll в качестве ссылки. Имейте в виду, что в настоящее время существуют две версии matrox: Matrox 9 и Matrox 10. В зависимости от версии matrox, установленной в пользовательской системе, dll следует добавить. .. (Это можно проверить, посмотрев на «MIL_PATH» в системных каталогах Затем объявить некоторые переменные, которые будут использоваться в Matrox захватывая

Некоторые из шахты ниже:

public static MIL_ID MilApplication = MIL.M_NULL;  // Application identifier. 
    public static MIL_ID MilSystem = MIL.M_NULL;  // System identifier.  
    public static MIL_ID MilDisplay = MIL.M_NULL;  // Display identifier.  
    public static MIL_ID MilDigitizer = MIL.M_NULL;  // Digitizer identifier. 
    public static MIL_ID MilImage = MIL.M_NULL;  // Image identifier. 
    public static MIL_ID MilRecord = MIL.M_NULL;  // 8 bit Pointer only for Video Recording. 
    public MIL_INT MilINT = MIL.M_NULL; 
    public MIL_INT NbPixelsPtr = MIL.M_NULL; 
    MIL_ID MilImageDisp = MIL.M_NULL; 
    MIL_ID[] MilGrabBufferList = new MIL_ID[BUFFERING_SIZE_MAX]; 

Затем выполните следующее код

string MilSystemDet = ""; 
      MilSystemDet = Environment.GetEnvironmentVariable("Mil_Path"); 
      if (MilSystemDet != null) 
      { 
string dcfFilePath = ""; 
      FileDialog OpenFile = new OpenFileDialog(); 
      OpenFile.Filter = "File Formats(*.dcf)|*.DCF;"; 
      if (OpenFile.ShowDialog() == DialogResult.OK) 
      { dcfFilePath = OpenFile.FileName; 
    MIL.MdigAlloc(MilSystem, MIL.M_DEFAULT, dcfFilePath, MIL.M_DEFAULT, ref MilDigitizer); 
MIL.MbufAlloc2d(MilSystem, 
       MIL.MdigInquire(MilDigitizer, MIL.M_SIZE_X, MIL.M_NULL), 
        MIL.MdigInquire(MilDigitizer, MIL.M_SIZE_Y, MIL.M_NULL), 
8 + MIL.M_UNSIGNED, 
          MIL.M_IMAGE + MIL.M_DISP + MIL.M_GRAB, 
          ref MilImage); 
       MIL.MdispAlloc(MilSystem, MIL.M_DEFAULT, ("M_DEFAULT"), MIL.M_DEFAULT, ref MilDisplay); 
MIL.MdigHalt(MilDigitizer); 

Если вы хотите, чтобы начать захват, выполните следующие действия

MIL.MbufClear(MilImage, 0); 
       MIL.MdigGrabContinuous(MilDigitizer, MilImage); 
       MIL.MdispControl(MilDisplay, MIL.M_VIEW_MODE, MIL.M_AUTO_SCALE); 
       MIL.MdispControl(MilDisplay, MIL.M_SCALE_DISPLAY, MIL.M_ENABLE); 

Чтобы скопировать текущее изображение в буфер, использовать

MIL.MbufGet(MilImage, myBuffer); 

, где myBuffer представляет собой USHORT буфер с размером, равным общему числу пикселей в изображении.

Чтобы сохранить текущее изображение в файл, используйте

MIL.MbufSave(address,MilImage); 

Если вы не имеете .dcf файл, который вы можете получить по умолчанию один из установки Matrox кд бесплатно. Или просто установите программу просмотра matrox, а в программных файлах вы можете ее использовать. Параметры изображения, такие как ширина, высота и глубина бит, получены из файла dcf. Но если вы хотите, вы можете выделить их в функции Mbufalloc2d выше.

Я постараюсь периодически проверять этот ответ. Если у меня есть вопросы, спросите меня. Я постараюсь ответить им, насколько мне известно.

0

Похоже, вы поняли это, но для тех, у кого этого нет, все, что вам нужно сделать, это включить библиотеку MIL и иметь MIL. перед именем функции на C++.

Мол,

MbufClear(MilImageDisp[0], 0x0); 

->

MIL.MbufClear(MilImage, 0); 

Edit для вопроса о настройке FPS: Это автоматически на основе камеры и DCF.

Смежные вопросы