我正在开展一个项目,我必须从摄像机设置视频流的fps(为10)并每隔5帧抓一帧。我正在研究一个已被其他人写过一半的程序。问题是,他们使用了Matrox Framegrabber dll。设备上还有Matrox Frame Grabber。但我无法在C#中找到任何framegrab的命令。我找到了以下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 dlls经验的人请告诉我如何进行帧捕获和fps设置。 感谢。
答案 0 :(得分: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是一个ushort缓冲区,其大小等于图像中的总像素数。
要将当前图像保存到文件,请使用
MIL.MbufSave(address,MilImage);
如果你没有.dcf文件,你可以免费从matrox安装cd获得一个默认文件。或者只是安装matrox viewer,在程序文件中就可以有一个。 宽度,高度和位深度等图像参数来自dcf文件。但是如果你愿意,你可以在上面的Mbufalloc2d函数中分配它们。
我会定期检查这个答案。如果有人有任何问题请问我。我试着尽我所知来回答它们。
答案 1 :(得分:0)
好像你已经弄明白了,但对于那些没有找到它的人,你需要做的就是包含MIL库并在C ++中的函数名之前加MIL.
。
像,
MbufClear(MilImageDisp[0], 0x0);
- >
MIL.MbufClear(MilImage, 0);
编辑有关FPS设置的问题:它是基于您的相机和DCF自动生成的。