AssemSer 0 Report post Posted December 15, 2016 При сегментации автомобильного номера на отдельные символы получился следующий результат. Подскажите плз, как я могу сделать так, чтоб не нужные области не сегментировались, чтобы отсекать их и получать только символы. Сегментировала с помощью findContour(). буду благодарна если приведите кусочек кода Share this post Link to post Share on other sites
Smorodov 578 Report post Posted December 15, 2016 Выкладывал на форуме в теме про распознавание текста. Share this post Link to post Share on other sites
Король 7 Report post Posted December 15, 2016 Для примера выложу свой код, как удалять не нужные блобы(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; } Share this post Link to post Share on other sites
Андрей_Андрей 0 Report post Posted December 16, 2016 1 померяйте соотношение ширины/высоты всех найденных прямоугольников. 2 отсейте все, у которых это соотношение получилось больше 1.1 ... 1.2 3 ??? 4 Profit! Share this post Link to post Share on other sites
Amar 0 Report post Posted August 7, 2018 В 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; } Привет можно дайте мне исходник ? Share this post Link to post Share on other sites
Король 7 Report post Posted August 8, 2018 https://dfiles.ru/files/w1gv5r2vr с картинками с сайта auto-nomer.ru Share this post Link to post Share on other sites