Jump to content
Compvision.ru
AssemSer

Сегментация

Recommended Posts

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

Screenshot_1.png

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Для примера выложу свой код, как удалять не нужные блобы(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

Share this post


Link to post
Share on other sites
В 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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×