Jump to content
Compvision.ru

barsukov

Пользователи
  • Content count

    21
  • Joined

  • Last visited

Community Reputation

0 Новичек

About barsukov

  • Rank
    Бывалый

Recent Profile Visitors

575 profile views
  1. Ребят, появился такой вопрос. В детекторе границ Канни используется гауссовая маска и сигма. Можно ли каким нибудь образом в EmguCV задавать эти параметры в методе .Canny() или другими способами? И если нельзя, есть ли какое нибудь объяснение какие значения использует Emgu по умолчанию? upd. А вот, по умолчанию маска = 3. но сигму видимо никак нельзя задавать
  2. После выделения символов занялся распознаванием, нашел достаточно готовых алгоритмов, но очень уж хочется попробовать для начала простую ИНС. Нашёл эту статью, в ней довольно хорошо расписана простенькая сеть Хопфилда, но столкнулся с ошибкой(картинка)(outOfRangeException) на этапе преобразования картинки в вектор значений "1 и -1". Vector заполняется до 1074 элемента, всего он рассчитан на 1075, не пойму где он выходит за границы, подскажите, пожалуйста. public int[] ConvertToVector(Bitmap Image) { int[] Vector = new int[Image.Width * Image.Height]; for (int i = 0; i < Image.Height; i++) { for (int j = 0; j < Image.Width; j++) { Vector[j + (i * Image.Height)] = Sigma(Image.GetPixel(i, j)); } } return Vector; }
  3. Сделал по своим советам выше, проект запускается(хотя я не могу точно проверить, нет вебкамеры). Могу скинуть папку со всеми файлами, хотя она весит под 500мб(не в архиве). upd.Пока вас ждал уже запаковал и выложил, попробуйте.
  4. Если вы скачали этот проект, то заметьте, что на странице скачивания написано "If you can't run your project, just build it and make sure all opencv_xxxx.dll files and haarcascade_frontalface_alt_tree.xml in the same directory with your executable file. You can find those files inside C:\Emgu\emgucv-windows-x86 2.2.1.1150\bin.", что значит вам нужно внести все emgucv и opencv библиотеки в каталог bin/Debug, как я и писал выше.
  5. На картинке слева от кр.линии- как выглядит проект с добавленным .xml файлом, справа- как добавляется(Пр. кнопка на проекте, Добавить-Существующий элемент)
  6. Не пойму почему у вас не работает пример с совой, у меня работал хорошо. Файл с каскадом поместили в папку проекта и включили в solution explorer(не знаю как он на русском)? Добавлю также код кнопки из моего проекта, которая работает с Каскадом и выделяет найденную область как новое изображение, может пригодится. upd. Также посмотрите в сети как создать проект с библиотеками EmguCV(проверьте, работают ли самые простые программы), в некоторых статьях забывают упомянуть что нужно в bin/Debug вашего проекта хранить не только библиотеки emgucv, но и opencv. Хотя, может и по-другому можно на них ссылаться, но так проще всего, как мне кажется. ButtonRun.txt
  7. Сделал фильтрацию таким методом: public List<Point> FilterPoints(List<Point> inputPoints) { List<Point> sort_p = new List<Point>(); for (int i = 0; i < inputPoints.Count; i++) { if ((inputPoints[i].X >= 7 && inputPoints[i].X <= 12) || (inputPoints[i].X >= 32 && inputPoints[i].X <= 38) || (inputPoints[i].X >= 60 && inputPoints[i].X <= 70) || (inputPoints[i].X >= 85 && inputPoints[i].X <= 100) || (inputPoints[i].X >= 111 && inputPoints[i].X <= 127) || (inputPoints[i].X >= 139 && inputPoints[i].X <= 153) || (inputPoints[i].X >= 164 && inputPoints[i].X <= 184)) { sort_p.Add(new Point(inputPoints[i].X, 0)); } } for (int i = 0; i < sort_p.Count - 3; i++) { if ((Math.Abs(sort_p[i].X - sort_p[i + 2].X) < 20)) { if (sort_p[i + 2].IsEmpty == false) sort_p.RemoveAt(i + 2); } } for (int i = 0; i < sort_p.Count - 1; i++) { if (Math.Abs(sort_p[i].X - sort_p[i + 1].X) < 15) sort_p.RemoveAt(i + 1); } if (sort_p.Count > 7) { for (int i = 0; i < sort_p.Count - 1; i++) { if (Math.Abs(sort_p[i].X - sort_p[i + 1].X) < 20) sort_p.RemoveAt(i + 1); } } return sort_p; } Немного топорно, понимаю, но работает
  8. Точно! Поставлю условие и буду выбирать из диапазона где скорее всего находятся точки, спасибо!
  9. Такая странная незадача выходит. Проходя по изображению получается список точек в виде: + [0] {X = 2 Y = 204} System.Drawing.Point + [1] {X = 10 Y = 245} System.Drawing.Point + [2] {X = 22 Y = 181} System.Drawing.Point + [3] {X = 24 Y = 177} System.Drawing.Point + [4] {X = 34 Y = 219} System.Drawing.Point + [5] {X = 46 Y = 188} System.Drawing.Point + [6] {X = 60 Y = 231} System.Drawing.Point Нужны точки(примерно) с коорд.Х 10,35,60 и т.д с разницей около 24. Но просто проходом и сравнением (текущаяточка - следующая) >= 24 массив не получается, т.к он каждый раз переходит на следующий элемент, я думал обойти это при каждом удачном нахождении точки запоминать текущее i и потом начинать цикл с него: public List<Point> FilterPoints(List<Point> inputPoints) { List<Point> sort_p = new List<Point>(); int D = 24; //Примерное удаление символов друг от друга, должно быть 24 int first_i = 0; int i = 0; for (first_i = i ; i < inputPoints.Count - 1; i++) { if ((inputPoints[i].X >= 10) || (Math.Abs(inputPoints[i].X - inputPoints[i + 1].X) >= D)) //Первое условие- лишнее пространство в начале изображения { sort_p.Add(new Point(inputPoints[i].X, 0)); first_i = i; } } return sort_p; } Но метод выводит 0 точек, если делать переменную D около 10- слишком много точек. Подскажите, пожалуйста, где я ошибся в алгоритме?
  10. Таких методов я не нашел, поэтому пока строю проекцию на ось Х, думаю находить лок.мин-мы для сегментации. upd. Неплохо находятся, осталось прикрутить некоторые проверки на основе известной ширины цифр, ато уж больно много точек получается.
  11. Ох, раньше не увидел, но пока сделал методом "в лоб" - поворачиванием изображения на известный угол наклона прямоугольника.Столкнулся с сегментацией, а именно, я рассчитывал что через findContours можно выделить в прямоугольники каждый символ и потом их распознавать. Оказывается, я или ошибался насчет этой идеи, либо делаю что то неправильно- все цифры хорошо выделяются через CvInvoke.cvDrawContours(temp4, contours, new MCvScalar(0), new MCvScalar(255), -1, 3, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0)); Но если вызвать temp4.Draw(currentContour.GetMinAreaRect(), new Bgr(0,0,255), 1); или тоже самое с currentContour.BoundingRectanle программа рисует огромный квадрат во весь номер. Может подскажите, есть какие нибудь методы по выделению внутренних контуров, вместо одного большого?
  12. Спасибо за такой развернутый ответ! Однако, я довольно плохой программист и перенести этот код в с# у меня не получилось. Хотелось бы справиться стандартными возможностями c# и emgucv. Повозился с houghlines, сначала получалась какая то каша в виде огромного количества линий, теперь же они находятся прямо там, где нужно! Осталось вот теперь как нибудь обрезать по ним изображение, пошёл искать как бы это сделать.
  13. Пробовал способ, предложенный выше- работает хорошо, но медленно, не понял как сделать его быстрее. Но мне нравится как сам emgucv выделяет именно нужную часть прямоугольника синим цветом(на рисунке ниже). Подскажите, есть ли способ использовать в качестве нового изображения не красный прямоугольник, а именно вот это выделение синим? Код, который это делает: upd. Нашел интересный ConvexHull, попробую. using (MemStorage storage = new MemStorage()) { for (Contour<Point> contours = grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE, storage); contours != null; contours = contours.HNext) { Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.015, storage); if (currentContour.BoundingRectangle.Width > 20) { //Здесь бы собрать подходящие контуры в новый массив CvInvoke.cvDrawContours(color, contours, new MCvScalar(255), new MCvScalar(0), -1, 3, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0)); color.Draw(currentContour.BoundingRectangle, new Bgr(0, 0, 255), 1); } } } //А после перегнать их в прямоугольник(область), которой сделать новое изображение
×