tantay 0 Жалоба Опубликовано March 19, 2015 Здравствуйте! Для моей задачи нужно найти контур объекта по некоторым условиям, это я сделал: 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; } Далее необходимо найти координаты этого контура, вырезать/скопировать в новую матрицу изображения, ну и дальше уже работать непосредственно с ней. Какие для это есть методы, функции? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано March 19, 2015 Здравствуйте! Для моей задачи нужно найти контур объекта по некоторым условиям, это я сделал: 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) // вырезка этого прямоугольника в новое изображение Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tantay 0 Жалоба Опубликовано March 20, 2015 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); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах