본문 바로가기
프로그래밍/OpenCv

[C#] OpenCvSharp 이미지 템플릿 매칭

by 코딩연습생 2020. 1. 21.
반응형

안녕하세요

 

이번 시간 포스팅 내용은 제목과 똑같이 원본이미지에서 찾고자 하는 부분이미지를 매칭하여

 

원본이미지에 해당 부분을 검출해 내는 기능입니다

 

이미 인터넷상에 많은 정보가 있기에 별도 설명은 생략하고 바로 기능 구현으로 넘어가겠습니다

 

해당 포스팅도 저번 포스팅에 이어 진행됨에 따라 내용이 중간 생략 부분이 있을 수 있으니

 

이해가 잘되시면 이전 포스팅을 검색해 보시기 바랍니다

 

https://codingman.tistory.com/49

 

[C#]OpenCvSharp 라이브러리 사용하기 #1

안녕하세요 저번 포스팅에 C#으로 OpenCvSharp 라이브러리를 등록하여 구현하는 포스팅을 준비하던중에 OpenCv 3,4 버전에서 오류가 발생하는 문제가 있다는 얘길 듣고 부랴부랴 포스팅 내용을 검토해봤는데 역시..

codingman.tistory.com

 

템플릿 매칭을 하기 위해 두개의 이미지를 불러와야 하는데요

 

그러기 위한 디자인 UI 부터 보여드릴께요

 

[디자인]

- 메뉴에서 유틸리티 -> 템플릿매칭 버튼을 생성

 

- 해당 버튼에서 발생할 클릭 이벤트 활성화

 

- 이벤트 구문에 다음과 같이 소스 코딩 합니다

        private void 템플릿매칭ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (src == null) return;
            using (Match Sq = new Match())
            using (IplImage temp = Sq.Templit(src, src2))
            {
                result = temp.Clone();

            }

            using (CvWindow wind = new CvWindow("결과창"))
            {
                wind.Image = result;
                Cv.WaitKey(0);
            }
        }

 

- 템플릿 매칭 기능이 동작할 클래스를 하나 생성합니다

 

- 생성된 클래스에 다음과 같으 코딩합니다

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

namespace OpenCV_V1
{
    class Match : 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);
        }
    }
}

 

- 그림읽기를 통해 원본 이미지를 불러옵니다

 

- 그림읽기2를 통해 매칭 이미지를 불러옵니다

 

- 유틸리티 -> 템플릿매칭 버튼을 눌러 결과를 확인 합니다

 

[결과 창]

 

- 이렇게 매칭 이미지(쯔위)를 원본이미지에서 검출해 내는것을 확인 할 수 있습니다

 

- 프로그램을 구현하신뒤 다른 이미지로 테스트 해보시기 바랍니다

반응형

댓글