こんにちは、ゆたんぽです。
今回は、FindShapeModel関数について説明します。
HALCONのFindShapeModelは、テンプレート画像と比較対象の画像からテンプレート画像の位置を検出するアルゴリズムです。
ここでは、C#でHALCONのFindShapeModelを使って、簡単なサンプルを作成して説明します。
CreateShapeModel関数でモデル作成
FindShapeModel関数を利用するためには事前に見つけに行くモデルを作成する必要があります。
そのモデルを作成するのがCreateShapeModel関数です。
CreateShapeModelは、テンプレート画像とモデルのパラメータを生成し、システム内で検索に使用するためのシェイプモデルを作成するために使用されます。
以下は、C#でCreateShapeModelを使用する簡単な例です。
// 画像を読み込みます。
HImage image = new HImage("object_image.jpg");
// パラメータを設定します。
int numLevels = 4;
double angleStart = new HTuple(0).TupleRad();
double angleExtent = new HTuple(360).TupleRad();
double angleStep = new HTuple(360).TupleRad();
string optimization = "none";
string metric = "use_polarity";
double contrast = 30;
int minContrast = 5;
//始点(100,100)、終点(200,200)の短形領域作成
HRegion modelRegion = new HRegion(100, 100, 200,200);
// 入力画像から短形領域の絞り込み
HImage modelImage = image.ReduceDomain(modelRegion);
// テンプレートのモデルを作成する
HOperatorSet.CreateShapeModel(modelImage, numLevels, angleStrat,angleExtent,angleStep,
optimization,metric,contrast,minContrast, out hv_ModelID);
CreateShapeModel(Image, NumLvels,AngelStart,AngelEetent, AngelStep, Optimization,Metric,Contrast, MinContrast, out hv_ModelID);
CreateShapeModelは、以下のパラメータを入力として受け取ります:
- Image:オブジェクトを表す画像。これは、元の画像またはROI画像である必要があります。
- NumLevels:探索ピラミッドのレベル数を指定します。探索ピラミッドは、異なる解像度で画像を作成し、対象物のスケーリングや回転に対してロバストな検出を可能にします。
- AngleStart, AngleExtent:オブジェクトの角度範囲を設定します。通常、AngleStart=0、AngleExtent=360とします。
- AngleStep:AngleStep は選択された回転角度での刻みを指定します。”auto”で指定するとよいでしょう。
- Optimization:最適化の種類とモデルを生成するために使用される任意の手法を指定します。Optimization が ‘auto’ に設定されると、 create_shape_model が自動的にモデルの点数の減少を決定します。
- Metric:Metric はモデルが画像内で認識される条件を指定します。HALCONは、”use_polarity”、”ignore_color_polarity”、”ignore_gray_scale”、”use_gray_polarity”の4つのオプションを提供しています。
- Contrast:対象物と背景のコントラストを指定します。
- MinContrast:対象物を検出するために必要な最小コントラストを指定します。
- hv_ModelID:モデルのハンドル
詳細は以下の公式サイトをご確認ください。英語がわからなければGoogleの翻訳にURLを入れると日本語訳してくれます。
FindShapeModel関数でモデル位置検出
HALCONのFindShapeModelは、事前に作成したモデルと一致するオブジェクトを画像から検出するための強力な関数です。
ここでは、FindShapeModelの使い方を詳しく解説します。
// 画像からモデルを検出する
HObject inputImage;
HOperatorSet.ReadImage(out inputImage, "image.bmp");
// FindShapeModelのパラメータの設定
HTuple angleStart = new HTuple(-0.39);
HTuple angleExtent = new HTuple(0.78);
HTuple minScore = new HTuple(0.5);
HTuple numMatches = new HTuple(1);
// FindShapeModelの実行
HTuple modelRow, modelCol, modelAngle, modelScale, modelScore;
hv_ModelID.FindShapeModel(InputImage, angleStart, angleExtent, minScore, numMatches, 0.5,
"least_squares", 0, 0.9, out modelRow, out modelCol, out modelAngle,out modelScore);
// 検出結果の表示
Console.WriteLine("Num of matches: " + modelRow.Length);
for (int i = 0; i < modelRow.Length; i++)
{
Console.WriteLine("Match " + i);
Console.WriteLine("Row: " + modelRow[i].D.ToString("F2") + ", Col: " + modelCol[i].D.ToString("F2"));
Console.WriteLine("Angle: " + modelAngle[i].D.ToString("F2"));
Console.WriteLine("Score: " + modelScore[i].D.ToString("F2"));
}
ObjectModel.find_shape_model(Image , AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness , out Row, out Column, out Angle, out Score)
FindShapeModelは、以下のパラメータを入力として受け取ります:
- ObjectModel:形状モデルを定義するオブジェクトです。形状モデルは、create_shape_model 関数を使用して作成されます。
- Image:検出する対象の画像です。
- AngleStart および AngleExtent:回転を考慮する場合に使用されます。これらのパラメータは、検索範囲を指定します。たとえば、AngleStart=0、AngleExtent=360と指定すると、全ての角度で検索を行います。
- MinScore:検出されるモデルの信頼度を設定するためのパラメータです。このパラメータが高いほど、モデルの検出が厳しくなります。一方、低い場合は、モデルの検出が容易になります。
- NumMatches:一度に検出するモデルの数を設定するためのパラメータです。このパラメータを設定することで、検出速度を調整できます。
- MaxOverlap:検出されるモデル同士の重複度合いを設定するためのパラメータです。このパラメータが低い場合は、重複した検出が排除されます。
- SubPixel:サブピクセル精度で位置を決定するためのパラメータです。このパラメータを true に設定すると、検出位置がより正確になります。
- NumLevels:NumLevels は検索で使用するピラミッドレベル数を決定します。
- Greedness:パラメーター Greednessはどれだけ検索を入念に実行するかを決定します。Greedness=0 に 0 を指定すると安全な検索手法が適用されます。ただし実行時間が長くなります。Greedness=1 を指定すると不安定な検索手法が適用され、まれに画像中にモデルが存在しても検出できない場合があります。
出力される結果
- Row, Column and Angle:モデル検出結果の行と列方向の位置、回転、スケールはRow、Column、Angleに返されます。座標RowとColumnは検索画像内の形状モデルの基準点です。
- Score:検索された各インスタンスのスコアが Scoreに返されます。このスコアは 0 から 1 までの値で出力され、モデルが画像中にどの程度現れているかを判断するおおよその基準になります。例えば、モデルの半分が隠れている場合、スコアは 0.5 以下となります。
詳細は以下の公式サイトをご確認ください。英語がわからなければGoogleの翻訳にURLを入れると日本語訳してくれます。
上記のように設定することで任意のモデル位置を測定することができるようになります。
パラメータが多いので覚えるのは大変ですが、最初はCreateShapeModelのパラメータを参考に試していき、慣れてきたら少しずついじってみるのが以下と思います。
まとめ
FindShapeModelは適切なパラメータを設定することで、より正確な形状モデルの検出を実現できます。
部品の位置を検出する際に一番最初に使うのがこの関数だと思いますので、試しに使ってみてください。