DirectShow ビデオ入力コンポーネント

Namespace: FVIL.DS
Assembly: FVILforms (in FVILforms.dll) Version: 3.1.0.0 (3.1.0.9)

Syntax

C#
[SerializableAttribute]
public class CFviGrabberUI : Component
Visual Basic
<SerializableAttribute>
Public Class CFviGrabberUI
	Inherits Component

Remarks

DirectShow 対応ビデオ入力クラスとそのパラメータのオブジェクトをまとめて管理するコンポーネントです。
このコンポーネントは自身の生成時に、DirectShow 対応カメラの設定・取り込みに必要なクラスのオブジェクトを生成し、 プロパティからのアクセスを提供します。 プロパティで操作できるオブジェクトについては該当クラスの説明をご参照ください。

デザイン時:

このコンポーネントをフォームのクライアント領域の任意の位置にドロップ(下図(1))してください。 ドロップすると下図(2)のようにアイコンが作成されます。


ツールボックス項目:

WIL 3.0 と WIL 3.1 のコンポーネントを同時に表示することができません。 プロジェクトが参照する FVIL バージョンに合わせてツールボックス項目のバージョンを切り替える必要があります。 詳しくは、このマニュアルの メインページ/過去のバージョンとの互換性/ツールボックス項目の切り替え をご参照ください。


イベントハンドラの登録:

下図のように FrameValid イベントにイベントハンドラを登録すると カメラが画像を取り込んだことを通知するイベントを受け取ることができます。 作成されたアイコンを選択し、プロパティウィンドウでイベントハンドラを登録できます。


Examples

ソースコード:

下記のサンプルコードは、初期化、カメラ選択、画像表示の流れを最も単純に行う方法を示します。

  1. 画像取り込みバッファを設定します。
  2. カメラを選択します。
  3. 画像取り込み完了イベントを受け取り画像ビューに表示します。
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace User.SampleCode.DS
{
    public partial class CFviGrabberUI_SimpleForm : Form
    {
        public CFviGrabberUI_SimpleForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// フォーム初期化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnFormLoad(object sender, EventArgs e)
        {
            // 画像取り込みバッファの設定.
            for(int i=0 ; i<5 ; i++)
                cFviGrabberUI1.Controller.Images.Add(new FVIL.Data.CFviImage());
        }

        /// <summary>
        /// ボタンが押されたとき
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            // カメラ選択
            if (cFviGrabberUI1.OpenDialog() == DialogResult.OK)
            {
                // 画像取り込みバッファのサイズ調整.
                cFviGrabberUI1.Controller.Validate();

                // 取り込み開始.
                cFviGrabberUI1.Controller.Run();
            }
        }

        /// <summary>
        /// 画像取り込み完了イベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cFviGrabberUI1_FrameValid(object sender, FVIL.DS.GrabberEventArgs e)
        {
            if (e.Status == FVIL.DS.GrabberEventStatus.Done)
            {
                cFviImageView1.Image = e.Image;
                cFviImageView1.Refresh();
            }
        }
    }
}


Visual Basic Copy imageCopy
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms

Namespace SampleCode.DS
    Public Partial Class CFviGrabberUI_SimpleForm
        Inherits Form
        Public Sub New()
            InitializeComponent()
        End Sub

        ''' <summary>
        ''' フォーム初期化
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        Private Sub OnFormLoad(sender As Object, e As EventArgs)
            ' 画像取り込みバッファの設定.
            For i As Integer = 0 To 4
                cFviGrabberUI1.Controller.Images.Add(New FVIL.Data.CFviImage())
            Next
        End Sub

        ''' <summary>
        ''' ボタンが押されたとき
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        Private Sub toolStripButton1_Click(sender As Object, e As EventArgs)
            ' カメラ選択
            If cFviGrabberUI1.OpenDialog() = DialogResult.OK Then
                ' 画像取り込みバッファのサイズ調整.
                cFviGrabberUI1.Controller.Validate()

                ' 取り込み開始.
                cFviGrabberUI1.Controller.Run()
            End If
        End Sub

        ''' <summary>
        ''' 画像取り込み完了イベント
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        Private Sub cFviGrabberUI1_FrameValid(sender As Object, e As FVIL.DS.GrabberEventArgs)
            If e.Status = FVIL.DS.GrabberEventStatus.Done Then
                cFviImageView1.Image = e.Image
                cFviImageView1.Refresh()
            End If
        End Sub
    End Class
End Namespace

ソースコード:

下記のサンプルコードは、デザイナを使用せず直接コーディングした場合を示します。

C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;
using System.Windows.Forms;
using FVIL.DS;

namespace User.SampleCode
{
    public partial class DS
    {
        [FvPluginExecute]
        public void GrabberUI_OpenDialog()
        {
            try
            {
                // 1) インスタンスの生成.
                FVIL.DS.CFviGrabberUI grabber = new FVIL.DS.CFviGrabberUI();

                // 2) カメラ選択ダイアログの表示.
                grabber.OpenDialog();

                // E) 確認.
                {
                    // パラメータの取得.
                    FVIL.DS.CFviGrabberParam param = grabber.Param;                    

                    Console.WriteLine("FilterCategory    : {0}", param.FilterCategory);
                    Console.WriteLine("FilterFormatInfo : {0}", param.FilterFormatInfo);
                    Console.WriteLine("FilterInfo        : {0}", param.FilterInfo);
                    Console.WriteLine("FilterPinInfo    : {0}", param.FilterPinInfo);
                    Console.WriteLine("RenderID            : {0}", param.RenderID);
                    Console.WriteLine("SampleFormatInfo : {0}", param.SampleFormatInfo);
                }

                // 3) 画像取り込み用バッファの設定.
                grabber.Controller.ImageType = FVIL.ImageType.RGB24;
                for( int index = 0; index < 3 ; index++)
                    grabber.Controller.Images.Add(new FVIL.Data.CFviImage());

                grabber.Controller.Validate();

                // 4) 入力の開始.
                grabber.Controller.Run();

                // 5) 1フレーム取り込み完了まで待機.
                if (!grabber.Controller.Wait(10000))
                {
                    Console.WriteLine("TimeOut");
                }

                // 6) 入力の停止.
                grabber.Controller.Stop();

                // E) 画像の保存.
                FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/DS.GrabberUI_OpenDialog.bmp", grabber.Controller.LastImage);
            }
            catch (FVIL.DS.CFviExceptionDS ex)
            {
                Console.WriteLine("Message:{0}", ex.Message);
                Console.WriteLine("DSMessage:{0}", CFviExceptionDS.GetDirectShowMessage(ex.ComError));
            }
            catch (FVIL.CFviException ex)
            {
                Console.WriteLine("--Function = {0} ErrorCode = {1}", ex.Function, ex.ErrorCode);
                Console.WriteLine("--Message:{0}", ex.Message);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("--Message:{0}", ex.Message);
            }
        }
    }
}


Visual Basic Copy imageCopy
Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli
Imports System.Windows.Forms
Imports FVIL.DS

Namespace SampleCode
    Public Partial Class DS
        <FvPluginExecute> _
        Public Sub GrabberUI_OpenDialog()
            Try
                ' 1) インスタンスの生成.
                Dim grabber As New FVIL.DS.CFviGrabberUI()

                ' 2) カメラ選択ダイアログの表示.
                grabber.OpenDialog()

                ' E) 確認.
                If True Then
                    ' パラメータの取得.
                    Dim param As FVIL.DS.CFviGrabberParam = grabber.Param

                    Console.WriteLine("FilterCategory" & vbTab & ": {0}", param.FilterCategory)
                    Console.WriteLine("FilterFormatInfo : {0}", param.FilterFormatInfo)
                    Console.WriteLine("FilterInfo" & vbTab & vbTab & ": {0}", param.FilterInfo)
                    Console.WriteLine("FilterPinInfo" & vbTab & ": {0}", param.FilterPinInfo)
                    Console.WriteLine("RenderID" & vbTab & vbTab & vbTab & ": {0}", param.RenderID)
                    Console.WriteLine("SampleFormatInfo : {0}", param.SampleFormatInfo)
                End If

                ' 3) 画像取り込み用バッファの設定.
                grabber.Controller.ImageType = FVIL.ImageType.RGB24
                For index As Integer = 0 To 2
                    grabber.Controller.Images.Add(New FVIL.Data.CFviImage())
                Next

                grabber.Controller.Validate()

                ' 4) 入力の開始.
                grabber.Controller.Run()

                ' 5) 1フレーム取り込み完了まで待機.
                If Not grabber.Controller.Wait(10000) Then
                    Console.WriteLine("TimeOut")
                End If

                ' 6) 入力の停止.
                grabber.Controller.[Stop]()

                ' E) 画像の保存.
                FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/DS.GrabberUI_OpenDialog.bmp", grabber.Controller.LastImage)
            Catch ex As FVIL.DS.CFviExceptionDS
                Console.WriteLine("Message:{0}", ex.Message)
                Console.WriteLine("DSMessage:{0}", CFviExceptionDS.GetDirectShowMessage(ex.ComError))
            Catch ex As FVIL.CFviException
                Console.WriteLine("--Function = {0} ErrorCode = {1}", ex.[Function], ex.ErrorCode)
                Console.WriteLine("--Message:{0}", ex.Message)
            Catch ex As System.Exception
                Console.WriteLine("--Message:{0}", ex.Message)
            End Try
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
System..::..MarshalByRefObject
System.ComponentModel..::..Component
FVIL.DS..::..CFviGrabberUI

See Also