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

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

30.11.2009, 14:27. Показов 21055. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru