2値ブローブ解析結果クラス

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

Syntax

C#
[SerializableAttribute]
public class CFviBlobResult : CFviDataObject, 
	IEnumerable<CFviBlobData>, IXmlSerializable
Visual Basic
<SerializableAttribute>
Public Class CFviBlobResult
	Inherits CFviDataObject
	Implements IEnumerable(Of CFviBlobData), IXmlSerializable

Remarks

2値ブローブ解析の実行結果を保有するクラスです。
全般的な内容については、ネームスペースの説明 をご参照ください。

このクラスは、ブローブデータ(CFviBlobData)を複数保有します。 単一のブローブデータを取得するには、GetData(UInt32) を使用してください。 現在保有しているブローブデータの数を得るには Count を使用してください。 初期状態では、ブローブ解析結果ハンドルは無効となっており、ブローブデータの保有数は 0 です。


トピック:


ブローブ解析結果ハンドル:

2値ブローブ解析(CFviBlob)の実行結果はヒープ領域に格納されます。 このクラス(CFviBlobResult)とデータ構造クラス(CFviBlobData)は、 このヒープ領域の場所を指し示すハンドルを内部的に保有しています。 ユーザは、このクラス(CFviBlobResult)とデータ構造クラス(CFviBlobData)を介して、 解析結果が格納されたヒープ領域をアクセスする事になります。

このハンドルは、2値ブローブ解析(CFviBlob)が実行されてから、 このクラス(CFviBlobResult)を解放するまで有効です。 このクラスを解放した後、データ構造クラス(CFviBlobData)からアクセスする事はできません。

[↑戻る]


背景ブローブ:

本ブローブ解析は、解析対象領域の外側にはブローブ番号0番の背景色ブローブが広がっていると定義しています。(下図参照)

この領域の外側と連結する背景色ブローブを「背景ブローブ」と呼び、特殊な扱いをします。 背景ブローブはブローブ番号が必ず0番になります。 背景ブローブが1画素も存在していない時でも、0番ブローブは背景を指す番号として存在し、 この場合は0番はヌル領域を指し示します。 また 親子関係 において、0番ブローブは必ずツリーの最上位になります。

但し、解析対象色の設定(ColorMode)で、前景色のみを解析するよう設定した場合は、 0番ブローブは存在するものの、常にヌル領域となります。 下図は解析対象色に前景=白・背景=黒を指定した時の例です。 この時、青で示した領域は、解析領域の外側の0番ブローブと連結していると見なせる為、0番ブローブとなります。

[↑戻る]


親子関係:

親子関係とは、ブローブの幾何的な位置関係を木構造にて表したものです。 あるブローブAがあった時に、このブローブAの穴ブローブをブローブAの子供と呼びます。 逆に、この穴ブローブから見たブローブAを親と呼びます。 また、同じ階層にあるブローブ同士は兄弟と呼びます。

上図において、1,2,3 はそれぞれ兄弟ブローブです。 また、1,2,3 の親は 0 であり、0 の子供は 1,2,3 となります。 全てのブローブにはブローブ番号が割り振られており、この番号によるリンクによって親子関係の木構造が取得できます。 但し、全てのリンクは1対1の関係で表されるため、親から子への関係など1対多の関係を取得する際には リンクを辿って行くことになります。各リンクの取得には、以下の関数を使用します。

親ブローブの取得GetParentData(UInt32)
子ブローブの取得GetChildData(UInt32)
兄弟ブローブ数の取得GetSiblingNum(UInt32)
次の兄弟ブローブの取得GetNextSiblingData(UInt32)
前の兄弟ブローブの取得GetBackSiblingData(UInt32)

上図のブローブ例でのリンクを表したのが下図です。

GetChildData(UInt32) で取得される子供リンクは1番目の子供となります。 全ての子供を取得するには、1番目の子供を取得した後、その子供の兄弟を GetNextSiblingData(UInt32) 又は GetBackSiblingData(UInt32) にて辿っていく事で取得できます。 また、兄弟リンクは双方向循環リストになっており、リンクを辿っていくと自分に戻ってきます。 尚、兄弟の順番 及び 親からリンクされる子供(=兄弟の先頭)には特別の意味は無く、処理の都合によって決定されるものです。

また、全てのブローブは背景の子供か又はその子孫になるため、親子関係の木構造のルートは必ず0番ブローブになります。 0番が背景以外のブローブに割り当てられる事はないため、0番から順に親子関係の木構造を辿っていけば全てのブローブを参照できます。 前述の背景の説明でも述べたとおり、背景が1画素も存在していない場合や、解析対象色の設定(ColorMode) で前景のみを解析対象とするよう設定した場合でも、0番ブローブは存在するため、この事は成り立ちます。 但し、全てのブローブは0番の子供となります。

[↑戻る]


有効/無効ブローブ:

継続処理オプションの設定(ContinueOption)で継続実行が指定された状態で 解析を行った場合は、無効ブローブが現れます。 無効ブローブとは、元々有効ブローブとして存在していたブローブが、継続実行で追加された部分によって 他のブローブに連結するなどして無くなってしまったブローブの事を言います。

ブローブの有効/無効を調べるには IsValid()()()() を使用してください。 無効ブローブは親子関係の木構造から切り離されるため GetParentData(UInt32) などのリンク取得関数でリンクを取得することは出来ません。 また、特徴量も取得することは出来ず、取得しようとした場合は例外が発行されます。

[↑戻る]


リージョンの取得:

解析後のブローブに対して後処理を行いたい場合は、そのブローブのリージョンを取得して処理を行います。
例えば、ブローブの塗り潰しを行いたい場合は、解析結果から取得したリージョンオブジェクトを塗り潰して、 それを画像に描画します。下記に処理手順を記載します。

1) 解析実行
2値ブローブ解析を実行します。



2) リージョン取得
2値ブローブ解析結果からリージョンオブジェクトを取得します。 リージョンオブジェクトは CFviBlobResult
GetRegion(UInt32) で取得できます。



3) リージョン塗り潰しと画像への変換
上記で取得したリージョンの Fill()()()() メソッドを使用して、 リージョンの塗り潰しを行います。(塗り潰されるのはリージョンの穴です) 次に Draw(CFviImage, Double) メソッドに画像を渡して描画します。



この時点では、リージョンを画像に変換しただけなので、2値ブローブ解析結果には反映されていません。 反映するには、上図 ※1 の画像で再度、2値ブローブ解析を実行する必要があります。

[↑戻る]


フィルタ/ソート:

CFviBlobResult のインスタンスが保有するブローブデータをフィルタやソートを行って取得する方法があります。 下表の関数1は CFviBlobData のコレクションを取得する方法です。 関数2は ブローブ番号配列を取得する方法です。 前者は CFviBlobData のインスタンス生成の時間が大幅に掛る為、あまり推奨されません。 新しい開発では、後者の方法で取得することを推奨します。


表1) CFviBlobData のコレクションを取得する方法
項目関数1関数2(推奨)
ブローブの特徴量に基づくフィルタリングGetList()()()()GetList()()()()
ブローブの特徴量に基づくソーティングGetSortList()()()()GetSortList()()()()
ブローブの位置情報に基づくソーティングGetSpecialSortList()()()()GetSpecialSortList(FHANDLE, SortOrder, CFviAngle, UINT_ARRAY)

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL.Data..::..CFviDataObject
FVIL.Blob..::..CFviBlobResult

See Also