Распознавания текста на заданной области изображения путём попиксельного сравнения с шаблонами - C#

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Пишу программу для распознавания текста на заданной области изображения путём попиксельного сравнения с шаблонами. Сначала программа вычисляет края(верх, низ, лева, право) символа. Потом сравнивает с листом эталонов. Началом следующего символа является правая точка приведущего. Программа работает. Но не может прочитать символы которые касаются друг друга. Выкладываю исходники своего проекта. 1.7z Прошу помощи. Я уже довольно давно калупаюсь над этим и не смог придумать как это сделать. P.S. За идею бралась статья http://dign.narod.ru/articles/recognition/ автор прилагает пример программы которая справляется с слипшимися символами, написана на дельфи, исходников нет.

Решение задачи: «Распознавания текста на заданной области изображения путём попиксельного сравнения с шаблонами»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace bitmap_reader
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public void f(Bitmap bitmap, int x1, int x2, int y1, int y2, ref int x3, ref int x4, ref int y3, ref int y4)
        {
            int count = 0;
            int i = 1;
            for (int x = x1; x <= x2 && i == 1; x++)
            {
                for (int y = y1; y <= y2 && i == 1; y++)
                {
                    if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0))
                    {
                        x3 = x;
                        i = 0;
                        if (x3 - x1 >= 4)
                        {
                            x3 = x - 4;
                            x4 = x - 1;
                            y3 = y1;
                            y4 = y1;
                            return;
                        }
                        break;
                    }
                }
            }
            i = 1;
            for (int x = x3; x <= x2 && i == 1; x++)
            {
                count = 0;
                for (int y = y1; y <= y2 && i == 1; y++)
                {
                    if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0))
                    {
                        count++;
                    }
                }
                if (count == 0)
                {
                    x4 = x - 1;
                    i = 0;
                    break;
                }
            }
            i = 1;
            for (int y = y1; y <= y2 && i == 1; y++)
            {
                for (int x = x3; x <= x4 && i == 1; x++)
                {
                    if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0))
                    {
                        y3 = y;
                        i = 0;
                        break;
                    }
                }
            }
            i = 1;
            for (int y = y3; y <= y2 && i == 1; y++)
            {
                count = 0;
                for (int x = x3; x <= x4 && i == 1; x++)
                {
                    if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0))
                    {
                        count++;
                    }
                }
                if (count == 0)
                {
                    for (int Y2 = y + 1; Y2 <= y2 && i == 1; Y2++)
                    {
                        count = 0;
                        for (int X2 = x3; X2 <= x4 && i == 1; X2++)
                        {
                            if (bitmap.GetPixel(X2, Y2) == Color.FromArgb(0, 0, 0))
                            {
                                count++;
                            }
                        }
                        if (count == 0)
                        {
                            if (Y2 - y == 1)
                            {
                                y4 = y - 1;
                            }
                            else
                            {
                                y4 = Y2 - 1;
                            }
                            i = 0;
                            break;
                        }
                    }
                }
            }
        }
        public void find(Bitmap bitmap, Dictionary<int, Bitmap> list, int x3, int x4, int y3, int y4, ref string str, ref int xx)
        {
            Dictionary<int, int> list2 = new Dictionary<int, int>();
            int count = 0;
            for (int i = 32; i <= 183; i++)
            {
                try
                {
                    count = 0;
                    for (int x01 = x3, x02 = 0; x01 <= x4 && x02 <= list[i].Width - 1; x01++, x02++)
                    {
                        for (int y01 = y3, y02 = 0; y01 <= y4 && y02 <= list[i].Height - 1; y01++, y02++)
                        {
                            if (bitmap.GetPixel(x01, y01) == list[i].GetPixel(x02, y02))
                            {
                                count++;
                            }
                        }
                    }
                    if (list[i].Width * list[i].Height == count)
                    {
                        list2.Add(count, i);
                    }
                }
                catch
                {
                }
            }
            str = Convert.ToChar(list2[list2.Keys.Max()]).ToString();
            xx = x3 + list[list2[list2.Keys.Max()]].Width;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap bitmap = new Bitmap("data\\sc.bmp");
            Dictionary<int, Bitmap> list = new Dictionary<int, Bitmap>();
            for (int i = 32; i <= 183; i++)
            {
                try
                {
                    Bitmap b = new Bitmap(@"data\" + i + ".bmp");
                    list.Add(i, b);
                }
                catch
                {
                }
            }
            int x0 = 13;
            int y0 = 6;
            int x1 = x0 + 10;
            int x2 = x1 + 403;
            int y1 = y0;
            int y2 = y1 + 14;
            int x3 = 0;
            int x4 = 0;
            int y3 = 0;
            int y4 = 0;
            int xx = x4 + 1;
            string strings = "";
            string strs = "";
            int ff = 0;
            for (int x = x1; x <= x2; x++)
            {
                for (int y = y1; y <= y2; y++)
                {
                    if (bitmap.GetPixel(x, y) != Color.FromArgb(255, 255, 255))
                    {
                        bitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255));
                    }
                    else
                    {
                        bitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0));
                    }
                }
            }
            int ir = 1;
            for (int x = x2; x >= x1 && ir == 1; x--)
            {
                for (int y = y1; y <= y2 && ir == 1; y++)
                {
                    if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0))
                    {
                        x2 = x + 1;
                        ir = 0;
                        break;
                    }
                }
            }
            while (x4 + 1 != x2)
            {
                if (ff != 0)
                {
                    x1 = xx;
                }
                f(bitmap, x1, x2, y1, y2, ref x3, ref x4, ref y3, ref y4);
                find(bitmap, list, x3, x4, y3, y4, ref strs, ref xx);
                strings = strings + strs;
                ff = 1;
            }
            MessageBox.Show(strings);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы