Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/105: Рейтинг темы: голосов - 105, средняя оценка - 4.94
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54

Распознавание образов

30.11.2009, 14:27. Показов 21122. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я не акти какой программист.
В общем необходимо написать программу для распознавания образов, т.е. надо загрузить чернобелую картинку с цифрой (белый фон, черная цифра). Программа должна распознать, что это за цифра, если загрузили картинку с цифрой 5, то в Static Text должен появиться текст "Пять" или можно просто "5".

В общем кое-что есть и если вы поможете, может быть с вашей помощью получиться что-нибудь сообразить, во всяком случае я на это надеюсь

В принцыпе суть моей проблемы описана на http://dign.narod.ru/ Пример1.

Код для вывода изображения на форму:
C++
1
2
3
4
5
6
// загрузка изображения, 5.bmp - имя файла
HBITMAP hBmp = (HBITMAP)LoadImage(NULL, "5.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//отображаем изображение
CPaintDC dc(this);
::DrawState (dc.m_hDC, NULL, NULL, (WPARAM)hBmp, (LPARAM)0, 0,0, 1280, 768, DST_BITMAP);
CDialog::OnPaint();
Так будет выглядить код, для начала? (http://dign.narod.ru/ Пример1)
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
int X,Y;
int Count;
unsigned char Pixel[64][64];
 
BITMAP Img;
 
  ::GetObject(hbit,sizeof(Img),&Img);
 
int nSymbol;
double Percent;
 
int Left = 0;
int Top = 0;
int Right = Img.bmWidth-1;
int Bottom = Img.bmHeight;
 
//Находим левую точку. В цикле проверяем вертикали, если нашли черный пиксель, то это первая левая точка.
for (X=Left; X<=Right; X++) 
{
  for (Y=Top; Y<=Bottom; Y++) 
  {
    if (Pixel[X,Y] == 0) 
    {
      Left = X;
      return;
    }
  }
}
 
//Находим правую точку. В цикле проверяем суммы черных, если сумма по вертикали равна нулю, значит, достигли конца элемента.
for (X=Left; X<=Right; X++) 
{
  Count = 0;
  for (Y=Top; Y<=Bottom; Y++) 
    if (Pixel[X,Y] == 0) 
        Count++;
  if (!Count) 
  {
    Right = X-1;
    return;
  }
}
 
//Находим верхнюю точку.
for (Y=Top; Y<=Bottom; Y++) 
{
  for (X=Left; X<=Right; X++) 
  {
    if (Pixel[X,Y] == 0) 
    {
      Top = Y;
      return;
    }
  }
}
 
//Находим нижнюю точку.
for (Y=Top; Y<=Bottom; Y++) 
{
  Count = 0;
  for (X=Left; X<=Right; X++)
    if (Pixel[X,Y] == 0) 
        Count++;
  if (!Count) 
  {
    Bottom = Y-1;
    return;
  }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2009, 14:27
Ответы с готовыми решениями:

srand() и rand() не работают должным образов
Всем привет! В общем задали задание написать программу заполнения двумерного массива случайными числами в диапазоне от -70 до 170, найти...

Распознавание образов
Какую лучше всего взять библиотеку, метод именно про распознавание образов?

распознавание образов
уважаемые форумчане кто из вас пользовался продуктами для распознавания букв\цифр? что можете посоветовать (бесплатное\триал) ? чтобы...

18
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
30.11.2009, 20:54
Подходов - тьма тьмущая. И самый простой и работающий в простых случаях - сравнение по шаблону. Есть шаблон с картинкой пятерочки, прикладываем...не,плохо подходит. И так все прикладываем,пока не найдем. Как-то так. Подход во многом определяется постановкой задачи, которой (четкой) нет.
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
01.12.2009, 02:51  [ТС]
Это ясно понятно, что подходов тьмя тьмущая. У меня с реализацией проблема. Вот я и выбрал Пример1 на странице http://dign.narod.ru/, там и код описан. Сложность заключается в том, что не совсем получается все эти куски кода объединить вместе.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
01.12.2009, 11:40
NAYGER, а,вижу. Ты скопировал приведенные там куски кода друг под друга. Да уж,это непросто было. Не учтено только то,что там - псевдокод. Вот,к примеру,два забавных последствия копипаста.
1. Массив Pixel у тебя вообще не заполнен. Что,интересно,ожидалось?
2. Pixel[X,Y] - это - НЕ пиксель с координатами x,y.
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
01.12.2009, 12:24  [ТС]
Это понятно, что там написанна не вся программа, а алгоритм. Вот я испрашиваю как отточить эту часть.

Массив Pixel у тебя вообще не заполнен. Что,интересно,ожидалось?
Pixel[X,Y] - это - НЕ пиксель с координатами x,y.
Ну подскажите тогда, как решить эти проблемы.

А что не так с массивом, я же его вроди бы задал как:
C++
1
2
3
unsigned char Pixel[64][64];
или
int Pixel[64][64];
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
01.12.2009, 12:28
NAYGER, c массивом все не так. Во-первых, синтаксис обращения к элементу двумерного массива такой : Pixel[X][Y]. Но это не все.
Я не знаю,Какая там у тебя битмапа,но пиксель отнюдь не обязан влезать в 8 бит(unsigned char). А вообще этот массив тебе нафиг не нужен. У тебя есть структура BITMAP, в которой есть указатель на массив битов и его характеристики. Я бы на твоем месте написал inline функцию для доступа к нужному пикселю по координатам и этой структуре,а потом использовал бы ее в этих всех условиях.
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
01.12.2009, 12:38  [ТС]
Что-то изобрести новое нет времени, поэтому я отталкиваюсь от того, что есть.
Если я задам массив подругому, то появляются ошибки:
C++
1
2
3
4
int X, Y;
unsigned char Pixel[X][Y];
или
int Pixel[X][Y];
Ошибки:
syntax error : missing ';' before identifier 'Pixel'
fatal error C1903: unable to recover from previous error(s); stopping compilation

или
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2087: '<Unknown>' : missing subscript
error C2133: 'Pixel' : unknown size
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
01.12.2009, 12:42
NAYGER, ты попытался задать массив черт знает какого размера.
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
01.12.2009, 12:51  [ТС]
Блин я чет так и не пойму, как я задал массив вам не нравится, сделал как вы показали, сного не то
Может покажите тогда, что с этим массивом все-таки сделать надо

Добавлено через 3 минуты
Delphi
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
type
  TMas16x16 = array [0..15] of array [0..15] of byte;  // приведенная матрица (шаблон) распознавания 16x16
 
var
  MasSimple16 : array of TMas16x16;                    // массив шаблонов
 
 
//========== процедура генерации приведенной матрицы ===========================
  
function Create_16x16(Img : TBitmap) : TMas16x16;
type
  MasX = PByteArray;
var
  MasY : array of MasX;                             // битмап в памяти как массив (Y x X)
  j, i : integer;
  xLeft, xRight, yTop, yBottom : integer;           // абс. коорд. образа
  ki, kj : integer;
  nSymbol : integer;                                // кол-во значимых пикселей
  Percent : double;                                 // процент заполнения
  XY : array [0..16] of record
  x, y : integer end;  // относительные координаты анализируемых ячеек
  W, H : integer;                                   // ширина и высота образа
 
begin
  SetLength(MasY, Img.Height);                      // выделяем память под битмап
  for j := 0 to Img.Height - 1 do                   // получаем отображение битмапа в массиве
    MasY[j] := Img.ScanLine[j];                     // MasY[y - координата][x - координата] = знач. пикселя (x,y)
 
  //-------- получение координат границ образа ---------------------------------
  // здесь и далее предполагается что значение MasY[y][x] = 0 соответствует черному цвету пикселя
 
 
  xLeft := -1;                                      // инициализация
  xRight := -1;
  yTop := -1;
  yBottom := -1;
 
  for j := 0 to Img.Height - 1 do                   // Top
  begin
    for i := 0 to Img.Width - 1 do
      if MasY[j][i] = 0 then
      begin yTop := j; break; end;
    if yTop = j then break;
  end;
 
  for j := Img.Height - 1 downto 0 do               // Bottom
  begin
    for i := 0 to Img.Width - 1 do
      if MasY[j][i] = 0 then
      begin yBottom := j + 1; break; end;
    if yBottom = j + 1 then break;
  end;
 
  for i := 0 to Img.Width - 1 do                    // Left
  begin
    for j := 0 to Img.Height - 1 do
      if MasY[j][i] = 0 then begin xLeft := i; break; end;
    if xLeft = i then break;
  end;
 
  for i := Img.Width - 1 downto 0 do                // Right
  begin
    for j := 0 to Img.Height - 1 do
      if MasY[j][i] = 0 then begin xRight := i + 1; break; end;
    if xRight = i + 1 then break;
  end;
 
  //----------------------------------------------------------------------------
 
  if ((yBottom - yTop)*(xRight - xLeft)) = 0 then   // если ничего не нарисовано
  begin
    exit;
  end;
 
  //----------------------------------------------------------------------------
  // получаем процент заполнения как отношение кол-ва значимых пикселей к общему
  // кол-ву пикселей в границах образа
  // Percent будет необходим при анализе каждой ячейки в разбитом на 16х16 образе
  nSymbol := 0;
  for j := yTop to yBottom do
  for i := xLeft to xRight do
    if MasY[j][i] = 0 then inc(nSymbol);
  Percent := nSymbol / ((yBottom - yTop)*(xRight - xLeft));
  Percent := 0.3*Percent;     // коэф-т влияет на формирование матрицы 16х16
                               // > 1 - учитывается меньше значимых пикселей
                               // < 1 - учитывается больше значимых пикселей
  //----------------------------------------------------------------------------
  //----------------------------------------------------------------------------
  // разбиваем прямоугольник образа на 16 равных частей путем деления сторон на 2
  // и получаем относительные координаты каждой ячейки
 
  W := xRight - xLeft;;
  XY[0].x  := 0;
  XY[16].x := W;
  XY[8].x  :=   XY[16].x div 2;
  XY[4].x  :=   XY[8].x div 2;
  XY[2].x  :=   XY[4].x div 2;
  XY[1].x  :=   XY[2].x div 2;
  XY[3].x  :=  (XY[4].x + XY[2].x) div 2;
  XY[6].x  :=  (XY[8].x + XY[4].x) div 2;
  XY[5].x  :=  (XY[6].x + XY[4].x) div 2;
  XY[7].x  :=  (XY[8].x + XY[6].x) div 2;
  XY[12].x :=  (XY[16].x + XY[8].x) div 2;
  XY[10].x :=  (XY[12].x + XY[8].x) div 2;
  XY[14].x :=  (XY[16].x + XY[12].x) div 2;
  XY[9].x  :=  (XY[10].x + XY[8].x) div 2;
  XY[11].x :=  (XY[12].x + XY[10].x) div 2;
  XY[13].x :=  (XY[14].x + XY[12].x) div 2;
  XY[15].x :=  (XY[16].x + XY[14].x) div 2;
  H := yBottom - yTop;
  XY[0].y  := 0;
  XY[16].y := H;
  XY[8].y  :=   XY[16].y div 2;
  XY[4].y  :=   XY[8].y div 2;
  XY[2].y  :=   XY[4].y div 2;
  XY[1].y  :=   XY[2].y div 2;
  XY[3].y  :=  (XY[4].y + XY[2].y) div 2;
  XY[6].y  :=  (XY[8].y + XY[4].y) div 2;
  XY[5].y  :=  (XY[6].y + XY[4].y) div 2;
  XY[7].y  :=  (XY[8].y + XY[6].y) div 2;
  XY[12].y :=  (XY[16].y + XY[8].y) div 2;
  XY[10].y :=  (XY[12].y + XY[8].y) div 2;
  XY[14].y :=  (XY[16].y + XY[12].y) div 2;
  XY[9].y  :=  (XY[10].y + XY[8].y) div 2;
  XY[11].y :=  (XY[12].y + XY[10].y) div 2;
  XY[13].y :=  (XY[14].y + XY[12].y) div 2;
  XY[15].y :=  (XY[16].y + XY[14].y) div 2;
  //----------------------------------------------------------------------------
  //----------------------------------------------------------------------------
  // анализируем каждую полученную ячейку в разбитом прямоугольнике образа
  // и создаем приведенную матрицу 16x16
 
  for kj := 0 to 15 do
  for ki := 0 to 15 do
  begin
    nSymbol := 0;
    for j := yTop + XY[kj].y to yTop + XY[kj+1].y do    // пробегаемся по ячейкам уже
    for i := xLeft + XY[ki].x to xLeft + XY[ki+1].x do  // в абсолютных координатах
      if MasY[j][i] = 0 then inc(nSymbol);              // считаем кол-во значимых пикселей (=0 -> черный цвет)
    // если отношение кол-ва знач. пикселей к общему кол-ву в ящейке > характерного процента заполнения то = 1 иначе = 0
    if nSymbol / MAX(1, ((XY[ki+1].x - XY[ki].x) * (XY[kj+1].y - XY[kj].y))) > Percent
      then Result[kj][ki] := 1 else Result[kj][ki] := 0; // результат - приведенная матрица 16х16
  end;
end;
Это вариант(написанный на Delphi) как бы того что должно получиться, но возникают некоторые затруднения с переводом на Visual C++.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
01.12.2009, 12:53
Цитата Сообщение от NAYGER Посмотреть сообщение
Блин я чет так и не пойму, как я задал массив вам не нравится, сделал как вы показали, сного не то
Может покажите тогда, что с этим массивом все-таки сделать надо
Я говорил не про задание а про обращение к элементам. И я уже сказал,что с этим массивом ничего делать не надо,он не нужен.
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
01.12.2009, 13:08  [ТС]
Т.е. не нужен массив Ненужен в задании - тогда будет куча ошибок, или не нужен вообще - тогда зачем люди его втыкаю везде, что в программе на Delphi(см. выше), что в этом варианте.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
01.12.2009, 13:36
Цитата Сообщение от NAYGER Посмотреть сообщение
Т.е. не нужен массив Ненужен в задании - тогда будет куча ошибок, или не нужен вообще - тогда зачем люди его втыкаю везде, что в программе на Delphi(см. выше), что в этом варианте.
Еще раз говорю,в этом "варианте" - псевдокод.

Ладно. И как ты собираешься связывать свой массив и изображение? А что такое изображение? Изображение, в данном случае, само по себе массив. Он уже есть. Зачем его сто раз копировать?

Посмотри на поля структуры
BITMAP
C++
1
2
3
4
5
6
7
8
9
typedef struct tagBITMAP {  // bm  
   LONG   bmType; 
   LONG   bmWidth; //ширина
   LONG   bmHeight; //высота
   LONG   bmWidthBytes;  // а если умножишь высоту на ширину получишь кол-во точек всего.
   WORD   bmPlanes; 
   WORD   bmBitsPixel; // количество бит на пиксель. 
   LPVOID bmBits; //указатель на буффер
} BITMAP;

Дальше все зависит только от фантазии. Можно объявить дополнительный указатель для удобства,как-то так :
BYTE * bitsPtr = (BYTE*) Img.bmBits;

потом адресовать его примерно так :
C++
1
2
3
 
      BYTE * bitsPtr = (BYTE*) Img->bmBits;//указатель для удобства
      bitsPtr[  (x + y* Img->bmWidth ) * Img->bmBitsPixel/8]  - первый байт пикселя с координатами X,Y.
Можно задать массив указателей на начало строк. Скажем,
C++
1
2
3
BYTE ** ptrs = new BYTE*[Img->bmHeight];
for(int i=0;i<Img.bmHeight;i++) 
ptrs[i]= (BYTE*)Img->bmBits + Img->bmWidthBytes;
дальше работать с этим массивом указателей
Если на пиксель выделен 1 байт или три обработка чуть изменится из-за выравнивания строк.
Все эти страшные подсчеты адресов неплохо бы спрятать в класс или inline функции на худой конец.

Да,времени читать код на дельфи у меня нет,я ухожу уже. Но,на сколько я вижу,там используется приятное предположение,что на пиксель приходится один байт. А это совершенно не обязательное условие.Я бы даже сказал, оно крайне редко выполняется.

P.S на мой код из этого поста опираться не советую,он тоже "псевдо". Наверняка забыл что-нибудь
P.P.S Не советую заморачиваться со всеми возможными кол-вами бит на пиксель. Посмотри,какие у тебя изображения на вход, посмотри сколько там бит на пиксель и для них и кодируй. В универсальности закопаешься. Так что если достаточно просто сдать - упрости себе этот момент.
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
01.12.2009, 14:26  [ТС]
Т.е. представленный мной код из Примера1, можно смело бросать в корзину?
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
01.12.2009, 15:22  [ТС]
Вот гадство все исходники программ по распознаванию написанны на Delphi
Вот нашел программу которая решает полностью суть моей проблемы, но она всего лишь демка, т.е. без кода.
Вложения
Тип файла: zip 1.zip (79.2 Кб, 122 просмотров)
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
02.12.2009, 07:17  [ТС]
А если забить на тот Пример1, и сделать по новой как-нибудь так:

По пиксельная запись матрицы изображения в файл построчно

Допустим есть изображение размером 8Х9 пикселей

Двойка:

00000000
00111100
01100110
00000110
00001100
00011000
00110000
01111110
00000000


MAT[8][9]
K=1 - черный пиксель, L=0 - белый пиксель

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
File *file;
char* file_name = "file.txt";
file = fopen( file_name, "w" ); 
char load_string[256]
 
If (MAT[0][0]==K)
MAT[0][0]=K;
fputs( K, file );
else
MAT[0][0]=L;
fputs( L, file );
 
If (MAT[1][0]==K)
MAT[1][0]=K;
fputs( K, file );
else
MAT[1][0]=L;
fputs( L, file );
 
If (MAT[2][0]==K)
MAT[2][0]=K;
fputs( K, file );
else
MAT[2][0]=L;
fputs( L, file );
 
If (MAT[3][0]==K)
MAT[3][0]=K;
fputs( K, file );
else
MAT[3][0]=L;
fputs( L, file );
 
... //и т.д.
 
fclose( file );
То содержисмое файла должно выглядеть, так:
0000000000111100011001100000011000001100 00011000001100000111111000000000


Распознавание изображения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
File *file;
char* file_name = "file.txt";
file = fopen( file_name, "r" ); 
char load_string[256]
//тут надо как-то сравнить матрицу изображения с содержимым файла ???
//Т.е. первый пиксель изображения сравнивается с первым символом строки файла, потом 2-ой
//пиксель изображения сравнивается со вторым символом строки файлв и т.д.
//Если находим первое не совпадение, пере ходим к закрытию файла, а дальше к по пиксельной 
//записи матрицы изображения в файл, см выше.
 
while(!file.eof())
{
fgets( load_string, 256 , '\n' ); 
file<<load_string<<endl;
 
}
fclose( file );
Подскажите плиззз, как это можно правильно программно реализовать?
0
DreamTime
02.12.2009, 22:36
То содержисмое файла должно выглядеть, так:
Как вариант, сделай так скажем библиотеку образов, которая представляет собой набор из 10 массивов (т.е. кол-во цифр). Для двойки такой массив:
0000000000111100011001100000011000001100 0001100000 1100000111111000000000

Сравниваем либо в лоб перебором полученную комбинацию из файла с комбинацией из шаблонов-массивов, при совпадении выводим на экран цифру, соответствующую для совпавшего массива, если совпадения нет, то так и напишем
Для начала хватит.. потом можно модифицировать алгоритм для производительности.

Добавлено через 11 минут
Для единицы заготовим такой массив:
00000000
00011000
00111000
00011000
00011000
00011000
00011000
00111100
00000000
Для простоты мы будем представлять массив в качестве строчки
0000000000011000001110000001100000011000 00011000000110000011110000000000
Для двойки такой массив:
0000000000111100011001100000011000001100 0001100000 1100000111111000000000

и так далее..
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
03.12.2009, 07:41  [ТС]
Значит мой вариант имеет место быть?
Как вариант, сделай так скажем библиотеку образов, которая представляет собой набор из 10 массивов (т.е. кол-во цифр).
Библиотека образов будет сформирована автоматически, т.е. если образ в библиотеке не будет найден, то в конец файла будет записываться образ этого изображения.

У меня проблема заключается в том как это реализовать программно?


Нарыл на форуме, как загнать BMP изображение в массив:
Код1
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
HBITMAP hbit = (HBITMAP)::LoadImage(NULL,"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    BITMAP bmp;
    ::GetObject(hbit,sizeof(bmp),&bmp);
    HDC hdc=0;
    {
        HWND hwndScreen=0;
        HDC hdcScreen=::GetDC(hwndScreen);
        hdc=::CreateCompatibleDC(hdcScreen);
        ::ReleaseDC(hwndScreen,hdcScreen);
    }
    COLORREF dwd=0;
    HBITMAP oldBmp=(HBITMAP)::SelectObject(hdc,hbit);
    {
        for(int x=0;x<bmp.bmWidth;x++)
        {
            for(int y=0;y<bmp.bmHeight;y++)
            {
                dwd=::GetPixel(hdc,x,y);
            }
        }
    }
    ::SelectObject(hdc,oldBmp);
    ::DeleteDC(hdc);
    hdc=0;
    ::DeleteObject(hbit);
    hbit=0;
Как бы теперь реализовать запись массива изображения в файл, т.е. как связать Код1 и Код2?
MAT[y][x]
В моем с лучае это координата пикселя:
MAT[0][0] MAT[0][1] MAT[0][2] MAT[0][3] ... MAT[0][n]
MAT[1][0] MAT[1][1] MAT[1][2] MAT[1][3] ... MAT[1][n]
...
MAT[m][0] MAT[m][1] MAT[m][2] MAT[m][3] ... MAT[m][n]

Код2
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
int L=0;
int K=1;
File *file;
char* file_name = "file.txt";
file = fopen( file_name, "a" ); //открываем файл и дописываем его
char load_string[256]
 
If (MAT[0][0]==K)
MAT[0][0]=K;
fputs( K, file );
fputs( "\K", file ); //переходим на следующую строку и записываем пиксель, если черный то 1, если белый то 0
else
MAT[0][0]=L;
fputs( L, file );
fputs( "\K", file );
 
If (MAT[0][1]==K)
MAT[0][1]=K;
fputs( K, file );
else
MAT[0][1]=L;
fputs( L, file );
 
If (MAT[0][2]==K)
MAT[0][2]=K;
fputs( K, file );
else
MAT[0][2]=L;
fputs( L, file );
 
If (MAT[0][3]==K)
MAT[0][3]=K;
fputs( K, file );
else
MAT[0][3]=L;
fputs( L, file );
 
... //и т.д.
 
fclose( file );
0
DreamTime
03.12.2009, 10:53
Вот нашел готовую курсовую по распознаванию картинок, прога с исходниками и с описанием
Сам я занимаюсь немного в другой области программирования, поэтому нет возможности уделить должное внимание этой интересной теме.
Вложения
Тип файла: zip magi.zip (212.8 Кб, 537 просмотров)
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
03.12.2009, 11:43  [ТС]
Спс всем, вроди бы разобрался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2009, 11:43
Помогаю со студенческими работами здесь

Распознавание образов
Можно при помощи моделирования нейросетей или чисто математических алгоритмов распознавать объекты, изображенные на видео, поступающем с...

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

Распознавание образов
здравствуйте. нужно написать программу для распознавания типов водного транспорта (лодка, корабль, подводная лодка).распознавание образов ...

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

Распознавание образов
Нужна помощь в области методов распознавания образов, а именно нужна информация(литература, лекции) на темы &quot;Геометрический метод...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru