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_type と feature_param に記載する特徴量の意味については リージョン の説明をご参照ください。
FeatureType と Direction の関係:
下図は FeatureType の Rect1 と Rect2 の形状と投影方向を表わしたものです。
投影方向を Direction.X にした場合は、横方向 の濃度プロファイルを取得します。
投影方向を Direction.Y にした場合は、縦方向 の濃度プロファイルを取得します。
Rect1 は、傾きが無い外接矩形です。水平方向が "横"、垂直方向が "縦" とします。
Rect2 は、傾きが有る外接長方形です。辺が長い方を "横"、辺が短い方を "縦" とします。
Feret は、引数 feature_param に指定した角度によって異なります。指定した角度の方向を "横"、その垂直方向を "縦" とします。
0 度を指定すると Rect1 と等価です。但し、処理時間が異なることにご注意ください。
Rect1 | Rect2 |
処理効果:
リージョンを指定して濃度投影すると背景の濃度値の影響を受けずに対象物の濃度プロファイルを取得できます。
下図は、引数 feature_type に Rect2 を指定した場合の濃度プロファイルをグラフに表したものです。
図中の "pixel" と "density" はグラフの横軸/縦軸との対応を示します。
Rect2 の Direction.X:
【処理対象】 | 【リージョン】 |
Rect2 の Direction.Y:
【処理対象】 | 【リージョン】 |
処理に失敗した場合は例外を発行します。
例外の原因と発生位置を特定するには、発行された例外クラスの ErrorCode メンバと Function メンバを参照してください。
エラーコード:
値 | ErrorCode メンバ | 内容 |
---|---|---|
51 | FVIL.ErrorCode.LICENSE_ERROR | ライセンスキーが見つからない為、実行できません。 または、FVIL._SetUp.InitVisionLibrary が実行されていません。 |
1 | FVIL.ErrorCode.FAILED_TO_ALLOCATE | メモリ確保に失敗しました。 |
11 | FVIL.ErrorCode.INVALID_PARAMETER | パラメータが不正です。 |
12 | FVIL.ErrorCode.INVALID_OBJECT | 画像またはリージョンオブジェクトが無効です。 |
81 | FVIL.ErrorCode.HAVE_NOT_IMAGE | 画像オブジェクトが設定されていません。 |
18 | FVIL.ErrorCode.INVALID_CHANNEL | 処理対象チャネル指標が不正です。 |
91 | FVIL.ErrorCode.INVALID_SRC_IMAGETYPE | 入力画像の画像種別が不正です。 |
97 | FVIL.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 |
---|---|
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 |
---|---|
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
Exception | Condition |
---|---|
FVIL..::..CFviException | この例外の原因については、上記のエラーコード表をご参照ください。 |