Аппроксимация контура повернутыми прямоугольниками

После некоторого определения цвета и бинарного порога я использую следующий код, чтобы найти контуры и нарисовать их на изображении:

 using (MemStorage stor = new MemStorage())
        {
           Contour<Point> contours = img.FindContours(
              Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
              Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST,
              stor);

           for (; contours != null; contours = contours.HNext)
           {
              Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * poly, stor);

              img.Draw(currentContour,new Bgr(255,255,255),1);

              Rectangle currentrect = currentContour.BoundingRectangle;

              img.Draw(currentrect,new Bgr(255,255,255),2);
            }
        }

Моя проблема, как я и ожидал, заключается в том, что если контур представляет собой прямоугольник, но повернут на изображении, ограничивающий прямоугольник не меняет свою ориентацию, чтобы соответствовать вращению. Это другой способ выполнить эту функцию? Любая помощь будет принята с благодарностью.


person salgarcia    schedule 09.02.2013    source источник


Ответы (2)


Да, есть еще один способ добиться этого. Вы можете использовать

contour.GetConvexHull(ORIENTATION.CV_CLOCKWISE);

используя Моменты, вы можете легко получить ориентацию и соответствующим образом настроить прямоугольник.

person Oliver    schedule 15.02.2013

Метод, который вы ищете, это:

PointCollection.MinAreaRect(points);

Рабочий пример здесь: http://www.emgu.com/wiki/index.php/Minimum_Area_Rectangle_in_CSharp

Полная документация (в которой немного больше, чем указано выше) находится здесь: http://www.emgu.com/wiki/files/2.4.0/document/html/0d5fd148-0afb-fdbf-e995-6dace8c8848d.htm

person John    schedule 21.10.2014