Перейти к содержимому
Compvision.ru
tantay

C# - EmguCV - координаты контура

Recommended Posts

Здравствуйте! Для моей задачи нужно найти контур объекта по некоторым условиям, это я сделал: 

using (MemStorage storage = new MemStorage()) // выделить память для контура 
            {
                Contour<Point> contours = grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, storage);
                for (Contour<Point> contour = contours; contours != null; contours = contours.HNext)
                {
                    
                    //Для сглаживания и получения более аккуратных контуров можно воспользоваться функцией 
                    Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.005, storage);
                    double ratio = currentContour.BoundingRectangle.Width / currentContour.BoundingRectangle.Height;
                    //if(ratio > 10 & ratio <15)
                    if (ratio > 3 & ratio < 6)
                    {
                        if (currentContour.BoundingRectangle.Width > sizeDown & currentContour.BoundingRectangle.Width < sizeUp)
                        {
                            //Цвет внешних контуров, Цвет внутренних контуров,Максимальный уровень для отображаемых контуров, 
                            //Толщина контура, Тип линии (смотрите описание в функции cvLine),Сдвигает все координаты точек на указанное значение. Полезно в случае, если, если контуры, найденные в некотором изображении ROI должны быть приняты во внимание для предоставления в изображении.
                            CvInvoke.cvDrawContours(colorImage, contours, new MCvScalar(255), new MCvScalar(105), -2, 1, Emgu.CV.CvEnum.LINE_TYPE.FOUR_CONNECTED, new Point(0, 0));
                            colorImage.Draw(currentContour.BoundingRectangle, new Bgr(0, 255, 0), 2);
                        }
 
                    }
                } bgrImage = colorImage;
            } 

 

Далее необходимо найти координаты этого контура, вырезать/скопировать в новую матрицу изображения, ну и дальше уже работать непосредственно с ней. Какие для это есть методы, функции?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте! Для моей задачи нужно найти контур объекта по некоторым условиям, это я сделал: 

using (MemStorage storage = new MemStorage()) // выделить память для контура 
            {
                Contour<Point> contours = grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, storage);
                for (Contour<Point> contour = contours; contours != null; contours = contours.HNext)
                {
                    
                    //Для сглаживания и получения более аккуратных контуров можно воспользоваться функцией 
                    Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.005, storage);
                    double ratio = currentContour.BoundingRectangle.Width / currentContour.BoundingRectangle.Height;
                    //if(ratio > 10 & ratio <15)
                    if (ratio > 3 & ratio < 6)
                    {
                        if (currentContour.BoundingRectangle.Width > sizeDown & currentContour.BoundingRectangle.Width < sizeUp)
                        {
                            //Цвет внешних контуров, Цвет внутренних контуров,Максимальный уровень для отображаемых контуров, 
                            //Толщина контура, Тип линии (смотрите описание в функции cvLine),Сдвигает все координаты точек на указанное значение. Полезно в случае, если, если контуры, найденные в некотором изображении ROI должны быть приняты во внимание для предоставления в изображении.
                            CvInvoke.cvDrawContours(colorImage, contours, new MCvScalar(255), new MCvScalar(105), -2, 1, Emgu.CV.CvEnum.LINE_TYPE.FOUR_CONNECTED, new Point(0, 0));
                            colorImage.Draw(currentContour.BoundingRectangle, new Bgr(0, 255, 0), 2);
                        }
 
                    }
                } bgrImage = colorImage;
            } 

 

Далее необходимо найти координаты этого контура, вырезать/скопировать в новую матрицу изображения, ну и дальше уже работать непосредственно с ней. Какие для это есть методы, функции?

 var box = contours.GetMinAreaRect(); //прямоугольник минимальный в который вписан контур

var cutImage= image.GetSubImage(box) // вырезка этого прямоугольника в новое изображение 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 var box = contours.GetMinAreaRect(); //прямоугольник минимальный в который вписан контур

var cutImage= image.GetSubImage(box) // вырезка этого прямоугольника в новое изображение 

 

мое решение такое:

int x = currentContour.MCvContour.rect.X;
int y = currentContour.MCvContour.rect.Y;
int width = currentContour.MCvContour.rect.Width;                                
int height = currentContour.MCvContour.rect.Height;                                
Rectangle rect = new Rectangle(x, y, width, height);                                
CvInvoke.cvSetImageROI(colorImage, rect);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×