DirectShow

Classes

ClassDescription
Public classCFviCameraControl
カメラ制御クラス
Public classCFviExceptionDS
DirectShow 関連 例外クラス
Public classCFviFilterInfo
フィルタ情報
Public classCFviFormatInfo
フォーマット形式
Public classCFviGrabber
DirectShow ビデオ入力クラス
Public classCFviGrabberParam
DirectShow ビデオ入力パラメータクラス
Public classCFviGrabberUI
DirectShow ビデオ入力コンポーネント
Public classCFviGraph
DirectShow フィルタグラフ
Public classCFviPinInfo
ピン情報
Public classCFviVideoProcAmp
ビデオ信号品質調整クラス
Public classFunction
DirectShow 関連関数群
Public classGrabberEventArgs
ビデオ入力イベント引数クラス
Public classSelectCameraForm
カメラ選択フォーム

Delegates

DelegateDescription
Public delegateGrabberEventHandler
ビデオ入力イベントデリゲート

Enumerations

EnumerationDescription
Public enumerationCameraControlProperty
カメラ制御プロパティを示す定数
Public enumerationFILTER_STATE
フィルタグラフの状態を示す定数
Public enumerationGrabberEventStatus
ビデオ入力イベント定数
Public enumerationHRESULT
エラーコード定数
Public enumerationPIN_DIRECTION
ピンの方向を示す定数
Public enumerationPropertyDialogType
プロパティダイアログ種別
Public enumerationVideoProcAmpProperty
ビデオ信号品質プロパティを示す定数

Remarks

このネームスペースには、Microsoft DirectShow を使用したカメラ取り込み機能を集約しています。
カメラは Microsoft DirectShow 対応のものを使用してください。 


トピック:


初めに:

FVIL.DS ネームスペースにあるカメラ取り込み機能は、弊社画像ライブラリを使用したアプリケーション作成手法の習得や画像処理方法の選択・簡易な評価といった、 あくまでも調査・準備段階での使用を前提としております。
したがって、カメラからの取り込み速度や画質については保証外とし、実際の業務にご利用になる場合には責任の範囲外とさせていただきます。

尚、弊社ユニット製品の FV2x10-XPe シリーズ では、本ライブラリは使用できません。 FV2x10-XPe シリーズの CFカードの容量に限りがある為、 カメラメーカーから提供されているドライバをインストールすることも出来ませんのでご了承ください。

[↑戻る]


カメラの接続:

カメラは Microsoft DirectShow 対応のものを使用してください。
下図は、安価な USB ウェブカメラを使った接続例です。 USB カメラは PC の USB ポートに接続するだけで画像の取り込みが可能です。

[↑戻る]


画像の取り込み:

以下は FVIL.DS で画像取り込みを行う場合の基本的な構成です。 カメラのパラメータはインスタンスに値を直接指定する他、 SelectCameraForm による対話的な設定や XML ファイルからの読み込みも可能です。
XML ファイルの内容はカメラによって異なります。 本ライブラリに付属のサンプルアプリケーション(WILsampleCSUSBCameraSample)を使用して 実際にカメラに接続した後、メニューから『XML ファイル保存』を実行すると手軽に生成できます。

[↑戻る]


カメラの制御:

接続しているカメラの制御はデバイスのプロパティページ(下図)から行えます。 ユーザのプログラムからこれらのプロパティを変更するには、 ビデオ信号品質調整クラス(CFviVideoProcAmp)や カメラ制御クラス(CFviCameraControl)を使用してください。 前者は下図の 1 に相当し、後者は下図の 2 に相当します。
1) 画像の調整2) カメラ制御

このプロパティページは、カメラ選択フォームのデバイスのプロパティボタン(下図)から呼び出せます。 ユーザのプログラムから呼び出すには、 OpenPropertyDialog(Control, String, PropertyDialogType) を使用してください。

[↑戻る]


サンプルコード:

1フレーム分の画像を取り込み、その画像をファイルに保存するサンプルコードです。

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

[↑戻る]


DirectShow 用語:

フィルタ DirectShow では、データに対して何らかの処理を行うコンポーネントをフィルタと呼びます。 カメラからの画像を取り込む処理もフィルタの1種として扱われます。
なお、データをファイルやカメラから取得するような機能を提供するフィルタを DirectShow ではソースフィルタと呼びます。 複数のカメラを接続している場合、ソースフィルタは複数存在することになり、それらには自動的にインデックスが付けられます。 カメラを指定する際には、デバイス名のほか、このインデックスを使用することもできます。

(参考) SelectCameraForm
ピン DirectShow では他のフィルタと接続して1つの処理を実現しますが、その際のフィルタ同士の接続に使われるインタフェースをピンと呼びます。データを入力される側のインタフェースを入力ピン、出力する側のインタフェースを出力ピンと呼びます。
1つのフィルタが同じ方向の複数のピンを持つこともあります。
(例)"静止画像"出力ピンと"キャプチャ"出力ピンの2つを持つソースフィルタ.

(参考) SelectCameraForm
フィルタグラフ DirectShow ではファイルやカメラから取り込んだデータが、接続された複数のフィルタを経由することで処理されます。その特定のタスクを行うために接続されたフィルタの集合をフィルタグラフと呼びます。
DirectShow で何らかの処理をする為にはまず、このフィルタグラフに必要なフィルタを追加して一連の処理を完成させる必要があります。そして、フィルタグラフの開始・停止で、このまとめられた一連の処理の実行を開始、または停止できます。

FVIL.DS ではカメラからの画像取り込み機能を備えたフィルタグラフとしてCFviGrabber を用意しています。

[↑戻る]