Захват кадров с помощью команд Matrox

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

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#. Кроме того, любой, кто имеет опыт работы с Matrox dll, подскажите, пожалуйста, как подходить к захвату кадров и настройке fps. Благодарю.

2 ответа

Решение

Это для всех, кто плохо знаком с 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 - это короткий буфер с размером, равным общему количеству пикселей в изображении.

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

MIL.MbufSave(address,MilImage);

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

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

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

Подобно,

   MbufClear(MilImageDisp[0], 0x0);

->

MIL.MbufClear(MilImage, 0);

Отредактируйте свой вопрос по настройке FPS: он автоматически зависит от вашей камеры и DCF.

Другие вопросы по тегам