이번장에서는 탬플릿 매칭을 opencvsharp을 이용해 진행하도록 하겠다.
자신의 플랫폼에 맞게 opencvsharp라이브러리를 nuget패키지에서 찾아서 추가하고
우선 간단하게 탬플릿 매칭에 대해 설명하면,(template matching)
입력영상에서 탬플릿 영상과 일치하는 부분을 찾는 기법으로서
영상 좌측 상단에서부터 우측 하단까지 모든 부분과 비교해서 스캔
위처럼 탬플릿 이미지가 있을때 input 이미지에서 찾아서 검색하는데 단점으로는 회전 및 스케일링 된 물체의 매칭은 잘 안된다.
영상의 밝기 등에 덜 민감하게 정규화 과정이 필요하다.
탬플릿 매칭에는 6가지의 방법이 있는데
1. CV_TM_SQDIFF
픽셀의 제곱차를 이용하는 제곱차 매칭으로 탬플릿 T 를 탐색영역 I에서 이동시켜가며, 제곱의 합계를 계산에서 매칭되는 위치에서 작은값을 찾는다, 일치하면 0 이고 일치하지 않으면 값이 증가한다.
2. CV_TM_SQDIFF_NORMED
픽셀의 제곱차 매칭 방법에서 정규화 계수를 나눈 것으로 입력영상과 탬플릿 영상 사이의 조명의 차이가 있을때,
그 영향을 크게 줄여줘서 매우 유용하다.
3. CV_TM_CCORR
상관관계 방법으로 탬플릿과 입력 영상의 곱을 제곱해서 모두 더해서 매칭 되는 위치에서 큰값을 가지므로, 일치할수록 매우 큰값이 리턴되고, 일치하지않으면 0까지 매우 작은 값이 리턴된다.
4. CV_TM_CCORR_NORMED
상관관계 방법에서 정규화 계수를 나눈것이다.
5. CV_TM_CCOEFF
역시 상관관계 방법으로 입력 영상 각각의 평균을 고려한 매칭을 수행해서 일치하면 1을 리턴하고, 불일치하면 -1, 두 영상사이 전혀 연관성이 없으면 0을 리턴한다. 보통 정확한 검출결과를 가지고 싶을때 사용하나 매우 느리다.
6. CV_TM_CCOEFF_NORMED
상관관계 방법에서 정규화 계수를 나눈것으로 리턴값은 CCOEFF방법과 동일하다.
영상에 따라서 맞는 방법을 사용하는데, 보통 CV_TM_CCOEFF_NORMED 을 많이들 사용하긴 한다.
이제 실제 사용예를 들어보자
c# wpf에 버튼과 image를 삽입하고
버튼눌렀을때, 찾을 이미지를 로드하고,
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Image files (*.png;*.bmp;*.jpg)|*.png;*.bmp;*.jpg|All files (*.*)|*.*";
if (ofd.ShowDialog() == true)
{
// string IMAGE_FILE = ofd.FileName;
orin=Cv2.ImRead(ofd.FileName);
ImageView.Source=WriteableBitmapConverter.ToWriteableBitmap(orin);
}
검색 버튼을 누르면 탬플릿 이미지를 찾아서 로드한뒤 찾는다.
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Image files (*.png;*.bmp;*.jpg)|*.png;*.bmp;*.jpg|All files (*.*)|*.*";
if (ofd.ShowDialog() == true)
{
// string IMAGE_FILE = ofd.FileName;
match = Cv2.ImRead(ofd.FileName);
using (Mat res = orin.MatchTemplate(match, TemplateMatchModes.CCoeffNormed))
{
double minval, maxval = 0;
//찾은 이미지의 위치를 담을 포인트형을 선업합니다.
OpenCvSharp.Point minloc, maxloc;
//찾은 이미지의 유사도 및 위치 값을 받습니다.
Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
// MessageBox.Show("찾은 이미지의 유사도 : " + maxval);
OpenCvSharp.Rect rect = new OpenCvSharp.Rect(maxloc.X, maxloc.Y, match.Width, match.Height);
Cv2.Rectangle(orin, rect, new OpenCvSharp.Scalar(0, 0, 255), 2);
ImageView.Source = WriteableBitmapConverter.ToWriteableBitmap(orin);
}
}
코드는 위처럼 매우 간단하게 구현되지만
실제로 이 탬플릿 매칭을 이미지 분석에서 잘 안사용하는데,
그 이유가 전체영상에서 다 찾아서 속도가 매우 느리며, 회전이나 스케일링된 영상에 매우 취약해서
잘안쓰게 된다. 단 간단하게 특정마케를 사용할때는 사용한다. 코드가 매우 간결하므로,
오히려 앞장에서 쓴 geometric 모델 파인더를 가장많이 사용하게 된다.
'C# 윈도우 프로그래밍' 카테고리의 다른 글
Geometric model finder C#(2) (0) | 2022.12.17 |
---|---|
Geometric model finder C#(1) (0) | 2022.12.17 |
AI 딥러닝 objectdetection YOLO c# 프로그래밍 (0) | 2022.12.11 |
opencvsharp 실시간 마우스 처리 opencv c# (0) | 2022.12.11 |
opencvsharp 영상처리 프로그래밍(1) c# opencv (0) | 2022.12.11 |