C# OpenCV 강좌 : 제 52강 - 템플릿 매칭

   

템플릿 매칭 (Template Matching)


1


2

영상이나 이미지에서 템플릿과 일치하는 오브젝트를 검출하는 함수입니다.


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.


영상 사용하기 : 3강 바로가기
이미지 사용하기 : 4강 바로가기


Main Code


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace test
{
    class OpenCV : IDisposable
    {
        IplImage match;
        
        public IplImage Templit(IplImage src, IplImage temp)
        {
            match = src;
            IplImage templit = temp;
            IplImage tm = new IplImage(new CvSize(match.Size.Width - templit.Size.Width + 1, match.Size.Height - templit.Size.Height + 1), BitDepth.F32, 1);

            CvPoint minloc, maxloc;
            Double minval, maxval;

            Cv.MatchTemplate(match, templit, tm, MatchTemplateMethod.SqDiffNormed);

            Cv.MinMaxLoc(tm, out minval, out maxval, out minloc, out maxloc);

            Cv.DrawRect(match, new CvRect(minloc.X, minloc.Y, templit.Width, templit.Height), CvColor.Red, 3);

            return match;
        }
                  
        public void Dispose()
        {
            if (match != null) Cv.ReleaseImage(match);
        }
    }
}


Class Code


match = src;
IplImage templit = temp;
IplImage tm = new IplImage(new CvSize(match.Size.Width - templit.Size.Width + 1, match.Size.Height - templit.Size.Height + 1), BitDepth.F32, 1);

매칭 이미지인 match와 템플릿 이미지인 templit을 생성합니다.

tm비교 결과로 사용합니다. 이미지 크기는 항상 W-w+1 x H-h+1로 고정적으로 사용됩니다.


  • Tip : (W, H) = match 이미지의 너비와 높이, (w, h) = templit 이미지의 너비와 높이


CvPoint minloc, maxloc;
Double minval, maxval;

minloc은 검출된 위치의 최소 지점을 의미합니다.

maxloc은 검출된 위치의 최대 지점을 의미합니다.

minval은 검출된 위치의 최소 포인터를 의미합니다.

maxval은 검출된 위치의 최대 포인터를 의미합니다.


Cv.MatchTemplate(match, templit, tm, MatchTemplateMethod.SqDiffNormed);

Cv.MatchTemplate()을 이용하여 템플릿 매칭을 실행합니다. Cv.MatchTemplate(매칭 이미지,템플릿 이미지 , 비교 결과 이미지, 연산방법)을 의미합니다.

  • MatchTemplateMethod.* : 연산방법입니다. R결과, T템플릿, I매칭 이미지를 의미합니다.
    • MatchTemplateMethod.SqDiff 3

    • MatchTemplateMethod.SqDiffNormed 4

    • MatchTemplateMethod.CCorr 5

    • MatchTemplateMethod.CCorrNormed 6

    • MatchTemplateMethod.CCoeff 7

    • MatchTemplateMethod.CCoeffNormed 8


9


Cv.MinMaxLoc(tm, out minval, out maxval, out minloc, out maxloc);

Cv.MinMaxLoc()를 이용하여 비교 결과이미지에서 지점포인터를 검출합니다. Cv.MinMaxLoc(최소 지점, 최대 지점, 최소 포인터, 최대 포인터)를 의미합니다.


  • Tip : out 키워드를 포함해야합니다.


Cv.DrawRect(match, new CvRect(minloc.X, minloc.Y, templit.Width, templit.Height), CvColor.Red, 3);

match 이미지에 최소 지점에서 템플릿 이미지 크기로 설정하여 템플릿 매칭 결과를 표시합니다.

Result


10



도움이 되셨다면 광고 클릭 부탁드립니다.

⤧  Next post C# OpenCV 강좌 : 제 53강 - 키 이벤트 ⤧  Previous post C# OpenCV 강좌 : 제 51강 - 피부색 검출