カメラ制御クラス

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

Syntax

C#
public class CFviCameraControl
Visual Basic
Public Class CFviCameraControl

Remarks

このクラスは、 Graph に設定されたフィルタグラフが持つソースフィルタから、 Property に指定されたプロパティの設定と取得を行います。
詳しくは、DirectShow の IAMCameraControl インターフェースの説明をご参照ください。 現在は、下記のページに記載されています。
http://msdn.microsoft.com/ja-jp/library/cc354791.aspx (2010年12 現在)

Graph に設定されたフィルタグラフが IAMCameraControl インターフェースを実装するソースフィルタを保有している必要があります。 無効な場合は、各プロパティの設定や取得を行う際に例外(NullReferencedException)が発行されます。
事前に有効性を確認するには IsSupported(CFviGraph) をご使用ください。 このメソッドは IAMCameraControl インターフェースを実装するか否かを検査します。 個別のプロパティ(Property に指定された種別)が サポートされているか否かは検査しません。


初期値と範囲:
プロパティ初期値範囲説明
GraphnullIAMCameraControl インターフェースを実装するソースフィルタを持つグラフ プロパティの設定または取得対象のフィルタグラフを示します。 通常は、CFviGrabber を指定してください。
PropertyPanCameraControlProperty に定義された定数 設定または取得するプロパティの種別を示します。 カメラによってサポートされていない種別もあります。 カメラ固有の仕様についてはカメラメーカーにお問い合わせください。

プロパティの設定と取得:

以下のプロパティ及びメソッドは、 Graph に設定されたフィルタグラフが持つソースフィルタから、 Property に指定されたプロパティの設定と取得を行います。 Graph が無効な場合や IAMCameraControl インターフェースに対応していない場合は例外(NullReferencedException)が発生します。


プロパティの範囲と既定値の取得:

以下のプロパティ及びメソッドは、 Graph に設定されたフィルタグラフが持つソースフィルタから、 Property に指定されたプロパティの範囲と既定値の取得を行います。 Graph が無効な場合や IAMCameraControl インターフェースに対応していない場合は例外(NullReferencedException)が発生します。

Examples

ソースコード:
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
    {
        /// <summary>
        /// カメラ制御クラス.
        /// </summary>
        [FvPluginExecute]
        public void CameraControl()
        {
            try
            {
                // 1) インスタンスの生成.
                FVIL.DS.CFviGrabber controller = new FVIL.DS.CFviGrabber();

                // 2) グラフの生成.
                //    この例では 0 番目のカメラに接続していますが、接続方法は任意です.
                controller.Create(0, 0);

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

                // 4) カメラ制御.
                if (!FVIL.DS.CFviCameraControl.IsSupported(controller))
                    Console.WriteLine("このフィルタグラフは IAMCameraControl インターフェースをサポートしていません。");
                else
                {
                    // ここでは、露光時間と焦点距離を変更する例を示します.

                    FVIL.DS.CFviCameraControl cc = new CFviCameraControl(controller);

                    // 露光時間.
                    try
                    {
                        cc.Property = CameraControlProperty.Exposure;

                        Console.WriteLine("{0}", cc.Property.ToString());
                        Console.WriteLine("Min     : {0}", cc.Min);
                        Console.WriteLine("Max     : {0}", cc.Max);
                        Console.WriteLine("Step    : {0}", cc.Step);
                        Console.WriteLine("Default : {0}", cc.Default);
                        Console.WriteLine("Value   : {0}", cc.Value);
                        Console.WriteLine("IsManual: {0}", cc.IsManual);

                        cc.IsManual = true;
                        cc.Value = -1;    // -1=1/2sec
                    }
                    catch (System.Exception)
                    {
                        Console.WriteLine("露光時間: サポートされていません。");
                    }

                    // 焦点距離.
                    try
                    {
                        cc.Property = CameraControlProperty.Focus;

                        Console.WriteLine("{0}", cc.Property.ToString());
                        Console.WriteLine("Min     : {0}", cc.Min);
                        Console.WriteLine("Max     : {0}", cc.Max);
                        Console.WriteLine("Step    : {0}", cc.Step);
                        Console.WriteLine("Default : {0}", cc.Default);
                        Console.WriteLine("Value   : {0}", cc.Value);
                        Console.WriteLine("IsManual: {0}", cc.IsManual);

                        cc.IsManual = true;
                        cc.Value = 20;    // 20mm
                    }
                    catch (System.Exception)
                    {
                        Console.WriteLine("焦点距離: サポートされていません。");
                    }
                }

                // 5) 入力の開始.
                controller.Run();

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

                // 7) 入力の停止.
                controller.Stop();

                // E) 画像の保存
                FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/DS.Grabber_OpenDialog.bmp", 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
        ''' <summary>
        ''' カメラ制御クラス.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub CameraControl()
            Try
                ' 1) インスタンスの生成.
                Dim controller As New FVIL.DS.CFviGrabber()

                ' 2) グラフの生成.
                '    この例では 0 番目のカメラに接続していますが、接続方法は任意です.
                controller.Create(0, 0)

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

                ' 4) カメラ制御.
                If Not FVIL.DS.CFviCameraControl.IsSupported(controller) Then
                    Console.WriteLine("このフィルタグラフは IAMCameraControl インターフェースをサポートしていません。")
                Else
                    ' ここでは、露光時間と焦点距離を変更する例を示します.

                    Dim cc As FVIL.DS.CFviCameraControl = New CFviCameraControl(controller)

                    ' 露光時間.
                    Try
                        cc.[Property] = CameraControlProperty.Exposure

                        Console.WriteLine("{0}", cc.[Property].ToString())
                        Console.WriteLine("Min     : {0}", cc.Min)
                        Console.WriteLine("Max     : {0}", cc.Max)
                        Console.WriteLine("Step    : {0}", cc.[Step])
                        Console.WriteLine("Default : {0}", cc.[Default])
                        Console.WriteLine("Value   : {0}", cc.Value)
                        Console.WriteLine("IsManual: {0}", cc.IsManual)

                        cc.IsManual = True
                            ' -1=1/2sec
                        cc.Value = -1
                    Catch generatedExceptionName As System.Exception
                        Console.WriteLine("露光時間: サポートされていません。")
                    End Try

                    ' 焦点距離.
                    Try
                        cc.[Property] = CameraControlProperty.Focus

                        Console.WriteLine("{0}", cc.[Property].ToString())
                        Console.WriteLine("Min     : {0}", cc.Min)
                        Console.WriteLine("Max     : {0}", cc.Max)
                        Console.WriteLine("Step    : {0}", cc.[Step])
                        Console.WriteLine("Default : {0}", cc.[Default])
                        Console.WriteLine("Value   : {0}", cc.Value)
                        Console.WriteLine("IsManual: {0}", cc.IsManual)

                        cc.IsManual = True
                            ' 20mm
                        cc.Value = 20
                    Catch generatedExceptionName As System.Exception
                        Console.WriteLine("焦点距離: サポートされていません。")
                    End Try
                End If

                ' 5) 入力の開始.
                controller.Run()

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

                ' 7) 入力の停止.
                controller.[Stop]()

                ' E) 画像の保存
                FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/DS.Grabber_OpenDialog.bmp", 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
FVIL.DS..::..CFviCameraControl

See Also