2012-02-09 74 views
0

任何人都可以分享他們的代碼來計算PGH(Pairwise Geometric Histogram)相似度嗎?我需要從圖像列表中找到最相似的對象。使用OpenCV(Emgu)的PGH

我寫了下面的代碼,但結果沒有意義。我敢打賭,我正在做一個愚蠢的錯誤,而我被卡住了。

有什麼建議嗎?

public double GetBestPGHMatch(Contour<Point> currContour, List<Contour<Point>> ContoursList) 
    { 
     double match = -1.0d; 
     DenseHistogram histCurrContour = new DenseHistogram(
                 new int[2] 
                   { 
                    currContour.Total, 
                    currContour.Total, 
                   }, 
                 new RangeF[2] 
                   { 
                    new RangeF(0, 100), 
                    new RangeF(0, 100) 
                   } 
                ); 

     CvInvoke.cvCalcPGH(currContour.Ptr, histCurrContour.Ptr); 
     foreach (Contour<Point> contour in ContoursList) 
     { 
      DenseHistogram hist = new DenseHistogram(
               new int[2] 
                   { 
                    currContour.Total, 
                    currContour.Total, 
                   }, 
               new RangeF[2] 
                   { 
                    new RangeF(0, 100), 
                    new RangeF(0, 100) 
                   } 
             ); 

      CvInvoke.cvCalcPGH(contour.Ptr, hist.Ptr); 
      double c = CvInvoke.cvCompareHist(histCurrContour.Ptr, hist.Ptr, Emgu.CV.CvEnum.HISTOGRAM_COMP_METHOD.CV_COMP_CORREL); 
      if (c > match) match = c; 
     } 

     return match; 
    } 

回答

0

希望這可以幫助別人,這是我如何工作出來,我使用的巴塔查里亞距離,因此,值越大,下了比賽。還有其他的指標,但我發現B距離最適合我的需求。

public double pghMatchShape(Contour<Point> shape1, Contour<Point> shape2) 
    { 
     DenseHistogram hist1 = new DenseHistogram(
      new int[2] { 8, 8 }, 
      new RangeF[2] { new RangeF(-180, 180), new RangeF(100, 100) }); 
     DenseHistogram hist2 = new DenseHistogram(
      new int[2] { 8, 8 }, 
      new RangeF[2] { new RangeF(-180, 180), new RangeF(100, 100) }); 
     CvInvoke.cvCalcPGH(shape1, hist1.Ptr); 
     CvInvoke.cvCalcPGH(shape2, hist2.Ptr); 
     CvInvoke.cvNormalizeHist(hist1.Ptr, 100.0); 
     CvInvoke.cvNormalizeHist(hist2.Ptr, 100.0); 
     double corr = CvInvoke.cvCompareHist(hist1, hist2, HISTOGRAM_COMP_METHOD.CV_COMP_BHATTACHARYYA); 

     return corr; 
    }