2012-02-03 2 views
4

opencv를 opencvsharp와 함께 사용하고 있습니다.matchtemplate와 (과) 일치하는 항목 찾기 opencv opencvsharp

matchtemplate을 수행 한 후 minmaxloc을 수행 할 때 첫 번째 일치 항목 만 얻습니다. 어떻게 모든 경기를합니까?

  Cv.MatchTemplate(tempImg, templateSymbol.Img, resImg, MatchTemplateMethod.CCorrNormed); 
      double min_val, max_val; 
      Cv.MinMaxLoc(resImg, out min_val, out max_val); 
      if (max_val > 0.5) 
      { 

       symbolsFound.Add(templateSymbol.Description); 
       Console.WriteLine(templateSymbol.Description); 
      } 

나는 첫 번째 경기를 찾고 더 많은 경기가 있다는 것을 알고 있습니다.

답변

0

다른 답변보기 here 나는 당신이 원하는 것을 정확하게하는 법을 보여줍니다. 이것은 C++로 작성되었지만 C#으로 이식하기는 쉽지 않습니다. std::queue을 사용하는 대신 .NET Queue을 사용하십시오.

기본적으로 resImg을 스캔하여 모든 비교 알고리즘의 최대 값 (또는 최소값)을 찾아 원하는 종류의 항목 (목록, 대기열, 우선 순위 대기열, 기타...). MinMaxLoc은 맨 위의 경기 만 반환하므로 한 경기 만 얻는 것입니다.

1
try 
     { 

      IplImage tpl = Cv.LoadImage("template path", LoadMode.Color); 
      IplImage img = Cv.LoadImage("main image path", LoadMode.Color); 

      IplImage res = Cv.CreateImage(Cv.Size(img.Width - tpl.Width + 1, img.Height - tpl.Height + 1), BitDepth.F32, 1); 
      Cv.MatchTemplate(img, tpl, res, MatchTemplateMethod.CCoeffNormed); 

      Cv.Threshold(res, res, 0.9, 255, ThresholdType.ToZero); 

      while (true) 
      { 
       CvPoint minloc, maxloc; 
       double minval, maxval, threshold = 0.95; 

       Cv.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc, null); 
       if (maxval > threshold) 
       { 
        Console.WriteLine("Matched " + maxloc.X + "," + maxloc.Y); 
        Cv.FloodFill(res, maxloc, new CvScalar()); 
       } 
       else 
       { 
        Console.WriteLine("No More Matches"); 
        break; 
       } 
      } 

      Cv.ReleaseImage(res); 
      Cv.ReleaseImage(img); 


     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     }