2012-02-03 18 views
4

opencvをopencvsharpで使用しています。matchtemplateとのすべての一致を見つけるopencv opencvsharp

マッチテンプレートを実行した後に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つしかないのはこのためです。

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); 
     } 
関連する問題