OpenCVSharp4でテンプレートマッチング

テンプレートマッチングとは

入力した画像から、テンプレートと似ている場所を抽出する方法。

方法

Cv2.MatchTemplate(src, templ, result, TemplateMatchModes)  

を使う。
TemplateMatchModesには以下の種類がある

TemplateMatchModes 和訳 説明
CCoeff 共分散 値が大きいほど類似
CCoeffNormed 相関係数 結果は-1 以上1以下。1で全く同じ画像
CCorr 相互相関(スライディング内積 値が大きいほど類似
CCorrNormed 正規化相互相関 結果は-1 以上1以下。1で全く同じ画像
SqDiff 誤差2乗和 値は0以上。0で全く同じ画像
SqDiffNormed 正規化誤差2乗和 値は0以上1以下。0で全く同じ画像

マッチング後にCv2.Normalize()で正規化するのもアリ

詳細な式はこちら

プログラム

OpenCVSharp4の導入はコチラ

using OpenCvSharp;  

namespace テンプレートマッチング {  
    class Program {  
        static void Main(string[] args) {  
            //ソース画像とテンプレートの読込  
            Mat src = new Mat(@"D:\20190321145626.png");  
            Mat templ = new Mat(@"D:\templ.png");  


            //テンプレートマッチング  
            Mat result = new Mat();  
            Cv2.MatchTemplate(src, templ, result, TemplateMatchModes.CCoeffNormed);  
            Cv2.ImShow("result", result);  

            //結果の描画  
            Mat dst = src.Clone();  
            for(int i =0; i<result.Cols;i++)  
                for(int j = 0; j < result.Rows; j++) {  

                    float thresh = (float)0.7;  

                    if(result.At<float>(j,i) >= thresh) {  
                        dst.Rectangle(new Point(i, j), new Point(i + templ.Cols, j + templ.Rows), Scalar.Red);  
                    }  
                }  


            Cv2.ImShow("dst", dst);  
            Cv2.WaitKey();  

        }  
    }  
}  

結果

入力画像

f:id:negizoku:20200920231626p:plain



テンプレート

f:id:negizoku:20200920231638p:plain



相関係数

f:id:negizoku:20200920231651p:plain



矩形描画

f:id:negizoku:20200920231704p:plain



参考

https://docs.opencv.org/4.0.0/de/da9/tutorial_template_matching.html
https://docs.opencv.org/4.0.0/df/dfb/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d
https://en.wikipedia.org/wiki/Cross-correlation