![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Andrewshkovskii |
![]()
Сообщение
#1
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Суть такая : есть эталонная картинка с символом, пользователь в поле ввода, рисует свой символ, после чего, программа должна распознать введенный символ и указать процент вероятности.
вот примерно вот как Здесь или тут. Интерфейс я прикрутил, рисовалку сделал. Но есть одна мне не понятная штука , вот первый шаг алгоритма : Цитата Шаг 1. [Преобразование символов] Шаблоны распознаваемых M символов разбивают на растровые картинки размером 30х30. В том случае, если на ячейку накладывается символ, ей приписывают единицу, в противном случае - ноль (см. рис. 2). Допустим, у меня есть QPixmap размером 231х231, из него я получаю QImage(что бы можно было получить доступ к пикселам) такого же размера. Но тут встает вопрос..как делить картинку на растры 30х30? В смысле, определить цвет-то то я смогу (для того, что бы узнать, находиться символ в растре или нет) , а вот как поделить и отрисовать пиксельную сетку, при учете, что изображение шириной и высотой 231 будет всего 7 полных квадратов 30х30... ![]() Прикладываю методичку к посту.. Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Я бы сделал так: берем QPicture размером 240*240 (чтоб на 30 нацело делилось), тогда каждый "пиксель" распознаваемого изображения будет отображаться на таком QPicture участком 8*8, правда? Это 64 реальных пикселя. Ну, и считай, сколько пикселей черного цвета попало в эту область из 64-х возможных. Больше половины - значит в матрицу заносишь 1... Меньше - значит ноль... Ну, или какое другое соотношение возьми, не обязательно 50/50.
На Дельфи программка-то написана из методички ![]() |
Andrewshkovskii |
![]()
Сообщение
#3
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Ну не QPicture ты имел ввиду,а QImage, наверное?
![]() |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата т.е в каких координатах из отрисовывать Бррр... Мы по-моему с тобой на разных языках говорим... Чего тебе отрисовывать-то надо? Сделал 2 одинаковых изображения, одно (которое означено на первом скриншоте) "Сетка пикселей эталонов символов" нарезал квадратиками 8*8. Что тебе еще отрисовывать?А, ну да, пиксель изображения с координатами (x, y) принадлежит ячейке - квадратику, связанному с матрицей, как угодно назови, суть от этого не меняется - с индексами [x/8, y/8] |
Andrewshkovskii |
![]()
Сообщение
#5
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Я понимаю, что начинаю опять тебя злить..Но я пытаюсь разобраться
![]() Под отрисовкой, я имел ввиду сетку пикселей, там же не одинаковое изображение а преобразованное в некую бинарную матрицу, где 0 - это белый квадратик, 1 - черный. Так вот, имеет оно(сетка пикселей) , такой же размер, что и исходное изображение(эталон). Берем последовательно квадраты от этого изображения ,стороны которого равны QImage.width()/30. Проверяем их на наличия черных пикселей и если процент заполнения >= порогу, тогда мы рисуем этот пиксел на изображении Сетка пикселей. Я правильно понимаю? Но вот как мне соотнести координата квадрата который прошел валидацию и координату того пикселя, который отображать будет этот квадрат? Или я не так думаю?Может сначала надо построить матрицу, и от матрицы плясать? |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
В общем, рисует пользователь изображение на QImage. Потом делаешь что угодно, накладываешь сверху сетку, это твои проблемы, как ты реализуешь это, главное - то, что нарисовал пользователь - измениться не должно, QImage неприкасаем!!! А матрица сама строится так:
// image = это тот самый QImage, в котором картинка, нарисованная пользователемВсе, в таблице либо 0 либо 1 в зависимости от того, сколько пикселей попало в соотв. область рисунка... А уже после построения матрицы ее раскладываешь в массив, и так далее. |
Andrewshkovskii |
![]()
Сообщение
#7
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Ну я вообще говорил про то, что как строить пиксельную сетку из матрицы ?
Умножать индекс элемента на 8, и это будет координата пикселя? Только вот у меня проблема в том, что цвета какие-то странные дает pixel(int x,int y) у QImage,а точнее, их там более 30 разных возвращает.. Ведь pixel() возвращает QRgb, что есть тайпдеф для unsigned int , и почему-то их там много очень получается. а должно , по-логике , быть 2.. ![]() И из-за этого матрица будет вся в нулях. Рисую-то я вот так
Upd : Добавил исходники... Сообщение отредактировано: Andrewshkovskii - 8.12.2009 19:53 Прикрепленные файлы ![]() |
Andrewshkovskii |
![]()
Сообщение
#8
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
"Эмпирическим".. путем я попытался найти значение для черного цвета..ну, не знаю, насколько это правильно, но вроде нашел - 4278190080 .только вот забавно как он это дело отображает..
Вот код, как я это в модельку все "пихаю." и вывожу .. : void recognizer::getEtalonArray(QImage image) вот что для буквы 'А' ![]() Т.е повернуто на 90 градусов в лево и 2йка откуда-то берутся ![]() Сообщение отредактировано: volvo - 23.11.2010 13:44 |
Andrewshkovskii |
![]()
Сообщение
#9
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Почему появилась 2ой - понял, из-за
matrix[i/8][j/8]+=(image.pixel(i,j), и видимо он проходит по каким-то координатам дважды.. а вот почему перевернуто.. |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата Т.е повернуто на 90 градусов в лево ![]() for(int i = 0; i < image.width(); i++), индексы местами попутал... А двойка - потому как 64/32 = 2. Увеличь value до 33, тогда не будет ничего кроме 0 и 1. |
Andrewshkovskii |
![]()
Сообщение
#11
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
хех..Понятно..Спасибо.но вот мой основной вопрос, который снедает меня словно старческий недуг
Цитата Ну я вообще говорил про то, что как строить пиксельную сетку из матрицы ? Умножать индекс элемента на 8, и это будет координата пикселя? я правильно понял, про умножение? |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Почему ты рассматриваешь только один пиксель? Если тебе надо из матрицы получить изображение в натуральную величину (30*30 пикселей) - то ты знаешь, что надо делать: индекс = координата пикселя. Если же надо из 30*30 получить 240*240, то элементу с индексами [i][j] соответствуют пиксели
(8*i .. 8*i + 7, 8*j .. 8*j + 7) |
Andrewshkovskii |
![]()
Сообщение
#13
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
А почему.. +7, тоесть это какая-то переменная от 0 до 7, я так понимаю?Извини, что достаю уже, но я пытаюсь разобраться,а не в глупую переписывать..
|
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Ну, потому, что если индекс = 0, то у нас пикселы 0 .. 7, index = 1 -> пикселы 8 .. 15, и так далее. То есть, фактически от index*8 до (index+1)*8 - 1. Открой скобки, что получишь?
|
Andrewshkovskii |
![]()
Сообщение
#15
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Хм..ну верно, ага, спасибо!
|
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Так... Прочитал я, как ты прокомментировал код из сообщения №8, и что-то мне кажется, что ты не до конца понимаешь, что там происходит...
Итак, вот тот же фрагмент, но с моими комментариями: // почему ты избавляешься от константности - непонятно. У меня наоборотОбрати внимание, как проверяется цвет. Лучше не завязываться на "магические числа"... |
Andrewshkovskii |
![]()
Сообщение
#17
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Ну единственное что было не понятно, так это почему цвет не определялся, не думал, что так можно преобразовать. Спасибо...А про деление было очевидно, комментарий просто не так записал. Дописал распознавание, забавно..
![]() |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 7:57 |