Захват кадров с помощью команд 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.