Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознование. см. внутри темы... 
:(
    Опции темы
Links
Дата 17.2.2005, 19:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Итак, Есть, скажем bmp или jpg. Открываем, Ищем попиксельно точку отсчёта, пусть какая то красная среди серо-зелёного. Запоминаем координаты, отсчитываем вниз, скажем 20 пикселей и влево 80. Переводим картинку в чёрнобелую... и загоняем получившуюся рамку пикселей в массив.
0***************************
* * *** *
* * * * *
* * *** *
****************************
В этой рамке находятся цифры. Мне нужно их распознать. Они определённого вида, как в тестере или калькуляторе... палочками нарисованы. Поможете? Саму тактику распознавания я уже определил.. я беру на каждой палочке(от цифры) прямоугольник и определяю есть ли там чорные пиксели. Вы мне помогите в открытии файла\переводе его в двухцветный и как загнать это в массив... 10101010... и т.д.
  Вверх
maxim1000
Дата 17.2.2005, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



есть такой компонент Image
дальше по памяти (т.к. Delphi под рукой нету)
Код

Image.Picture.LoadFormFile(<тут надо написать имя файла>);//работает с bmp-файлами (насчет
открытия jpg поищи, тут где-то вроде обсуждалось)
а взять однобитный цвет... ну например так:
Код

function Get1BitColor(image:TImage;x,y:integer):boolean;
begin
 result:=(image.canvas.pixels[x,y]=0);//true - черный, false - белый
end;

только надо быть уверенным, что закрашенные точки абсолютно черные (все компоненты - нулевые) иначе надо будет писать более (ненамного) интеллектуальную процедуру отсева...


--------------------
qqq
PM WWW   Вверх
Links
Дата 18.2.2005, 12:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Хм.. не совсем понимаю... :
1) x,y - это координаты пикселя на картинке.. или на монике?=)
2) image.canvas.pixels[x,y]=0 - это что он делает?

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

*сорри за глупые вопросы*
  Вверх
maxim1000
Дата 18.2.2005, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



Цитата(Links @ 18.2.2005, 10:23)
1) x,y - это координаты пикселя на картинке.. или на монике?=)

на картнике, можно вообще это на мониторе не показывать, если не надо
Цитата(Links @ 18.2.2005, 10:23)
2) image.canvas.pixels[x,y]=0 - это что он делает?

1. берет объект image
2. вытаскивает из него объект canvas (используется в том числе и для работы с пикселями)
3. вытаскивает из canvas свойство pixels (попиксельный доступ)
4. берет значение пикселя с координатами x,y
5. сравнивает его с нулем


--------------------
qqq
PM WWW   Вверх
Links
Дата 19.2.2005, 12:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата

1. берет объект image
2. вытаскивает из него объект canvas (используется в том числе и для работы с пикселями)
3. вытаскивает из canvas свойство pixels (попиксельный доступ)
4. берет значение пикселя с координатами x,y
5. сравнивает его с нулем 

Да, но это нужно тогда когда картинка чёрно-белая. Иначе цвет цифр никогда в жизни чёрным не будет...
Во мне и нужно её перевести в ч.б.
  Вверх
Александра
Дата 20.2.2005, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.2.2005
Где: Москва

Репутация: нет
Всего: 12



а какого они цвета? или какой фон? ведь не обязательно переводить в ч/б... а еще лучше пример картинки приведи... или

воспользуйся например нейронной сетью Хемминга... писала правда сама, не оптимизированно, но все же...

Код
const
 iDestSize   = 10;        // размер стороны изображения для распознования, тут сам задай
 M           = 10;        // количество классов, т.е. твоих цифер - 0..9 = 10
 N = iDestSize*iDestSize; // количество входов
 e = -(1/m)/2;            // вес синапсов второго слоя

type
 TInputNeuron = record
   fW: array [0..N-1] of real; // весовые коэфициенты синапсов
   fOutput: real;              // выход
 end;

 TNeuron = record
   fOutput: real; // выход
   fSum: real;    // взвешанная сумма входов
 end;

var
 InputRow: array [0..M-1] of TInputNeuron; // 1 слой
 SecondRow: array [0..M-1] of TNeuron;     // 2 слой


обучение:

Код
for i := 0 to m-1 do begin

   //здесь в image1 загружай поочередно твою циферку...

   for x := 0 to iDestSize-1 do
     for y := 0 to iDestSize-1 do
       if Image1.Picture.Bitmap.Canvas.Pixels[x, y] <> RGB(255,255,225) then InputRow[i].fW[x*iDestSize+y] := 0.5
         else InputRow[i].fW[x*iDestSize+y] := -0.5;
 end;


ну а далее распознование:

Код
var i, j, x, y: integer;

   fOutputs: array [0..m-1] of real;

   iCount: integer;

   fMax: real;
   iIndex: integer;
begin
 for i := 0 to m-1 do begin
   InputRow[i].fOutput := 0;
   for x := 0 to iDestSize-1 do
     for y := 0 to iDestSize-1 do
       if Image2.Picture.Bitmap.Canvas.Pixels[x, y] <> RGB(255,255,225) then InputRow[i].fOutput := InputRow[i].fOutput +

InputRow[i].fW[x*iDestSize+y]
         else InputRow[i].fOutput := InputRow[i].fOutput - InputRow[i].fW[x*iDestSize+y];

   if InputRow[i].fOutput >= n/2 then InputRow[i].fOutput := n/2; // выход - через ф-ию линейного порога
 end;

 (* передаем даные с выходов первого слоя на входы второго и в список
    результатов предыдушего прохода распознавания (fOutputs) *)
 for i := 0 to m-1 do begin
   //fOutputs[i] := InputRow[i].fOutput;
   SecondRow[i].fOutput := InputRow[i].fOutput;
   //SecondRow[i].fSum := 0;
 end;

 iCount := 0;
 repeat
   for i := 0 to m-1 do begin
     fOutputs[i] := SecondRow[i].fOutput;
     SecondRow[i].fSum := 0;
   end;

   for i := 0 to m-1 do
     for j := 0 to m-1 do
       if i = j then SecondRow[j].fSum := SecondRow[j].fSum + SecondRow[i].fOutput
         else SecondRow[j].fSum := SecondRow[j].fSum + SecondRow[i].fOutput * e;

   for i := 0 to m-1 do SecondRow[i].fOutput := SecondRow[i].fSum;

   inc(iCount);
 until iCount < 25;

 (* определение выйгравшего нейрона *)
 fMax := -N;
 iIndex := -1;
 for i := 0 to m-1 do
   if SecondRow[i].fOutput > fMax then begin
     fMax := SecondRow[i].fOutput;
     iIndex := i;
   end;

 ShowMessage('цифра: '+IntToStr(iIndex));

--------------------
PM   Вверх
Links
Дата 21.2.2005, 21:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











www.ic-graphics.net/images/l/Image-01.jpg
www.ic-graphics.net/images/l/Image-03.jpg
www.ic-graphics.net/images/l/Image-04.jpg
www.ic-graphics.net/images/l/Image-05.jpg
www.ic-graphics.net/images/l/Image-06.jpg
www.ic-graphics.net/images/l/Image-07.jpg
www.ic-graphics.net/images/l/Image-08.jpg
www.ic-graphics.net/images/l/Image-09.jpg

Примерные картинки.
www.ic-graphics.net/images/l/Image-01.bmp
- То, что неплохо бы получить и распознать.
Цитата

воспользуйся например нейронной сетью Хемминга...

=) Подробнее.. я такого не знаю совсем...
  Вверх
Александра
Дата 22.2.2005, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.2.2005
Где: Москва

Репутация: нет
Всего: 12



короче тебе необходимо получить каждую циферку отдельно, т.е. набор картинок, одинакового размера.. далее в режиме обучения грузи их в image1, типа image1.picture.loadfromfile(inttostr(i)+'.bmp'). после того, как сеть обучена, в image2 помешаешь ту картинку (циферку), которую хочешь распознать. алгоритм по их вырезанию, ты уже вроде как сделал. но тут надо учесть, чтобы она максимально приближалась к исходным, т.е. не было смешения (лишних зон), вырезай все по краям и есессно такого же размера.

(данные обучения - InputRow, можно сохранить, например в файл). в результата в iIndex у тебя будет индекс выйгравшего нейрона, т.е. твоя цифра, т.к. при обучения каждый нейрон по порядку мы заполняли цифрой с тем же индексом...

Цитата
=) Подробнее.. я такого не знаю совсем...

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


З.Ы.
http://www.ic-graphics.net/images/l/Image-01.bmp - будет отлично распозновать, главное чтобы цифры всегда были в одной и той же позиции.
--------------------
PM   Вверх
Romtek
Дата 24.2.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 7.12.2004
Где: Холон

Репутация: нет
Всего: 4



С нейронными сетями дело будет глухо. Необходимо хорошее знание высшей математики, Кроме того, изучение их займёт кучу времени.

Действительно, сначала стоит перевести в ч/б картинку, а потом уже распознавать.
--------------------
Romiras HomeLab - материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и пр.
PM WWW   Вверх
Александра
Дата 24.2.2005, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.2.2005
Где: Москва

Репутация: нет
Всего: 12



Romtek
почему же, по последней картинке видно что автор вполне справился с преобразованием в Ч/Б, ну а дальше пример отлично сработает, если цифру грамотно выделять.

а кому интересно, могу сбросить кучи инфы насчет НС, правда в теории только ((
--------------------
PM   Вверх
Julia19
Дата 24.4.2012, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.4.2012

Репутация: нет
Всего: нет



Саша, можно тебя попросить скинуть инфы!!!!
PM MAIL   Вверх
MetalFan
Дата 25.4.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 5
Всего: 128



Julia19, ого... зачем ворошить умершие темы?
А Саша больше года не заходила на форум... что видно из ее профиля.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.