【halcon】テンプレートマッチングとアフィン変換まとめ

序文

        テンプレート マッチングとアフィン変換は併用されることが多く、その前の位置変換には通常 2 つの状況があります。

ケース1

        テンプレートは非常にポジティブな画像であり、テンプレートの位置を使用して曲がった画像をまっすぐにします。

ケース2 

テンプレートと写真が直立しているかどうかは関係ありません。テンプレートの位置を考えて、現在の写真の位置に合わせてください。

 より単純な 2 番目のケースから始めましょう。

まず、標準の元画像からテンプレートを取得します(画像からテンプレートを取得することと、テンプレート ファイルからテンプレートを取得することの微妙な違いについては後で説明します)。たとえば、次のような部分を元画像からテンプレートとして抽出します。 :

reduce_domain (Image, RegionErosion, ImageReduced)

テンプレートを作成する

その後、create_shape_model でテンプレートを作成できます。

*创建模板
create_shape_model (ImageReduced, 3, 0, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

観察テンプレート

次に、テンプレートがどのように見えるかを確認し、後でテンプレートを照合するときに関連パラメータを確認するのに役立ちます (この関数は無視することもできます)。

* 观察模板
inspect_shape_model (ImageReduced, ShapeModelImage, ShapeModelRegion, 4, 65)

テンプレートマッチング

次のステップは、 テンプレート マッチング用に新しい画像を取得すること です。2枚の写真はレンズパラメータが同じであるため座標系を共有している、これが前提となるので、次の理解を容易にするためにこの点に注意してください。

 * 模板匹配
find_shape_model (SearchImage, ModelID, 0, rad(360), 0.3, 1, 0.5, 
'least_squares', 0, 1, 
RowMatch, ColumnMatch, AngleMatch, Score)

ここでの SearchImage は新しい画像で、ModelID はテンプレート作成時の出力パラメーターであり、テンプレートに対応します。

ここでの アフィン変換 に密接に関連するパラメータは、RowMatch、ColumnMatch、AngleMatch です。それがXYと角度です。

find_shape_model は、ModelID を通じてテンプレートの関連情報を取得します。(テンプレートの形状など)

情報を取得した後、新しい画像内の一致の検索を開始し、一致したコンテンツの座標と回転角度を出力します。回転角度はテンプレート画像に対応するオフセット角度であり、座標はテンプレート画像の中心の座標です。画像内の一致するコンテンツ領域。

アフィン変換

*获取标准图的抠图中心
area_center(ImageReduced, Area, Row1, Column1)
*根据两个中心和角度,算出旋转矩阵
vector_angle_to_rigid (Row1, Column1, 0, RowMatch, ColumnMatch, AngleMatch, MovementOfModel)
*根据旋转中心做仿射变换
affine_trans_region(RegionOpening1, RegionAffineTrans, MovementOfModel, 
'nearest_neighbor')

テンプレート マッチングでは、新しい画像内の一致した位置 (XY) と、対応するテンプレート画像のオフセット角度がわかります。

では、 新しい画像内の一致するコンテンツに一致するように テンプレート自体 を移動するにはどうすればよいでしょうか?

ベクトル角度から剛体へ 

演算子が必要です: vector_angle_to_rigid 

このオペレータには、移動する図形の姿勢(xy と角度)と、移動対象点の姿勢(xy と角度)の 2 つの入力が必要であると考えられます。最後に、行列が出力されます。この行列は、グラフィックスのアフィン変換を完了できます。

元の画像内のテンプレート自体の座標は、演算子 area_center によって計算できます。(角度を知る必要がありますか? 答えはノーです。テンプレート マッチングによって与えられる角度は、一致したコンテンツとテンプレートの間の角度オフセットであるためです。したがって、テンプレートのデフォルトの角度は 0 です)。

したがって、次のようになります。

*根据两个中心和角度,算出旋转矩阵
vector_angle_to_rigid (Row1, Column1, 0, RowMatch, 
ColumnMatch, AngleMatch, MovementOfModel)

Row1、Column1、0:テンプレートの姿勢情報です。ここでの角度は 0 であることに注意してください。
RowMatch、ColumnMatch、AngleMatch: これは、テンプレート マッチングによって検出されたターゲット情報です。

注: 複数のターゲットを探している場合、これらの変数は配列を表します。

最後のパラメーター MovementOfModel は、出力 変換行列です。

アフィン_トランス_リージョン

最後に、この操作の移動は affine_trans_region を使用して実行できます。

*根据旋转中心做仿射变换
affine_trans_region(RegionOpening1, RegionAffineTrans, MovementOfModel, 
'nearest_neighbor')

動画であればaffine_trans_imageが使えます。

まっすぐな画像

矯正の考え方は、まずポジティブなテンプレートを取得することです。読み取られた画像に偏りがある可能性があります。ということで今回は動かないテンプレートと動く絵です。

* 图像摆正
area_center(SearchImage, Area, Row2, Column2)

vector_angle_to_rigid (RowMatch, ColumnMatch, AngleMatch, Row2, Column2, 0,  MovementOfModel)

affine_trans_image (SearchImage, ImageAffineTrans, MovementOfModel, 
'constant', 'false')

そこで今回は、オペレーターvector_angle_to_rigidにおいて、テンプレートマッチングで得られた座標を前(誰が動くか、誰が前に配置されるか)に配置し、画像座標を後ろに配置します。まっすぐにすることだけを考慮する場合、ここで役立つのは角度だけです。

グラフからテンプレートを取得することと、テンプレート ファイルからテンプレートを取得することの微妙な違い

画像からテンプレートを取得すれば、テンプレートの位置等の情報を直接取得することができる。

より一般的な使用法として、最初にテンプレートをファイルとして保存する方法もあります。つまり、まずテンプレートを作成します。

create_shape_model (ImageReduced, 2, 0, rad(360), 'auto', 'auto', 
'use_polarity', 'auto', 'auto', ModelID)
write_shape_model (ModelID, name +'.mb')

write_shape_model

テンプレートを作成したら、write_shape_model を通じて作成したテンプレートを保存します。

読み取り形状モデル 

テンプレート マッチングを使用する必要がある場合は、次の内容を読み上げてください。

* 读取模板
read_shape_model ('数字05.mb', ModelID)
* 产生的轮廓在原点
get_shape_model_contours (ModelContours, ModelID, 1)

get_shape_model_contours 

テンプレートを読み出して ModleID を取得すると、get_shape_model_contours で ModleID に基づいてテンプレートの輪郭を取得できます。

ただしこのときの輪郭の位置は絵の原点になります(そのため、保存したテンプレートファイルには位置情報は含まれません)

そのため、vector_angle_to_rigid を通じて行列を計算する場合、位置パラメーター XY には 0 を入れることができ、角度ももちろん 0 になります。

これはテンプレートによって生成されたアウトラインです。少し欠陥があることがわかりますが、それに対処する必要があります。

select_contours_xld (UnionContours, SelectedContours, 
'contour_length', 20, 20000, -0.5, 0.5)

上記の文は、短い等高線では次のことを行うべきではないことを意味します。

一部の等高線は互いに接続されていますが、全体ではないため、塗りつぶしには適していません (場合によっては等高線を塗りつぶす必要がある場合があります)。

Union_adjacent_contours_xld

Union_adjacent_contours_xld を使用すると、接続された等高線をオブジェクトに変換できます。

 gen_region_contour_xld 

gen_region_contour_xld 、等高線を塗りつぶします

* 填充
gen_region_contour_xld (SelectedContours, RegionXLD, 'filled')

ただし、この時点で塗りつぶすと問題が発生し、前述したように get_shape_model_contours で取得した輪郭の中心座標が絵の原点にあるため、一部の輪郭が絵の外側に出てしまい、輪郭が外側になってしまいます。部分を埋めることができません。したがって、一般に、輪郭を画像の内側の塗りつぶしに移動する必要があります。ただし、ここで注意しなければならないのは、アフィン変換を行う場合、開始座標は (0, 0) ではなく、移動した点でなければならないということです。

まとめ

        この記事では、テンプレート マッチングとアフィン変換に関連する内容を主に紹介しますが、テンプレート マッチングに関連するパラメータの多くは 1 つずつ説明しません。テンプレート マッチングとアフィン変換の関係の方が重要ですが、理解するのが難しいと思います。後で時間があるときに、テンプレート マッチングのオフ パラメーターも記録します。コメントエリアでの議論を歓迎します。

おすすめ

転載: blog.csdn.net/songhuangong123/article/details/129146123