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

barsukov

Пользователи
  • Количество публикаций

    21
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем barsukov


  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;
            }

    post-7270-0-86740100-1431867165_thumb.jp


  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. Не пойму почему у вас не работает пример с совой, у меня работал хорошо. Файл с каскадом поместили в папку проекта и включили в solution explorer(не знаю как он на русском)? Добавлю также код кнопки из моего проекта, которая работает с Каскадом и выделяет найденную область как новое изображение, может пригодится.

    upd. Также посмотрите в сети как создать проект с библиотеками EmguCV(проверьте, работают ли самые простые программы), в некоторых статьях забывают упомянуть что нужно в bin/Debug вашего проекта хранить не только библиотеки emgucv, но и opencv. Хотя, может и по-другому можно на них ссылаться, но так проще всего, как мне кажется.

    ButtonRun.txt


  6. Сделал фильтрацию таким методом:

    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;
                }
    Немного топорно, понимаю, но работает :)

  7. Такая странная незадача выходит. Проходя по изображению получается список точек в виде:

    + [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- слишком много точек. Подскажите, пожалуйста, где я ошибся в алгоритме?

     


  8. Таких методов я не нашел, поэтому пока строю проекцию на ось Х, думаю находить лок.мин-мы для сегментации.

    upd. Неплохо находятся, осталось прикрутить некоторые проверки на основе известной ширины цифр, ато уж больно много точек получается.


  9. Ох, раньше не увидел, но пока сделал методом "в лоб" - поворачиванием изображения на известный угол наклона прямоугольника.Столкнулся с сегментацией, а именно, я рассчитывал что через 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 программа рисует огромный квадрат во весь номер. Может подскажите, есть какие нибудь методы по выделению внутренних контуров, вместо одного большого?

    post-7270-0-83626500-1430936631_thumb.jp


  10. Спасибо за такой развернутый ответ! Однако, я довольно плохой программист и перенести этот код в с# у меня не получилось. Хотелось бы справиться стандартными возможностями c# и emgucv. Повозился с houghlines, сначала получалась какая то каша в виде огромного количества линий, теперь же они находятся прямо там, где нужно! Осталось вот теперь как нибудь обрезать по ним изображение,  пошёл искать как бы это сделать.

    post-7270-0-74911200-1430845704_thumb.jp


  11. Пробовал способ, предложенный выше- работает хорошо, но медленно, не понял как сделать его быстрее. Но мне нравится как сам 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);
                        }
                    }
    
                }
                   //А после перегнать их в прямоугольник(область), которой сделать новое изображение
    

    post-7270-0-51803600-1430826611_thumb.jp


  12. Переход на 3.0 пока отменяется, все на том же 2.4. немного переработал проект, есть кнопка для оператора Кэнни, линий уже меньше, но все равно не нашел как решить старую проблему. Подскажите, пожалуйста, как вырезать номер после нахождения линий. Вид программы в скриншоте, найденные линии показаны красным.

     

    post-7270-0-93914400-1429032513_thumb.jp


  13. 1 Поиск прямоугольника сработает только в идеальных условиях при которых сработает и findContours, но второй на МНОГО быстрее и мене "капризный"

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

    Может поделитесь каскадом Хаара?

    Спасибо, сегодня попробую. Nuzhny всё верно написал, используется тот самый haarcascade_russian_plate_number.xml.


  14. Здравствуйте, форумчане! Прошу помочь с такой задачей- из данного изображения выделить только номер, т.е только эту самую белую область с буквами smile.png
    Вот что у меня получилось: сделал программку на C#, она ищет на изображении номер автомобиля через каскад Хаара и выдаёт его в окне.

    Далее нужно оставить на изображении только номер, без каких либо областей вокруг, причем номер может быть повёрнут на некоторый угол. Поискав по интернету я понял что для этого используется преобразование Хафа.

    Взяв из примеров EmguCV(ShapeDetection) код для линий Хафа и прямоугольников я подставил его в свою программу, но столкнулся с такими проблемами:

    1) в случае линий - их слишком много, а прямоугольники оно находит только идеально прямые;

    2) на некоторых, казалось бы, хороших изображениях даже линии определяются неверно.

    post-7270-0-62146100-1428436315_thumb.jppost-7270-0-92109400-1428436316_thumb.jp

    Перед передачей изображения для нахождения линий Хафа его можно подвергнуть операции бинаризации. Некоторая проблема для меня в том, что после бинаризации линий находит куда больше(изображение 2, с ВАЗ 2112) чем без бинаризации(изображение 1, Лада Гранта), с параметрами cvAdaptiveThreshold игрался, но результата так и не получил. Т.е линий все равно много и я не пойму как оставить такие, по которым можно было бы обрезать изображение.

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

    В прикреплениях есть код формы. Выглядит, думаю, плохо, но пока только такой есть smile.png

    upd1. Добавочка. Hайти в конченом счете нужно буквы и цифры номера. Нашел в литературе употребление функции findContours для таких целей, скоро попробую.

    Form1csTXT.zip

×