3

カメラからのビデオ ストリームの fps を (10 として) 設定し、5 フレームごとにフレームを取得する必要があるプロジェクトに取り組んでいます。私は、他の誰かによってすでに半分書かれているプログラムに取り組んでいます。問題は、Matrox Framegrabber dll を使用したことです。デバイスには Matrox Frame Grabber もあります。しかし、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 の設定方法について教えてください。ありがとう。

4

2 に答える 2

2

これは、matrox framegrabber を初めて使用するすべての人を対象としています。最初に行うべきことは、リファレンスとして matrox dll を追加することです。現在、Matrox 9 と Matrox 10 の 2 つのバージョンの Matrox があることに注意してください。ユーザー システムにインストールされている 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 ビューアーをインストールするだけで、プログラム ファイルに含めることができます。幅、高さ、ビット深度などの画像パラメータは、dcf ファイルから取得されます。ただし、必要に応じて、上記の Mbufalloc2d 関数でそれらを割り当てることができます。

この回答を定期的にチェックしようと思います。誰か質問があれば私に聞いてください。私の知る限り、それらに答えようとします。

于 2015-10-19T05:35:18.113 に答える