Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
InLoL
0 / 0 / 0
Регистрация: 21.04.2013
Сообщений: 3
1

Распознавание нарисованных в PictureBox символов

15.10.2014, 12:54. Просмотров 673. Ответов 0
Метки нет (Все метки)

Доброго времени суток. Столкнулся со следующей проблемой. Есть небольшая программка, которая должна распознать один из двух символов, нарисованных в pictureBox. Насколько я понял, отрисовка должна проводиться с помощью Graphics, а изображение должно храниться в Bitmap. После того, как символ нарисован(черным цветом на белом фоне), начинаю просматривать попиксельно Bitmap и оказывается, что каждый пиксель имеет один и тот же цвет, из-за чего не получается правильно применить формулу для распознавания.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
public Bitmap mbit;
        Graphics graph;
        public Form1()
        {
            InitializeComponent();
            this.pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
            this.pictureBox1.MouseUp += new MouseEventHandler(pictureBox1_MouseUp);
            this.pictureBox1.MouseMove += new MouseEventHandler(pictureBox1_MouseMove);
            mbit = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            graph = Graphics.FromImage(mbit);
            pictureBox1.BackColor = Color.White;
            //задаем веса от -0.5 до 0.5
            Random rand = new Random();
            for (int i = 0; i <= 100; i++)
                for (int j = 0; j <= 100; j++)
                    masW[i, j] = rand.NextDouble() - (double)(0.5);  
        }
 
        int x, y;
        double[,] masW = new double[101,101];
        #region paint  (рисуем на pictureBox1)   
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
          //  pen = null;
            Point pt1 = new Point(x, y);
            Point pt2 = new Point(e.X, e.Y);
            graph.DrawLine(pen, pt1, pt2);
            pictureBox1.Image = mbit;
        }
 
        Pen pen;
 
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (pen != null)
            {
               // graph.DrawLine(pen, new Point(x,y), new Point(e.X, e.Y));
               // pictureBox1.Image = mbit;
              //  x = e.X;
              //  y = e.Y;
            }
        }
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            pen = new Pen(Color.Black, 7);
            x = e.X;
            y = e.Y;
        }
        #endregion
        //очистка pictureBox1
        private void button3_Click(object sender, EventArgs e)
        {
            graph.Clear(Color.White);
            pictureBox1.Image = mbit;
            sum = 0;
            label1.Text = string.Empty;
        }
        double sum=0;
        bool? t = null;
        //Распознаем символ. Флагом t отмечаем, отрицательная ли ошибка или положительная
        private void button1_Click(object sender, EventArgs e)
        {
            for(int i = 0;i<100;i++)
                for (int j = 0; j < 100; j++)
                {
                    sum += (double)(masW[i, j]*(mbit.GetPixel(i, j) == Color.White ? 0 : 1));
                }
            if (sum > 0) { label1.Text = "This is 1"; t = true; } else { label1.Text = "This is 2"; t = false; };
        }
        //Учим нейронную сеть
        private void button2_Click(object sender, EventArgs e)
        {
            if (t != null)
            {
                for (int i = 0; i < 100; i++)
                    for (int j = 0; j < 100; j++)
                    {
                        masW[i, j] += (double)((t == true ? -1 : 1) * (0.5) * (mbit.GetPixel(x, y).A > Convert.ToInt32(30 * 0.01 * 255) ? 1 : 0));
                    }
            }
        }
        //отрисовка символа I
        private void нарисоватьXToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pen = new Pen(Color.Black, 7);
            graph.DrawLine(pen, new Point(50, 20), new Point(50, 80));
            pictureBox1.Image = mbit;
            
        }
        //отрисовка символа II
        private void нарисоватьYToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pen = new Pen(Color.Black, 7);
            graph.DrawLine(pen, new Point(40, 20), new Point(40, 80));
            graph.DrawLine(pen, new Point(60, 20), new Point(60, 80));      
            pictureBox1.Image = mbit;
        }
1. Возможно, я где-то пропустил какое-нибудь присваивание в Bitmap? К сожалению, не особо много получалось с изображением работать, поэтому все кажется мало понятным.
2. Может, есть какая-нибудь возможность не использовать Bitmap? Например, в Паскале изображение с pictureBox можно прочитать попиксельно с помощью Canvas. Есть ли что-нибудь подобное в C#?

P.S. Да, я видел на форуме множество подобных тем, но там либо не то, что нужно, либо я не до конца разобрался.

Заранее спасибо за помощь
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2014, 12:54
Ответы с готовыми решениями:

Перекрытие bitmap-ом нарисованных фигур в PictureBox
Доброго времени суток, уважаемые программисты. А проблема такова: я рисую на...

Распознавание символов на изображении
дано задание распознать символи на двух изображениях и вывести к примеру в...

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

Распознавание символов с помощью нейросети
Здравствуйте! у меня дипломная работа, так называемая &quot;Распознавание символов с...

Метод Readkey и распознавание русских символов
Делаю простую задачу: читаю в консоли клавишу с помощью метода ReadKey() и...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2014, 12:54

Удаление нарисованных фигур
Доброе время суток! Как можно реализовать удаление нарисованных фигур? Мышкой...

Перетаскивание нарисованных объектов
using System; using System.Collections.Generic; using System.ComponentModel;...

Graphics: перемещение нарисованных объектов
Добрый день , Как лучше удалить линию нарисованную с помощью Graphics.DrawLine...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru