PGH с использованием OpenCV (Emgu) - PullRequest
0 голосов
/ 09 февраля 2012

Может ли кто-нибудь поделиться своим кодом для вычисления сходства 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;
    }

1 Ответ

0 голосов
/ 07 марта 2012

Надеюсь, это кому-нибудь поможет, вот как я это выяснил, я использую расстояние Бхаттачарьи, следовательно, чем больше значение, тем меньше совпадение.Есть и другие метрики, но я нашел 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;
    }
...