본문 바로가기

자료

[C#/VB.NET] [ OpenCv ] 이미지 서치 MatchTemplate

728x90

[C#/VB.NET] [ OpenCv ] 이미지 서치 MatchTemplate


   private void button3_Click(object sender, EventArgs e)
        {
            // 원본 이미지
            using (Mat mat = new Mat(@"img\cat.jpg"))

            // 찾을 이미지 (고양이 얼굴)
            using (Mat temp = new Mat(@"img\searchTarget.png"))
            using (Mat result = new Mat())
            {

                // 이미지 템플릿 매치
                Cv2.MatchTemplate(mat, temp, result, TemplateMatchModes.CCoeffNormed);

                // 이미지의 최대/ 최소 위치 겟
                OpenCvSharp.Point minloc, maxloc;
                double minval, maxval;
                Cv2.MinMaxLoc(result, out minval, out maxval, out minloc, out maxloc);

                // 타겟 이미지랑 유사 정도 1에 가까울 수록 같음
                var threshold = 0.7;
                if (maxval >= threshold)
                {
                    // 서치된 부분을 빨간 테두리로
                    Rect rect = new Rect(maxloc.X, maxloc.Y, temp.Width, temp.Height);
                    Cv2.Rectangle(mat, rect, new OpenCvSharp.Scalar(0, 0, 255), 2);

                    // 표시
                    Cv2.ImShow("template1_show", mat);

                }
                else
                {
                    // 낫 매칭
                    MessageBox.Show("못찾았슴돠.");
                }

            }
        }

 

6. 여러 이미지 찾기 팁

        private void button4_Click(object sender, EventArgs e)
        {
            // 원본 이미지
            using (Mat mat = new Mat(@"img\multiCat.png"))

            // 찾을 이미지 (고양이 얼굴)
            using (Mat temp = new Mat(@"img\searchTarget.png"))
            using (Mat result = new Mat())
            {
                // 템플릿 매칭
                Cv2.MatchTemplate(mat, temp, result, TemplateMatchModes.CCoeffNormed);

                // 매칭 범위 지정
                Cv2.Threshold(result, result, 0.8, 1.0, ThresholdTypes.Tozero);

                while (true)
                {
                    // 이미지 매칭 범위
                    OpenCvSharp.Point minloc, maxloc;
                    double minval, maxval;
                    Cv2.MinMaxLoc(result, out minval, out maxval, out minloc, out maxloc);

                    var threshold = 0.8;
                    if (maxval >= threshold)
                    {
                        // 검색된 부분 빨간 테두리
                        Rect rect = new Rect(maxloc.X, maxloc.Y, temp.Width, temp.Height);
                        Cv2.Rectangle(mat, rect, new OpenCvSharp.Scalar(0, 0, 255), 2);

                        // 
                        Rect outRect;
                        Cv2.FloodFill(result, maxloc, new OpenCvSharp.Scalar(0), out outRect, new OpenCvSharp.Scalar(0.1), new OpenCvSharp.Scalar(1.0), FloodFillFlags.Link4);

                    }
                    else
                    {
                        break;
                    }
                }
                
                Cv2.ImShow("template2_show", mat);
            }
        }
728x90