2値ブローブ解析クラス

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

Syntax

C#
[SerializableAttribute]
public class CFviBlob : CFviImageParser
Visual Basic
<SerializableAttribute>
Public Class CFviBlob
	Inherits CFviImageParser

Remarks

2値画像データの特徴量を計測するクラスです。
全般的な内容については、ネームスペースの説明 をご参照ください。


要求する入出力画像数:
項目定数
入力画像1SrcImageCount フィールド
出力画像0DstImageCount フィールド

処理対象画像の条件:

処理対象の画像は下記の条件を満たしている必要が有ります。

  • 処理範囲の幅と高さが共に 65535 以下である事 -
  • 画像種別が FVIL.ImageType.BIN である事 -
  • チャネル数が 1 である事 -

初期値と範囲:
プロパティ初期値範囲内容
Offset0,0画像座標(±値) 解析結果の基準座標値を指定します。
既定では画像の左上(OriginMode で指定された位置)を 0,0 とします。
OriginModeFVIL.OriginMode.ImageOriginMode に定義された定数 解析結果が基準とする位置を指定します。
既定では画像の左上を基準(Offset に指定された値)とします。
ContinueOptionFVIL.Blob.ContinueOption.NoneContinueOption に定義された定数 継続処理を行うか否かを指定します。
既定では false に設定されています。 true を指定すると前回の解析結果に追加します。
ParamCFviBlobParam の初期値※インスタンスの差し替えはできません。 2値ブローブ解析パラメータです。
ResultCFviBlobResult の初期値CFviBlobResult のインスタンス 2値ブローブ解析結果を格納するインスタンスです。
このクラスは多くのメモリを確保しますので、利用後は Dispose することを推奨します。 本体(CFviBlob)を Dispose しても Result に設定されたインスタンスは解放されないことにご注意ください。

Examples

下記は、最も基本的な処理例を示します。
前景を白/背景を黒で解析し、 各ブローブの番号・重心・慣性等価楕円をオーバレイ表示します。


処理結果:


ソースコード:
C# Copy imageCopy
//    $Revision: 1.4 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;    // FvPluginXXXX attribute requires fvalgcli

namespace User.SampleCode
{
    public partial class Blob
    {
        /// <summary>
        /// 両解析.
        /// </summary>
        [FvPluginExecute]
        public void Measure1()
        {
            // 1) インスタンスの準備.
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage(Defs.TestImageDir + "/blob_BIN.png");
            FVIL.Blob.CFviBlobResult result = new FVIL.Blob.CFviBlobResult();
            FVIL.Blob.CFviBlob parser = new FVIL.Blob.CFviBlob(src, result);

            // 2) 処理対象画像の有効性検査.
            if (FVIL.ErrorCode._SUCCESS != FVIL.Blob.CFviBlob.CheckValidity(src))
                return;

            try
            {
                // 3) パラメータ設定.
                FVIL.Blob.CFviBlobParam param = parser.Param;
                param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG_BlackBG;    // 前景:白/背景:黒.
                param.MaxBlobs = 0;    // 0:上限なし.
                param.MaxRows = 0;    // 0:上限なし.
                param.MaxRuns = 0;    // 0:上限なし.
                param.Neighborhood = FVIL.Blob.Neighborhood.Eight;    // 8近傍.
                param.PrecalcFeatures = 0;

                // 4) 画像処理実行.
                parser.Execute();

                // E) 確認用.
                Measure1_SaveImage(parser);
            }
            finally
            {
                src.Dispose();
                result.Dispose();
                parser.Dispose();
            }
        }

        /// <summary>
        /// 確認用
        /// </summary>
        private void Measure1_SaveImage(FVIL.Blob.CFviBlob parser)
        {
            FVIL.Data.CFviImage src = parser.SrcImages[0];

            // 画像表示の準備.
            FVIL.GDI.CFviDisplay display = new FVIL.GDI.CFviDisplay();
            display.Image = src;
            display.DisplayRect = src.Window;

            // オーバレイの生成.
            FVIL.GDI.CFviOverlay pOverlay0 = new FVIL.GDI.CFviOverlay();
            pOverlay0.Scaling = true;
            display.Overlays.Add(pOverlay0);

            // 有効ブローブの取得.
            FVIL.Blob.CFviBlobList list = parser.Result.GetBlobList();
            FVIL.Blob.CFviBlobData data = new FVIL.Blob.CFviBlobData();

            foreach (object item in list)
            {
                data.CopyFrom(item);

                // 特徴量の取得.
                FVIL.Data.CFviPoint center = data.Center;        // 重心.
                FVIL.Data.CFviEllipse ellipse = data.EquivalentEllipse;    // 慣性等価楕円.
                System.String strBlobNo = System.String.Format("{0}", data.BlobNo);    // ブローブ番号.

                // 描画用: 重心.
                FVIL.GDI.CFviGdiPoint _center = new FVIL.GDI.CFviGdiPoint(center);
                _center.Size = new Size(5, 3);
                _center.Angle = ellipse.Angle;
                _center.Pen.Color = Color.FromArgb(0xFF, 0x00, 0x00);

                // 描画用: 慣性等価楕円.
                FVIL.GDI.CFviGdiEllipse _ellipse = new FVIL.GDI.CFviGdiEllipse(ellipse);
                _ellipse.Pen.Color = Color.FromArgb(0x00, 0x00, 0xFF);

                // 描画用: ブローブ番号.
                FVIL.GDI.CFviGdiString _blobno = new FVIL.GDI.CFviGdiString();
                _blobno.Text = strBlobNo;
                _blobno.Position = center;
                _blobno.Align = FVIL.GDI.TextAlign.Left | FVIL.GDI.TextAlign.Top;
                _blobno.BkMode = FVIL.GDI.BkMode.Transparent;
                _blobno.Color = Color.FromArgb(0x3F, 0x3F, 0xFF);

                // 追加.
                pOverlay0.Figures.Add(_center);
                pOverlay0.Figures.Add(_ellipse);
                pOverlay0.Figures.Add(_blobno);
            }

            // 保存.
            using (FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage())
            {
                display.SaveImage(canvas, display.DisplayRect, 1.0);
                canvas.Save(Defs.ResultDir + "/Blob.Measure1.png");
            }
        }
    };
}


Visual Basic Copy imageCopy
'    $Revision: 1.2 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli
' FvPluginXXXX attribute requires fvalgcli
Namespace SampleCode
    Public Partial Class Blob
        ''' <summary>
        ''' 両解析.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub Measure1()
            ' 1) インスタンスの準備.
            Dim src As New FVIL.Data.CFviImage(Defs.TestImageDir & "\blob_BIN.png")
            Dim result As New FVIL.Blob.CFviBlobResult()
            Dim parser As New FVIL.Blob.CFviBlob(src, result)

            ' 2) 処理対象画像の有効性検査.
            If FVIL.ErrorCode._SUCCESS <> FVIL.Blob.CFviBlob.CheckValidity(src) Then
                Return
            End If

            Try
                ' 3) パラメータ設定.
                Dim param As FVIL.Blob.CFviBlobParam = parser.Param
                param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG_BlackBG
                ' 前景:白/背景:黒.
                param.MaxBlobs = 0
                ' 0:上限なし.
                param.MaxRows = 0
                ' 0:上限なし.
                param.MaxRuns = 0
                ' 0:上限なし.
                param.Neighborhood = FVIL.Blob.Neighborhood.Eight
                ' 8近傍.
                param.PrecalcFeatures = 0

                ' 4) 画像処理実行.
                parser.Execute()

                ' E) 確認用.
                Measure1_SaveImage(parser)
            Finally
                src.Dispose()
                result.Dispose()
                parser.Dispose()
            End Try
        End Sub

        ''' <summary>
        ''' 確認用
        ''' </summary>
        Private Sub Measure1_SaveImage(parser As FVIL.Blob.CFviBlob)
            Dim src As FVIL.Data.CFviImage = parser.SrcImages(0)

            ' 画像表示の準備.
            Dim display As New FVIL.GDI.CFviDisplay()
            display.Image = src
            display.DisplayRect = src.Window

            ' オーバレイの生成.
            Dim pOverlay0 As New FVIL.GDI.CFviOverlay()
            pOverlay0.Scaling = True
            display.Overlays.Add(pOverlay0)

            ' 有効ブローブの取得.
            Dim list As FVIL.Blob.CFviBlobList = parser.Result.GetBlobList()
            Dim data As New FVIL.Blob.CFviBlobData()

            For Each item As Object In list
                data.CopyFrom(item)

                ' 特徴量の取得.
                Dim center As FVIL.Data.CFviPoint = data.Center
                ' 重心.
                Dim ellipse As FVIL.Data.CFviEllipse = data.EquivalentEllipse
                ' 慣性等価楕円.
                Dim strBlobNo As System.String = System.[String].Format("{0}", data.BlobNo)
                ' ブローブ番号.
                ' 描画用: 重心.
                Dim _center As New FVIL.GDI.CFviGdiPoint(center)
                _center.Size = New Size(5, 3)
                _center.Angle = ellipse.Angle
                _center.Pen.Color = Color.FromArgb(&Hff, &H0, &H0)

                ' 描画用: 慣性等価楕円.
                Dim _ellipse As New FVIL.GDI.CFviGdiEllipse(ellipse)
                _ellipse.Pen.Color = Color.FromArgb(&H0, &H0, &Hff)

                ' 描画用: ブローブ番号.
                Dim _blobno As New FVIL.GDI.CFviGdiString()
                _blobno.Text = strBlobNo
                _blobno.Position = center
                _blobno.Align = FVIL.GDI.TextAlign.Left Or FVIL.GDI.TextAlign.Top
                _blobno.BkMode = FVIL.GDI.BkMode.Transparent
                _blobno.Color = Color.FromArgb(&H3f, &H3f, &Hff)

                ' 追加.
                pOverlay0.Figures.Add(_center)
                pOverlay0.Figures.Add(_ellipse)
                pOverlay0.Figures.Add(_blobno)
            Next

            ' 保存.
            Using canvas As New FVIL.Data.CFviImage()
                display.SaveImage(canvas, display.DisplayRect, 1.0)
                canvas.Save(Defs.ResultDir & "/Blob.Measure1.png")
            End Using
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.Blob..::..CFviBlob

See Also