VironZizu 2 Report post Posted September 2, 2014 Спасибо Smorodov, тоже нашел уже!) Смотрю на примерах С++ работают с внутренними и внешними контурами через hierarchy, но блин в враппере нету такого параметра у этого метода, хотя параметр ContourRetrieval.CComp для чего то же сделали!? в общем всю голову сломал с этими контурами уже) Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 2, 2014 Ну вот тут вроде ответ: http://stackoverflow.com/questions/15555615/equivalent-of-hierarchy-in-emgu 1 Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 3, 2014 В общем ход такой, практически всё лишнее нормально удаляется с помощью контуров! 1)Но вариант с точки зрения адаптивности не очень хорош, так как параметры задаются в ручную и если допустим в паспорте попадется нужный мне текст с шрифтом размеров с мелкий шрифт ("Дата выдачи" и тд), то он тоже замажется, что не очень хорошо. 2) Потом есть еще не приятный момент, на некоторых паспортах нужные надписи налазиют на "Дата выдачи" и тд, тоже не понятно как в таких случаях поступать... 3) Бывает печать налазиет на "Дата выдачи" и тд и получается что контур увеличивается и эта клякса остается По хорошему нужно ещё запустить дополнительный уровень проверок, но каких именно, есть идеи?) по цвету? по геометрическому расположению? 1 Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 4, 2014 Ребят, что это за алгоритм такой адовый, вот сижу смотрю и ума не приложу как он отрабатывает!? даже кавычку не тронул)) мой сносит всё подряд, похоже на Dilate, но точно не он, так бы все подряд уменьшил!Может у вас какие догадки есть? а то уже час в эту картинку впяливаюсь)) Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 4, 2014 А что алгоритм скушал? Только бинаризованное изображение, приведенное сверху? Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 4, 2014 Smorodov ну изначально на вход идет цветное изображение! Думаете они через цвет взаимодействовали? Как они так все помехи по убирали и при это даже те помехи которые на буквы наложились! Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 5, 2014 Рискну предположить, что там использовалась какая-нибудь сегментация, а не просто бинаризация. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 5, 2014 Рискну предположить, что там использовалась какая-нибудь сегментация, а не просто бинаризация. А можно по подробней? про сегментацию!) Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 5, 2014 Уже приводился в теме пример с cv::EM. Также можно k-means использовать. На вход этим сегментаторам подавать, например, яркость и цвет (из того же HSL или HSV) пространства. Тогда должны попиксельно выделиться именно части текста. 1 Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 5, 2014 Можно обучить две многокомпонентные модели, одну на фон, другую на текст. likelihood = em_model.predict( sample )[0]; Будет выдавать значение функции правдоподобия модели для данного пикселя. У какой модели правдоподобие больше, тот класс пикселю и присваивается. Для обучения нужно самому ручками отметить текст и фон (например бинарной маской). При обучении одной модели скармливать только пиксели фона, другой модели только пиксели текста. Как он это разобьет на кластеры уже не так важно, важно количество кластеров, думаю 2-5 кластеров на каждый класс, разумный интервал для тестирования. Реализацию обучения нескольких классов можно посмотреть в примере points_classifier.cpp строчка 465. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 7, 2014 с k-means довелось немного по играться, благо был пример в врапере. Собственно удалось картинку отчистить, получаю только нужный текст. Тут всплыла очередная проблема) Tesseract отлично получает изображения слов, но очень плохо делит слова на буквы, особенно если эти буквы "слипшиеся" , так вот, есть какой нибудь алгоритм деления слова на буквы!? Может у OpenCV что-нибудь есть? Читал блог Abby на хабре, но там все к сожалению в очень размытых чертах описано... Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 7, 2014 Можно попробовать посчитать гистограммы как здесь показано: http://stackoverflow.com/questions/12764624/word-segmentation-using-opencv Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 8, 2014 По делил буквы средствами того же tesseract, результат ужастный, вернее делит то хорошо, но распознает потом эти символы просто убого... не знаю с какой ещё стороны к нему подойти Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 8, 2014 Может обучить свою нейронную сеть, на распознавание букв и цифр? Шрифт - то ведь стандартный. Здесь есть пример: http://www.compvision.ru/forum/index.php?showtopic=1552 (пост №6, второй спойлер) Да вроде как и tesseract можно учить (не работал с ним, но вроде видел упоминания). Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 9, 2014 Может обучить свою нейронную сеть, на распознавание букв и цифр? Шрифт - то ведь стандартный. Здесь есть пример: http://www.compvision.ru/forum/index.php?showtopic=1552 (пост №6, второй спойлер) Да вроде как и tesseract можно учить (не работал с ним, но вроде видел упоминания). Обучать свою нейронную сеть получится слишком долго по времени, решил попробовать обучить tesseract, скачал jtesseract, правда пока не могу разобраться с ним)) з.ы. Кстати шрифт нифига не одинаковый)) Я чем больше смотрю на паспорта, тем больше удивляюсь, какие они все разные)) Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 10, 2014 Опыта по обучению tesseract ни у кого нет?) Share this post Link to post Share on other sites
mrgloom 242 Report post Posted September 12, 2014 Ничего не сказано про: 1. изменяется ли масштаб при сканировании паспорта. 2. возможен ли поворот. 3. разные ли сканеры и какого разрешения скан. и т.д. самые тупой метод это взять паспорт и отсканировать его полностью так чтобы можно было найти потом прямоугольные края, зная края, и заранее зная примерное положение областей вырезать эти области и работать с ними отдельно. Потом для каждой области фильтровать медианным фильтром, делать локальную бинаризацию, искать блобы\контуры и фильтровать по размеру(выкинуть мусор). Потом если считать что каждая буква отдельный блоб, то можно распознавать каждую букву отдельно сравнением контуров, но обычно буквы слипшиеся, обгрызанные или с прилипшим мусором, поэтому надо использовать какое то машинное обучение. примерно http://habrahabr.ru/post/123395/ еще можно погуглить по "opencv ocr" Share this post Link to post Share on other sites
mrgloom 242 Report post Posted September 12, 2014 Интересно как они делают шаг "Удаление шума"? Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 12, 2014 Интересно как они делают шаг "Удаление шума"? Вполне может быть что-то типа swt. Я бы ещё посмотел на результат всяких медианных и билатеральных фильтров на этом паспорте. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 13, 2014 Можно еще попробовать в частотной области поэкспериментировать (в спектре Фурье), фоновый рисунок где-то примерно на одной частоте. Может удастся его выковырять удалив участки спектра. Ну вот что то типа такого: http://stackoverflow.com/questions/20531110/removing-pattern-and-noise-in-an-image-using-fft-in-matlab или вот: http://www.fmwconcepts.com/misc_tests/FFT_tests/ 1 Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 16, 2014 Ничего не сказано про: 1. изменяется ли масштаб при сканировании паспорта. 2. возможен ли поворот. 3. разные ли сканеры и какого разрешения скан. и т.д. самые тупой метод это взять паспорт и отсканировать его полностью так чтобы можно было найти потом прямоугольные края, зная края, и заранее зная примерное положение областей вырезать эти области и работать с ними отдельно. Потом для каждой области фильтровать медианным фильтром, делать локальную бинаризацию, искать блобы\контуры и фильтровать по размеру(выкинуть мусор). Потом если считать что каждая буква отдельный блоб, то можно распознавать каждую букву отдельно сравнением контуров, но обычно буквы слипшиеся, обгрызанные или с прилипшим мусором, поэтому надо использовать какое то машинное обучение. примерноhttp://habrahabr.ru/post/123395/ еще можно погуглить по "opencv ocr" 1) масштаб не меняется, все сканится с разрешением 300dpi 2) поворот пока не рассматриваю, пытаюсь сделать для идеального варианта! 3) сканеры примерно одной серии в идеале у них будут схожие настройки, в общем отталкиваемся от того что сканеры одинаковые!) Остановился на том, что выдаю впринципе нормальное бинаризованное изображение с нужным текстом в tesseract, сейчас главная проблема - не распознается должным образом слипшийся текст! Пытался его разделять средствами того же tesseract а потом распозновать по одной букве с опцией PageSegMode.SingleChar но результаты стали даже хуже чем при переводе всего текста разом! И вот здесь у меня полное замешательство, куда двигаться дальше!? Толи пытаться обучить tesseract распознованию слипшегося текста, но не факт что у него это получится, толи писать свой алгоритм разделения слова на буквы, но тут опять же не факт распознает ли tesseract по одной букве, даже идеально выделенной, судя по моему примеру предыдущему тоже далеко не факт... Интересно как они делают шаг "Удаление шума"? Тоже очень интересно, выше писал такой же вопрос) з.ы. форум так преобразился, что у меня аж пост стерся)) Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 17, 2014 Эмм... извиняюсь, что режу по живому, но сейчас все должно работать. Больше так не буду . Решил апгрейд сделать к 10000-му посту. ЗЫ: рейтинги никуда не пропали, просто я их еще не вывел наружу (подумаю как не разломать ими весь дезигн Может и не буду этого делать, тут лайки есть ). Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 17, 2014 1. Думаю, что разделение слипшегося текстта надо делать своё. Можешь по быстрому попробовать этот вариант: http://opencv-code.com/tutorials/count-and-segment-overlapping-objects-with-watershed-and-distance-transform/#more-476 2. В качестве распознавалки отдельных символов я голосую за самостоятельно обученный классиификатор, не tesseract. 3. Думаю, что в рассматриваемом примере по удалению шума авторы несколько лукавят: вряд ли итоговая картинка получается из той предыдущей. Мне всё таки кажется, что они использоовали больше информации. Как бы я сделал: выделил точно прямооугольникии с текстом (это несложно), а уже после делал сегментацию текста от фона только внутри этих прямоугольников. Точность бинаризации при таком подходе увеличится в разы. Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 17, 2014 P.S. По новому дизайну сайта: нравится. Но не хватает двух вещей: 1. возможности правки сообщения; 2. гиперссылки, которая отображается не полностью как вся длиннющая ссылка, а в виде пользовательского текста. Может, я просто не нашёл, как сделать эти две вещи. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 17, 2014 Оффтоп, конечно, потом удалю или перенесу. Я сам пока разбираюсь с новой версией форума. Управление своими темами добавил. Ссылки вставляются в редакторе кнопкой в тулбаре. Выделяется текст, нажимается кнопка, вводится url и получается вот так: Compvision.ru . 1 Share this post Link to post Share on other sites