Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > распознавание образа


Автор: bagos 30.10.2009, 04:27
Народ кто сталкивался с распознованием образов, нужно распознавать цифры от 0 до 99. Сам впервые с этим сталкиваюсь. На картинке число 8, его то и надо определить.
http://ipicture.ru/

Автор: bagos 30.10.2009, 04:57
нашел программу, которая довольно лихо определяет текст, но она определяет только если текст черного цвета, а фон белого. Пробовал переводить в ч/б цвет,все равно не помогло.

Автор: Alexeis 30.10.2009, 10:02
bagos, цифры всегда точь в точь такие? Картинка BMP?

Автор: bagos 30.10.2009, 12:57
картинка bmp,цифры всегда такие, только по горизонтали могут быть расположены слева,в центре или справа.

Добавлено через 10 минут и 58 секунд
Alexeis, на самом деле картинка изначально цветная(фон один и тот же, цвет числа может быть желтым, зеленым,синем,красным), это я ее перевел в черно белую, предполагая что так будет правильней привести к какому то знаменателю. Вот исходная
http://ipicture.ru/
и еще
http://ipicture.ru/

Автор: Alexeis 30.10.2009, 13:36
Способ такой, делаются образы всех цифр. Дальше берем первую цифру из образа и начинаем попиксельно сравнивать строки картинок. Если нашли различие то сдвигаемся вправо на 1 пиксель в основной картинке и сравниваем снова построчно картинку и образ. Если такая цифра есть, то в определенной позиции все построчные сравнения совпадут, это место нужно запомнить (позицию по Х). Тоже самое сделать с образами всех цифр. Результаты объединяем в массив, где каждый элемент цифра + позиция. Сортируем массив по возрастанию, по полю позиция.

Автор: bagos 30.10.2009, 14:01
Alexeis, спасибо! Алгоритм вроде не сложный, буду реализовывать)))

Автор: bagos 31.10.2009, 19:35
Хотя опыта работы с графикой не имею.
1. Сделать образы всех цифр,это как делается? сохранить картинку с каждым числом в файл? Прошу разъеснить!

Автор: Alexeis 31.10.2009, 19:48
Цитата(bagos @  31.10.2009,  18:35 Найти цитируемый пост)
сохранить картинку с каждым числом в файл? Прошу разъеснить! 

  Можно в файл, можно в ресурс, как удобно. Затем загрузить в TBitmap.
Цитата(bagos @  31.10.2009,  18:35 Найти цитируемый пост)
Сделать образы всех цифр,это как делается?

  В графическом редакторе вырезать и создать отдельную картинку.

Автор: bagos 31.10.2009, 19:59
Спасибо за ответ!
Картинки что я здесь выкладывал с цифрами, являются образами? или все таки их нужно обрезать по краям

Автор: Alexeis 31.10.2009, 20:01
  Главное не резать сверху и снизу.

Автор: bagos 31.10.2009, 22:19
Alexeis, образы сделал(все картинки с числами обрезал и сохранил) выглядит так

http://ipicture.ru/

а картинка которую будем получать на входе для распознавания 
http://ipicture.ru/

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

Цитата

Дальше берем первую цифру из образа и начинаем попиксельно сравнивать строки картинок.

поясните пожалуйста что значит сравнить строки картинок? картинка состоит из пикселей, мы сравниваем каждый пиксель по столбцам и строкам
типа 
Код

for x:=0 to pixelColCount do
for y:=0 to pixelRowCount do
 if img_a.pixel[x,y] = img_b.pixel[x,y] then

что то, кстати что)))
    

Автор: Alexeis 31.10.2009, 23:19
bagos, я говорил образы цифр, а не чисел. Это разные вещи...

Цитата(bagos @  31.10.2009,  21:19 Найти цитируемый пост)
поясните пожалуйста что значит сравнить строки картинок?

  Физически битмап храниться как массив строк. CompareMem сравнивает куски памяти, при том довольно быстро. Пикселы в строке идут непрерывно, байт за байтом, поэтому за 1 вызов можно сравнить целую строку.

Автор: bagos 1.11.2009, 16:06
делаю так
Код

var
bmp_now,bmp_obraz:Graphics.TBitmap;
dc:HDC;
begin
bmp_now := Graphics.TBitmap.Create;
bmp_now.width := 82;
bmp._now.height := 15;
dc := getdc(0);
bitblt(bmp_now.canvas.handle,0,0,bmp_now.width,bmp_now.height,dc,100,100,srccopy);
bmp_now.ingorepalette := true;




bmp_now.PixelFormat := pf24bit;
bmp_obraz.PixelFormat := pf24bit;

здесь должно быть построчное сравнение строк, правда я запутался
Код

if not CompareMem(bmp_now.Scanline[1],bmp_obraz.Scanline[1],bmp_now.Width*bmp_now.Height*3) then
 


Автор: Alexeis 1.11.2009, 21:06
bmp_now.Width*bmp_now.Height*3 это размер всего растра. Длинна строки bmp_now.Width*3
CompareMem нужно делать в цикле от нуля до bmp_now.Height - 1

Автор: bagos 1.11.2009, 22:07
Код

var
bmp,bmp_ci: Graphics.TBitmap;
DC: HDC;
i,j:integer;
begin
try
bmp:=Graphics.TBitmap.Create;
bmp.Height:=15;
bmp.Width:=82;
bmp.PixelFormat := pf32bit;
DC:=GetDC(0);
bitblt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, DC, 954, 150, SRCCOPY);
bmp.IgnorePalette:=true;


bmp_ci:=Graphics.TBitmap.Create;

for i:=0 to 9 do
  if FileExists(IntToStr(i)+'.bmp') then
  begin
    for j:=0 to bmp.Height-1 do
    begin
      bmp_ci.LoadFromFile(IntToStr(i)+'.bmp');
      if not CompareMem(bmp.ScanLine[1],bmp_ci.ScanLine[1],bmp.Width*3) then
      здесь уходим вправо на 1 пиксель?
      а если тру?
     end;


  end;

ReleaseDC(0, DC);


помогите с реализацией кода, сам не справляюсь

Добавлено через 5 минут и 30 секунд
создал 10 файлов bmp - образы цифр, от 0 до 9 соответственно.

Автор: Alexk553 20.11.2009, 02:54
Если сами цифры всегда выглядят одинаково, то можно вообще обнаглеть, и распознавать цифры по количеству используемых ими засвеченных пикселей. считать вертикальными полосами, например, слева направо. как только в двух подряд (или сколько там) не будет ни единого пикселя, задача распознавания цифры завершена и переход к новой цифре. В итоге будет формироваться одномерный массив - число засвеченных пикселей. Индекс массива - это положение по горизонтали. у каждой цифры будет свой паттерн. например
0 0 5 6 7 3 3 3 3 3 3 3 3 4 6 7 1 0 0 0 0 

ловим хвостовые и начальные нули, складываем то, что посредине, имеем цифру.

(цифры написал от балды).

Автор: cemick 20.11.2009, 10:02
Зачем велосипед снова изобретать? Это же всегда делалось с помощью нейронной сети и обучением на тестовых образах.

Автор: Alexk553 21.11.2009, 11:00
А ещё можно из пушки по воробьям стрелять.  У человека нет задачи распознавания букв, которые были искажены, повёрнуты, масштабированы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)