- 基本原理:
テンプレート画像をコンボリューションカーネルとして使用し、サンプル画像を左から右、上から下にスキャンして相関係数を計算し、テンプレートに類似したオブジェクトを見つけます。
- マッチング方法
1. 二乗差分マッチング法 (TM_SQDIFF) T がテンプレート画像、I がマッチング画像で、マッチング画像の (x, y) 位置で、x' が右方向、y' が下方向に認識領域となり、
相関関係が完全に一致している場合、
計算値は 0 となり、一致値が大きいほど相関関係は低くなります。
2. 正規化二乗差分識別法(TM_SQDIFF_NORMED)
二乗差分計算は計算結果が0~1になるように正規化されており、
画像が完全に一致する場合は計算結果が0、完全に一致しない場合は計算結果が1となります。
3. 相関照合方法(TM_CCORR)
テンプレートとマッチング画像を掛け合わせる計算結果が大きいほどマッチング結果が良くなりますが、
この方法では画像全体の明るさの変化により計算結果も変化します。各ピクセルのグレー値が増加し、計算結果が大きくなります。
4. 正規化相関マッチング法 (TM_CCORR_NORMED)
5. 相関係数マッチング法 (TM_CCOEFF)
このメソッドは、相関マッチングを実行する前に、テンプレートと認識領域の行列を前処理します。行列から行列の平均を減算することで、このメソッドが引き起こす影響を解決します。テンプレート画像と認識画像の明るさの違いによる。計算結果のロジックから、計算結果が大きいほどマッチング結果が良いことがわかります。
6.正規化相関係数マッチング法(TM_CCOEFF_NORMED)
この手法は相関係数のマッチング手法を正規化したもので、計算結果は
完全一致の場合は-1~1、完全不一致の場合は-1となります。
- API
public static void MatchTemplate(InputArray image, InputArray templ, OutputArray result, TemplateMatchModes method, InputArray? mask = null);
image: 認識画像
templ: テンプレート画像
result: テンプレート照合結果
Method: 照合方法
Mask: 照合テンプレートマスク、通常はデフォルト値を使用
- デモ
Mat templatePic = Cv2.ImRead(@"C:\Users\Aron\Desktop\01\A.jpg");
Mat testPic = Cv2.ImRead(@"C:\Users\Aron\Desktop\01\B.jpg");
Mat matchResul = new Mat();
//归一化相关系数匹配法
Cv2.MatchTemplate(testPic, templatePic, matchResul, TemplateMatchModes.CCoeffNormed);
//最大最小匹配对象的位置
Point minLoc = new Point(0, 0);
Point maxLoc = new Point(0, 0);
//最大最小配置值
double minVal;
double maxVal;
//查找最大最小值的位置及匹配的值
Cv2.MinMaxLoc(matchResul, out minVal, out maxVal, out minLoc, out maxLoc);
//框选出识别对象
//归一化相关系数匹配方法取最大值
Scalar scalar = new Scalar(0, 0, 255);
Cv2.Rectangle(testPic,maxLoc, new Point(maxLoc.X+templatePic.Cols,maxLoc.Y+templatePic.Rows), scalar, 7);
//显示相关性计算结果
Cv2.PutText(testPic, Math.Round(maxVal,4).ToString(), new Point(maxLoc.X, maxLoc.Y -50), HersheyFonts.HersheyDuplex, 2, scalar, 8);
picBox_Display.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(templatePic);
picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(testPic);
追記:
この場合、.NET で使用される OpenCV ライブラリはOpenCvSharp4です。