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

Сегментация

Recommended Posts

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

Screenshot_1.png

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


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

Выкладывал на форуме в теме про распознавание текста.

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


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

Для примера выложу свой код, как удалять не нужные блобы(Rectangle) правда пока написано только на C#. Сначало рекомендуется вычислить угол поворота изображения. А потом уже удалять прямоугольники. Функция GetRect удаляет не нужные прямоугольники за линией (зеленой).  IsPlate - проверяет гражданский ли автомобиль состоящий из 8 или 9 символов. Может быть поможет мой код.

p.s.Функция CLAHE - очень помогла на плохо освещенных номерах и переосвещенных.

 public List<System.Drawing.Rectangle> GetRect(int i, List<System.Drawing.Rectangle> rec)
        {
            float sum = 0.0f;
            for (int ij = 0; ij < rec.Count; ij++)
            {
                sum += rec[ij].Y + rec[ij].Height;
            }
            float sredY = sum / rec.Count;
            Plate.rotate2.Draw(new LineSegment2DF(new System.Drawing.PointF(0, sredY), new System.Drawing.PointF(Plate.rotate2.Width, sredY)), new Bgr(System.Drawing.Color.Green), 2);

            for (int kl = 0; kl < rec.Count; kl++)
            {
                if (System.Math.Abs(sredY - (rec[kl].Y + rec[kl].Height)) > 8)
                {
                    rec.Remove(rec[kl]);
                    
                }
            }

            float sredX = 0.0f;
            for (int kl = 0; kl < rec.Count; kl++)
            {
                sredX += rec[kl].Width;
            }
            sredX = sredX / rec.Count;

            for (int lp = 0; lp < rec.Count; lp++)
            {
                if (System.Math.Abs(sredX - rec[lp].Width) > 10 && rec[lp].Height / rec[lp].Width < 1.5)
                {
                    rec.Remove(rec[lp]);
                    
                }
            }
            
            return rec;
        }

        bool IsPlate(int i, List<System.Drawing.Rectangle> rect)
        {
            float sum = 0.0f;
            for (int ij = 0; ij < rect.Count; ij++)
            {
                sum += rect[ij].Y + rect[ij].Height;
            }
            float sredY = sum / rect.Count;

            int index = 0;
            for (int kl = 0; kl < rect.Count; kl++)
            {
                if (System.Math.Abs(sredY - (rect[kl].Y + rect[kl].Height)) < 8)
                    index++;
            }

            float sredX = 0.0f;
            for (int kl = 0; kl < rect.Count; kl++)
            {
                sredX += rect[kl].Width;
            }
            sredX = sredX / rect.Count;

            int index2 = 0;
            for (int lp = 0; lp < rect.Count; lp++)
            {
                if (System.Math.Abs(sredX - rect[lp].Width) < 10)
                    index2++;
            }

            if ((index == 8 && index2 == 8) || (index == 9 && index2 == 9))
                return true;
            return false;
        }

0.jpg

2.jpg

3.jpg

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


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

1 померяйте соотношение ширины/высоты всех найденных прямоугольников.
2 отсейте все, у которых это соотношение получилось больше 1.1 ... 1.2
3 ???
4 Profit!
 

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


Ссылка на сообщение
Поделиться на других сайтах
В 16.12.2016 at 00:17, Король сказал:

Для примера выложу свой код, как удалять не нужные блобы(Rectangle) правда пока написано только на C#. Сначало рекомендуется вычислить угол поворота изображения. А потом уже удалять прямоугольники. Функция GetRect удаляет не нужные прямоугольники за линией (зеленой).  IsPlate - проверяет гражданский ли автомобиль состоящий из 8 или 9 символов. Может быть поможет мой код.

p.s.Функция CLAHE - очень помогла на плохо освещенных номерах и переосвещенных.

 public List<System.Drawing.Rectangle> GetRect(int i, List<System.Drawing.Rectangle> rec)
        {
            float sum = 0.0f;
            for (int ij = 0; ij < rec.Count; ij++)
            {
                sum += rec[ij].Y + rec[ij].Height;
            }
            float sredY = sum / rec.Count;
            Plate.rotate2.Draw(new LineSegment2DF(new System.Drawing.PointF(0, sredY), new System.Drawing.PointF(Plate.rotate2.Width, sredY)), new Bgr(System.Drawing.Color.Green), 2);

            for (int kl = 0; kl < rec.Count; kl++)
            {
                if (System.Math.Abs(sredY - (rec[kl].Y + rec[kl].Height)) > 8)
                {
                    rec.Remove(rec[kl]);
                    
                }
            }

            float sredX = 0.0f;
            for (int kl = 0; kl < rec.Count; kl++)
            {
                sredX += rec[kl].Width;
            }
            sredX = sredX / rec.Count;

            for (int lp = 0; lp < rec.Count; lp++)
            {
                if (System.Math.Abs(sredX - rec[lp].Width) > 10 && rec[lp].Height / rec[lp].Width < 1.5)
                {
                    rec.Remove(rec[lp]);
                    
                }
            }
            
            return rec;
        }

        bool IsPlate(int i, List<System.Drawing.Rectangle> rect)
        {
            float sum = 0.0f;
            for (int ij = 0; ij < rect.Count; ij++)
            {
                sum += rect[ij].Y + rect[ij].Height;
            }
            float sredY = sum / rect.Count;

            int index = 0;
            for (int kl = 0; kl < rect.Count; kl++)
            {
                if (System.Math.Abs(sredY - (rect[kl].Y + rect[kl].Height)) < 8)
                    index++;
            }

            float sredX = 0.0f;
            for (int kl = 0; kl < rect.Count; kl++)
            {
                sredX += rect[kl].Width;
            }
            sredX = sredX / rect.Count;

            int index2 = 0;
            for (int lp = 0; lp < rect.Count; lp++)
            {
                if (System.Math.Abs(sredX - rect[lp].Width) < 10)
                    index2++;
            }

            if ((index == 8 && index2 == 8) || (index == 9 && index2 == 9))
                return true;
            return false;
        }

0.jpg

2.jpg

3.jpg

Привет можно дайте мне исходник ?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×