画像処理の実行 (リージョン指定)

Namespace: FVIL.Measure
Assembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)

Syntax

C#
public virtual void Execute(
	CFviRegion region,
	OriginMode origin_mode,
	FeatureType feature_type,
	double feature_param
)
Visual Basic
Public Overridable Sub Execute ( 
	region As CFviRegion,
	origin_mode As OriginMode,
	feature_type As FeatureType,
	feature_param As Double
)

Parameters

region
Type: FVIL.Data..::..CFviRegion
計測範囲を示すリージョン (リージョンの始点は origin_mode で指定された原点からの相対値を示します。)
origin_mode
Type: FVIL..::..OriginMode
原点モード [Image:画像の左上を原点とします。(処理ウィンドウは無視します。)、Window:処理ウィンドウの左上を原点とします。]
feature_type
Type: FVIL.Measure..::..FeatureType
リージョンの特徴量の種類。
計測幅(または高さ)を決定するための特徴量を示します。
  • Rect1: 外接矩形を基準に計測幅(または高さ)を決定します。
  • Rect2: 外接長方形を基準に計測幅(または高さ)を決定します。
  • Feret: フェレ径を基準に計測幅(または高さ)を決定します。
feature_param
Type: System..::..Double
特徴量固有のパラメータ。
  • Rect1 の場合、使用しません。指定された値は無視します。
  • Rect2 の場合、使用しません。指定された値は無視します。
  • Feret の場合、フェレ径を取得する際の角度として使用します。(単位:degree) [範囲:±180]

Remarks

計測範囲を画素単位で示すリージョンを用いて処理を実行します。

引数 feature_typefeature_param に記載する特徴量の意味については リージョン の説明をご参照ください。


FeatureType と Direction の関係:

下図は FeatureType の Rect1 と Rect2 の形状と投影方向を表わしたものです。

投影方向を Direction.X にした場合は、横方向 の濃度プロファイルを取得します。
投影方向を Direction.Y にした場合は、縦方向 の濃度プロファイルを取得します。

Rect1 は、傾きが無い外接矩形です。水平方向が "横"、垂直方向が "縦" とします。

Rect2 は、傾きが有る外接長方形です。辺が長い方を "横"、辺が短い方を "縦" とします。

Feret は、引数 feature_param に指定した角度によって異なります。指定した角度の方向を "横"、その垂直方向を "縦" とします。 0 度を指定すると Rect1 と等価です。但し、処理時間が異なることにご注意ください。

Rect1Rect2


処理効果:

リージョンを指定して濃度投影すると背景の濃度値の影響を受けずに対象物の濃度プロファイルを取得できます。
下図は、引数 feature_type に Rect2 を指定した場合の濃度プロファイルをグラフに表したものです。
図中の "pixel" と "density" はグラフの横軸/縦軸との対応を示します。
Rect2 の Direction.X:
【処理対象】【リージョン】


Rect2 の Direction.Y:
【処理対象】【リージョン】

処理に失敗した場合は例外を発行します。
例外の原因と発生位置を特定するには、発行された例外クラスの ErrorCode メンバと Function メンバを参照してください。

エラーコード:

ErrorCode メンバ内容
51FVIL.ErrorCode.LICENSE_ERROR ライセンスキーが見つからない為、実行できません。 または、FVIL._SetUp.InitVisionLibrary が実行されていません。
1FVIL.ErrorCode.FAILED_TO_ALLOCATEメモリ確保に失敗しました。
11FVIL.ErrorCode.INVALID_PARAMETERパラメータが不正です。
12FVIL.ErrorCode.INVALID_OBJECT画像またはリージョンオブジェクトが無効です。
81FVIL.ErrorCode.HAVE_NOT_IMAGE画像オブジェクトが設定されていません。
18FVIL.ErrorCode.INVALID_CHANNEL処理対象チャネル指標が不正です。
91FVIL.ErrorCode.INVALID_SRC_IMAGETYPE入力画像の画像種別が不正です。
97FVIL.ErrorCode.INVALID_SRC_CHANNEL入力画像のチャネル数が不正です。

Examples


処理時間:
    0.392 msec : FVIL.Blob.CFviBlob
    0.089 msec : FVIL.Blob.CFviBlobResult.GetBlobList
    0.037 msec : FVIL.Blob.CFviBlobList.SortList
    1.663 msec : FVIL.Measure.CFviProjection.Execute


ソースコード:
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode
{
    public partial class Measure
    {
        /// <summary>
        /// 濃度投影
        /// </summary>
        [FvPluginExecute]
        public void Projection2()
        {
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage(Defs.TestImageDir + "/key_UC8_M.png");
            FVIL.Data.CFviImage bin = new FVIL.Data.CFviImage(Defs.TestImageDir + "/key_BIN_M.png");
            FVIL.CFviTimeCounter watch = new FVIL.CFviTimeCounter();
            double msec = 0;
            Dictionary<string, double> times = new Dictionary<string, double>();

            #region 2値ブローブ解析.
            FVIL.Blob.CFviBlobResult result = new FVIL.Blob.CFviBlobResult();
            {
                watch.Start();
                FVIL.Blob.CFviBlob parser = new FVIL.Blob.CFviBlob(bin, result);
                FVIL.Blob.CFviBlobParam param = parser.Param;
                param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG;
                parser.Execute();
                msec = watch.Stop();
                times["FVIL.Blob.CFviBlob"] = msec;
            }
            #endregion

            #region 2値ブローブ解析結果のフィルタリングとソート.
            FHANDLE hresult = result.Handle;
            FVIL.Blob.CFviBlobData data = new FVIL.Blob.CFviBlobData(hresult, 0);
            FVIL.Blob.CFviBlobList bloblist;
            {
                {
                    watch.Start();
                    FVIL.Blob.CFviBlobFilterRange[] filters = new FVIL.Blob.CFviBlobFilterRange[]
                    {
                        new FVIL.Blob.CFviBlobFilterRange(FVIL.Blob.FeatureType.AREA, 100, int.MaxValue)
                    };
                    bloblist = result.GetBlobList(filters);
                    msec = watch.Stop();
                    times["FVIL.Blob.CFviBlobResult.GetBlobList"] = msec;
                }
                {
                    watch.Start();
                    bloblist.SortList(FVIL.Blob.FeatureType.RECT1AREA, FVIL.Blob.SortDirect.Descending);
                    msec = watch.Stop();
                    times["FVIL.Blob.CFviBlobList.SortList"] = msec;
                }
            }
            #endregion

            #region 画像統計量.
            {
                FVIL.Measure.CFviProjectionResult result_x = new FVIL.Measure.CFviProjectionResult();
                FVIL.Measure.CFviProjection parser = new FVIL.Measure.CFviProjection(src, 0, FVIL.Measure.Direction.X, result_x);

                // 計測.
                watch.Start();
                {
                    data.BlobNo = bloblist.Numbers[0];
                    FVIL.Data.CFviRegion region = data.GetRegion();
                    parser.Execute(region, FVIL.OriginMode.Image, FVIL.Measure.FeatureType.Rect2, 0.0);
                }
                msec = watch.Stop();
                times["FVIL.Measure.CFviProjection.Execute"] = msec;

                // 出力(X 方向)
                Console.WriteLine(
                    "{0,-5},{1,5},{2,9},{3,9},{4,9},{5,9},{6,9},{7,9}",
                    "No.", "Count", "Sum", "Mean", "Min", "Max", "Sigma", "Var");
                for (int i = 0; i < result_x.Count; i++)
                {
                    FVIL.Statistics stat = result_x[i];
                    Console.WriteLine(
                        "[{0:000}] {1,5:0},{2,9:0},{3,9:0.000},{4,9:0.000},{5,9:0.000},{6,9:0.000},{7,9:0.000}",
                        i, stat.Count, stat.Sum, stat.Mean, stat.Min, stat.Max, stat.Sigma, stat.Variance);
                }
            }
            #endregion

            Console.WriteLine("");
            foreach (KeyValuePair<string, double> item in times)
            {
                Console.WriteLine("{0,9:0.000} msec : {1}", item.Value, item.Key);
            }
        }
    }
}


Visual Basic Copy imageCopy
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Namespace SampleCode
    Partial Public Class Measure
        ''' <summary>
        ''' 濃度投影
        ''' </summary>
        <FvPluginExecute()> _
        Public Sub Projection2()
            Dim src As New FVIL.Data.CFviImage(Defs.TestImageDir + "/key_UC8_M.png")
            Dim bin As New FVIL.Data.CFviImage(Defs.TestImageDir + "/key_BIN_M.png")
            Dim watch As New FVIL.CFviTimeCounter()
            Dim msec As Double = 0
            Dim times As New Dictionary(Of String, Double)()

            '#Region "2値ブローブ解析."
            Dim result As New FVIL.Blob.CFviBlobResult()
            If True Then
                watch.Start()
                Dim parser As New FVIL.Blob.CFviBlob(bin, result)
                Dim param As FVIL.Blob.CFviBlobParam = parser.Param
                param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG
                parser.Execute()
                msec = watch.[Stop]()
                times("FVIL.Blob.CFviBlob") = msec
            End If
            '#End Region

            '#Region "2値ブローブ解析結果のフィルタリングとソート."
            Dim hresult As FHANDLE = result.Handle
            Dim data As New FVIL.Blob.CFviBlobData(hresult, 0)
            Dim bloblist As FVIL.Blob.CFviBlobList
            If True Then
                If True Then
                    watch.Start()
                    Dim filters As FVIL.Blob.CFviBlobFilterRange() = New FVIL.Blob.CFviBlobFilterRange() _
                     {New FVIL.Blob.CFviBlobFilterRange(FVIL.Blob.FeatureType.AREA, 100, Integer.MaxValue)}
                    bloblist = result.GetBlobList(filters)
                    msec = watch.[Stop]()
                    times("FVIL.Blob.CFviBlobResult.GetBlobList") = msec
                End If
                If True Then
                    watch.Start()
                    bloblist.SortList(FVIL.Blob.FeatureType.RECT1AREA, FVIL.Blob.SortDirect.Descending)
                    msec = watch.[Stop]()
                    times("FVIL.Blob.CFviBlobList.SortList") = msec
                End If
            End If
            '#End Region

            '#Region "画像統計量."
            If True Then
                Dim result_x As New FVIL.Measure.CFviProjectionResult()
                Dim parser As New FVIL.Measure.CFviProjection(src, 0, FVIL.Measure.Direction.X, result_x)

                ' 計測.
                watch.Start()
                If True Then
                    data.BlobNo = bloblist.Numbers(0)
                    Dim region As FVIL.Data.CFviRegion = data.GetRegion()
                    parser.Execute(region, FVIL.OriginMode.Image, FVIL.Measure.FeatureType.Rect2, 0.0)
                End If
                msec = watch.[Stop]()
                times("FVIL.Measure.CFviProjection.Execute") = msec

                ' 出力(X 方向)
                Console.WriteLine( _
                 "{0,-5},{1,5},{2,9},{3,9},{4,9},{5,9},{6,9},{7,9}", _
                 "No.", "Count", "Sum", "Mean", "Min", "Max", "Sigma", "Var")
                For i As Integer = 0 To result_x.Count - 1
                    Dim stat As FVIL.Statistics = result_x(i)
                    Console.WriteLine( _
                     "[{0:000}] {1,5:0},{2,9:0},{3,9:0.000},{4,9:0.000},{5,9:0.000},{6,9:0.000},{7,9:0.000}", _
                     i, stat.Count, stat.Sum, stat.Mean, stat.Min, stat.Max, stat.Sigma, stat.Variance)
                Next
            End If
            '#End Region

            Console.WriteLine("")
            For Each item As KeyValuePair(Of String, Double) In times
                Console.WriteLine("{0,9:0.000} msec : {1}", item.Value, item.Key)
            Next
        End Sub
    End Class
End Namespace

Exceptions

ExceptionCondition
FVIL..::..CFviExceptionこの例外の原因については、上記のエラーコード表をご参照ください。

See Also