Перейти к содержимому
Compvision.ru

Smorodov

Главные администраторы
  • Количество публикаций

    3 873
  • Зарегистрирован

  • Посещение

  • Days Won

    346

Сообщения, опубликованные пользователем Smorodov


  1. Для русского языка, лучшее что я слышал - Liquendo, у них есть Ольга, очень неплохо разговаривает, поддерживает VXML и другие фкустности, работает по описанному выше алгоритму)

    Поправлю опечатку гугл находит "Loquendo".

    Скачать пощупать можно здесь (торрент): http://torrents.ru/forum/viewtopic.php?t=1177463


  2. Про сегментацию страниц на текст/изображение с использованием алгоритма Вороного можно почитать, например, здесь: "On the Application of Voronoi Diagrams to Page Segmentation" (у меня есть файлик, но сервак его залить не дает. могу скинуть на мыло, если интересно. или просто погуглить).

    Спасибо, интересный файлик.

    Вот залил: OnTheApplicationOfVoronoiDiagramsToPageSegmentation.pdf


  3. А MeanShift это что?

    Читал описание функции "GoodFeaturesToTrack", по-моему на этом сайте скачанном.. :)

    А что понимается под сильными угловыми точками и вообще собственными числами?

    Про углы здесь : http://www.compvision.ru/forum/index.php?a...=post&id=87

    Про собственные значения и собственные векторы : http://elib.ispu.ru/library/math/sem1/pyartli1/node79.html


  4. Есть ли вообще какие-то среды разработки для распознавания речи?

    Может даже OpenCV что-то умеет в подобном направлении?

    В принципе распознавание образов, наверное, одно для всех, а основа здесь - это предобработка полученных данных. А дальше уже кластеризировать образы - кто во что горазд :)

    Можно звук в вейвлет, а вейвлет OpenCV скормить. Вообще слышал что для распознавания звуков скрытые марковские модели применяют.


  5. Под такими системами слежения за объектами я понимаю что-то типа такого:

    Причём, "изображение" людей тут пересекаются, при этом система продолжает отлично функционировать и следить.

    Вот ещё понравилось такое видео:

    Система следит за машиной, а когда из неё выходит человек, система следит за обеими объектами :)

    Не очень тут понял, почему система следила именно за этой машиной, когда были и остальные.. походу она следит за всем, что движется или двигалось :)

    Вот ещё наглядное видео с какими-то отмеченными точками на объектах:

    А какими способами достигается подобное?

    Могу предположить, что здесь задействованы оптические потоки. После чего локализуются места где этих "потоков" больше всего - там движется объект. Там где нет потоков (ниже какого-то порога наверное, а то зная качество своей вебки, могу представить, что двигаются там все без исключения пиксели :) ) - соответственно там фон, не движущийся объект..

    Мне думается так:

    1) MeanShift + предположение о том где будет объект после пересечения (исходя их текущего вектора скорости)

    2) Здесь чисто отделение движущихся объектов от статичной фотографии (машины которые не отслеживаюся сфотканы).

    3) MeanShift + оптический поток. Точки - это так называемые GoodFeaturesToTrack или просто "угловые" точки. Используются для разделения объектов в трудных ситуациях.


  6. Я вот могу предложить некоторый алгоритм поиска подобной точки (непосредственно поиска центра).

    Строим решётку по всей плоскости. Расстояния между точками должны быть такими, меньше которого точка у нас не поместилась бы.. Таким образом мы быстро натыкаемся на нашу точку (определяем например по порогу). После того как мы определили любую точку нашего лазера - в разные стороны запускаемся попиксельно (проверяя где пятно==цвет ещё существует). После мы получаем минимум по Х, по У и их максимумы. Делим пополам - получаем центр.

    Интересно, в OpenCV алгоритм оптимальнее? :)

    В качестве развития идеи, в алгоритме можно двигаться не попиксельно, а тоже перепрыгивая через некоторое расстояние. А как хватнули лишнего - так назад на один шаг и попиксельно смотрим где там границу потеряли.

    В OpenCV нет этой функции, это моя реализация, причем достаточно прямолинейная :)

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

    Может так получиться (при определенном диапазоне размеров изображения), что найти координаты ненулевых точек в сплошных блоках памяти будет быстрее чем извлекать отдельные точки, особенно принадлежащие вертикальным линиям.


  7. А результаты работы такого алгоритма где-то можно посмотреть? Интересно насколько хорошо он может текст от изображения отделять.. честно говоря, в такое даже вериться с трудом.. :)

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


  8. А под crust'ом там что имеют ввиду? :)

    Точно не могу сказать, но думаю что это они "потресканную" поверхность так называют (то что коме скелета), переводится как "корка" или "литосфера", видимо из геологии пришло.


  9. А.. ну тогда понятно. Хотя я почему-то так и думал :)

    Кстати, а скомпиленные проги с использованием OpenCV работают под любыми процессорами?

    Под Интелами наверное лучше работают, а так у меня например AMD, слышал, что на процах для наладонников тоже идет.


  10. Боюсь, что в 2009 будет ещё что-нибудь, чего нет в 2006. :)

    Все собралось и подключилось (с либами из этой темы (см. выше), часть на которые он ругался (говорил что нет dll libjasper, libjpeg, libpng и тп.) удалил).

    Поищу завтра как подключить их обратно, а пока вот :)

    screenshot.jpg

    • Like 1

  11. Собственно я и пытался собрать минимальный проект. Сделал копию работающего проекта (я так понимаю он собран на 5 билдере) по настройкам и по файлам. И нифига, та же песня. В принципе 2 проекта с одними и теми же настройками и файлами должны давать одинаковую реакцию на "Run", но тут это не проходит.

    Я не сильно разбираюсь в билдырах, но прикрутить к BDS2006 не удалось не только мне. Кто бросил, кто на VC перешёл, а у меня оснавная часть в студии, без права смены IDE.

    В такие моменты начинает казаться, что из всех людей на земле твой комп ненавидит именно тебя...

    Достают это множество стандартов... Блин как же все на Java легко подключается, а здесь чтобы подключить "легкоподключаемую" библиотеку к программе нужно помучиться больше, чем занимает писанина собственно кода.

    Вопрос, почему эти разработчики сразу не сделали библиотеки по Билдеры? Что это маркетинговая война, типа борладн отстой, а дядя Билли рулит.

    Хочется все-таки рабочего варианта ОпенСВ под студию.

    Да, и.. Ошибка по ходу возникает даже не в программе. Ставлю breakpoint в месте создания форму (тобишь почти что в конструкторе) и она до него не доходит.

    Попробую завтра поставить BDS2009 (еще скачать надо) посмотрю что там не так.


  12. По заливке сложно представить как я буду угадывать - фон это или тело..

    По поводу cvAbsDiff - да это тоже самое, наверное, в принципе.. Только его надо разово применить, а далее обрабатывать полученный массив разниц. В чём отличие этих cv* функций, они быстрее? Я просто смотрю, что много в OpenCV есть таких функций, которые есть, в принципе, везде :) И зачем они их только наделали :) может они быстрее работают, чем возможные мои реализации подобных функций..

    Кстати, сейчас запустил эту программу. Подрегулировал баланс белого - и почти отлично стало!

    Баланс я как регулировал.. Поднял saturation до потолка - так отлично видно как пиксели скачут. И далее поймал такой баланс, где амплитуда скачков минимальна.. ну и вот - уже смотрибельно :) Дырки некоторые есть, но для начала сойдёт!

    Тем более что никакую цель я не преследую сейчас. Исключительно научиться работать с камерой и OpenCV. Да и плюс к тому - я ещё ни HSV не использовал, ни видеоаккумулятор, поэтому всё ещё впереди! А для начала - вполне!

    Да, cv* функции намного быстрее работают, их еще интелловцы оптимизировали на глубоком ассемблере :) (лучше сделать очень сложно), они как раз для однотипных операций над большими объемами данных придуманы.


  13. А как всё это прикрутить к BDS2006? Мучаюсь уже 3 дня. Нифига не выходит. Пробовал на 2-х разных машинах, сделал конвертацию библиотек.

    При запуске выдаёт экран с кодами процессора \ и ошибки 0х00000130.

    Где-то скачал проект с OPENCV, интересно, что сам проект идёт, а создать такой же снуля, скопировав из исходного все сопутствующие файлы, 1 в 1 установил все данные в Options(project), не выходит. Мыстика какая-то.

    Что делать, товарищи знатоки?

    Такие ошибки могут быть реакцией на функцию cvGetSize(), хоть у willowgarage и написано что её можно заставить работать, выставив совместимость с MS VC, но у меня на шестом билдере выдает ошибки лучше использовать cvSize(ширина, высота).

    А вообще надежда есть, там они упоминают BDS2006 : http://opencv.willowgarage.com/wiki/C%2B%2BBuilder

    Посмотрите отладчиком, в какой строке возникает ошибка. Приведите кусок кода.

    PS: Попробуйте собрать самый минимальный проект + убрать вывод на форму (вывод делать в стандартное окно OpenCV).

    PS:PS: Библиотеки вроде должны и с этого форума подходить.


  14. Кстати, попробовал сделать вот так:

    c1 = cvGetAt( bgWithoutFace, i, j );

    c2 = cvGetAt( currentFrame, i, j );

    int dSum = abs( c1.val[ 0 ] - c2.val[ 0 ] ) + abs( c1.val[ 1 ] - c2.val[ 1 ] ) + abs( c1.val[ 2 ] - c2.val[ 2 ] );

    if ( dSum < 30 ) {

    ....

    }

    чё.. весело :) Хотя бы уже что-то. Получаем вырезание себя и вклеивание на фон, только у "себя" дырки в теле частенько появляются внушительных размеров :)

    Может эта команда больше подойдет?: cvAbsDiff

    А дырки и залить можно floodfill есть для этого. Можно заливать фон, где нибудь в углу брать точку и заливать каким-нибудь цветом, а потом что не этим цветом заменить на второй цвет - это и будет тело.


  15. Я, действительно, чистую разницу и смотрел, поэтому ничего и не получил положительного..

    Не понял с "обрубить маску по порогу". А как же обрубить её?

    Честно говоря, не уловил ещё общий ход алгоритма..

    Маска, насколько я понимаю, это разница между фоном и текущим кадром (у которого выровнена гистограма). Маска у нас должна получиться бинарной, правильно? (нули там где разницы нет, еденицы там где она есть).

    А на основе чего же рубить маску? :) Среди бинарной инфы мы ведь не выберем где шум, а где не очень..

    Рубить надо как раз разницу (отсечь то что меньше порога) функцией cvThreshold( gray, gray, Val,255,CV_THRESH_BINARY);

    а не маску. Маска получается после бинаризации (это и есть процесс "обрубания" по порогу) разницы.

    В простейшем случае это делается для каждого канала и получившиеся маски объединяется по "или" командой cvOr, в более сложных случаях необходимо работать с векторами.

    Маска, это бинарное изображение, где интересующие нас участки содержат "1" , а не интересующие "0". Во многих функциях OpenCV, например в cvCopy, есть параметр mask, определяющий, над какими точками производить действие, а какие не трогать.

    Выравнивать гистограмму надо на всех цветовых слоях и у фона и у захваченного изображения, этим можно уменьшить (но не исключить) влияние освещенности.

    Это самый простейший случай.

    Отдельные компоненты цвета могут совпадать у разных цветов.

    Возможное решение - переход на другую цветовую схему, например HSV.

    (насчет необходимости выравнивания гистограммы в данном случае (HSV) сомневаюсь)

    Сделать можно так (фрагмент кода)

    cvCvtColor( rgb_image, hsv_image, CV_BGR2HSV );

    if(!h_plane_obj)

    h_plane_obj = cvCreateImage( cvSize(rgb_image->width,rgb_image->height), 8, 1 );

    if(!s_plane_obj)

    s_plane_obj = cvCreateImage( cvSize(rgb_image->width,rgb_image->height), 8, 1 );

    if(!v_plane_obj)

    v_plane_obj = cvCreateImage( cvSize(rgb_image->width,rgb_image->height), 8, 1 );

    // Выделили память

    // Разобьем hsv по компонентам

    cvCvtPixToPlane( hsv_image, h_plane_obj, s_plane_obj, v_plane_obj, 0 );

    Фрагмент преобразует RGB изображение в HSV и разбивает по цветовым плоскостям.

    Про цветовые схемы смотреть здесь: http://www.mandelbrot-dazibao.com/HSV/HSV.htm

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

    И вот еще кусочек книжки, там про отделение фона: BackGroundSubtraction.pdf


  16. А что такое "выровнять гистограмму"? :) Бинаризировать после вычитания? Вот тут не понял идеи.. По началу я подумал, что изначально оба фрейма бинаризировать (по определённому порогу), а потом сравнивать их. Правда.. рискованная операция :)

    Попробую поработать с видеоаккумулятором.

    PS говорят, что iChat (выше ссылка про 0:24 :) ) работает с любыми вебками. И говорят, что довольно успешно..

    Насчет "выровнять гистограмму" это надо cvEqualizeHist( gray, gray ); сделать.

    Насчет бинаризации после вычитания, идея такая:

    Мир непостоянен, меняется освещенность, тени, электроны в детекторе :), соответственно если смотреть чистую разницу, то получим белый шум малой амплитуды, но тем не менее, мешающий нам создать маску. Если обрубить разность по некоторому порогу, то можно избавиться от большой части мусора.

    Если к этому добавить видеоаккумулятор, то должно получиться не хуже чем iChat.


  17. Ух.. ну так не интересно с фоном! :) Так и я, возможно, смогу.

    Кстати, у него есть исходники какие-то: http://ehci.googlecode.com/files/background.tar.gz (SDL + OpenCV. В линуксе у меня собралось отлично.)

    Тот я и смотрю зачем он по какому-то уровню цвета отделяет, оказывается таким образом он фон отделяет от себя. Это как-то не очень интересно.

    Наверное интереснее даже - себя отделять по цветовому диапазону кожи. Но прийдётся перед камерой позировать голым :)

    А вот видюха ещё интересная:

    на 0:24. Вот тут с (вебки ли?) ищется именно разница фреймов (с человеком и текущим - без него).

    Что там за камера на Макинтошах - понятия не имею.. Но неужели она чем-то особо отличается от обычных вебок? Такие же помехи даёт наверное.. но они как-то справляются с таким алгоритмом - не представляю даже как. Одно дело если камера не жонглирует так пикселями как моя.. :)

    PS CUDA, это обработка вычислений за счёт проца на видюхе? Хорошая вещь должно быть. Только наверное многие пользователи не смогут воспользоваться такой программой. ATI Radeon'щики, невладельцы GeForce ниже 8го поколения.. Не знаю даже, большая ли это группа. :)

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

    Еще один параллельный компилятор для GPU (NVidia выше 5200 и ATI): http://graphics.stanford.edu/projects/brookgpu/lang.html


  18. Кстати, да, а что делает сглаживание? Усредняет точки в пределах определённой окружности?

    Я почему создал эту тему.. Захотел я сделать вот такое:

    ну что там думаю. Алгоритм простейший - найти разницу на двух кадрах - где есть я (текущий кадр с камеры) и где нет меня (фиксированный первый кадр). Фон никуда не движется.

    Ну и фиг там оказалось. Срабатывает где-то в 2% случаев из кадра :) Как ты и видел наверное из темы http://www.compvision.ru/forum/index.php?showtopic=88 - камеру я использую - дай боже.. Качество отвратительное. И видишь как скачут эти пиксели. Естественно их не получится сравнивать попиксельно (как я и сделал при поиске разницы между кадрами).

    Но обрати внимание на то, что у того человека (выше ссылка на ютьюб) изображение (самого человека) - также моргает "попиксельно". Абсолютно также! Но как же он выделил так чётко разницу? :)

    Ну, у того чела все просто. Фон у него синий какой нибудь, а дальше шаблоним голову и фон (по инверсии маски).

    На голове синих точек нет, поэтому легко отделить (даже с плохой камерой). Как будет побольше времени сворганю пример.

    Сейчас связку CUDA+OpenCV+OpenGL пытаюсь соорудить, больно уж заманчиво. Такие фильтры можно делать :)


  19. Какие камеры используют для компьютерного зрения?

    Какие вообще классы камер? Например вот, с веб камерами можно работать? Или они категорически не приемлемы в компьютерном зрении?

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

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

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

    Из недостатков существенно влияющих на качество работы алгоритмов машинного зрения можно отметить:

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

    Думаю что веб-камеры с разрешением 640х480, на настоящий момент, оптимальны для сопряжения с современными компьютерами (для большинства задач).


  20. Это разреженный оптический поток, границы контуров получить не выйдет, Вам нужен плотный ОП (dense optical flow), поэтому я и дал ссылки на CUDA-библиотеки для работы с оптическим потоком. Он такие векторы в каждой точке изображения вычисляет. Как вариант можно рассмотреть использование шаблонов движения .


  21. Запускаю сэмпл facedetect из пакета OpenCV вот так:

    ./facedetect --cascade=../../haarcascades/haarcascade_frontalface_alt2.xml 0

    Помимо моего лица, он находит штуки два на обоях, дверях. Не очень радуют меня эти сбои, покуда есть подозрения, что такие сбои только из-за моей вебкамеры (Logitech QuickCam Communicate Deluxe). Кто-нибудь пробовал работать с этим приложением? Часто ли оно даёт у Вас подобные сбои?

    На самом деле, камера просто отвратительно нечёткая. Вот пример её съёмки: http://rapidshare.de/files/47770677/capture2.avi.html далее я поднимаю насыщенность. Видно что пиксели так и не могут усидеть на месте :) В этом-то и проблема :) Вдруг, если именно по аналогии камера и "создаёт" фейковые лица, что opencv путается постоянно..

    Кстати, а никто не знает ли как там происходит распознавание лица? По одному кадру или анализируются и предыдущие? Если первое - то проблема не в камере, а в алгоритме OpenCV, а если второе.. то вполне возможно, что logitech подвёл своей дорогой, но некачественной камерой.

    С опцией CV_HAAR_FIND_BIGGEST_OBJECT, команда cvHaarDetectObjects находит наибольший по размеру объект проходящий по классификаторам.

    Если хотите избавиться от помех камеры, можно попробовать накапливать кадры, используя видеоаккумулятор, например, так (это фрагмент):

    // Grab - изображение, поступивше с камеры

    if(!gray) {gray = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_8U, 1);}
    if(!gray_f){gray_f = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_32F, 1);}
    if(!accum_f){accum_f = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_32F, 1);}

    cvCvtColor(Grab, gray, CV_BGR2GRAY); // Получаем серый цвет

    cvConvertScale( gray, gray_f);
    // Это усреднитель 0.3 - коэффициент вклада каждого кадра
    cvRunningAvg( gray_f,accum_f,0.3);

    cvConvertScale( accum_f, gray);[/code]

    Что касается распознавания, то используется один кадр (алгоритм Виолы-Джонса (он-же каскады Хаара, правда не совсем)). И еще, точность алгоритма, составляет порядка 80-95% так что ложные срабатывания (в небольшом количестве) допустимы. Для улучшения качества распознавания можно также применять пирамиду cvPyrDown (кажется), хотя я пробовал, эффект не очень заметный. Можно использовать результаты распознавания Хааром, как промежуточный результат для другого метода, например PCA (метод главных компонент (собственные лица) (на форуме есть), нужно правда его тогда подправить), или другим.


  22. Доброго времени суток, господа.

    Как использовать алгоритм Вороного для сегментации изображения на текст и графику?

    Видимо имелось ввиду что то типа этого: Crust and anticrust

    И еще, можете посмотреть по Вороному сайтик интересный: Вороной, то что выше оттуда.


  23. Собсвенно глобальная задача - ориентация автомобиля на дороге.

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

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

    Спасибо.

    Векторы, в разных участках изображения будут направлены в разные стороны, с учетом перспективы. Я бы вычислил оптический поток (только нужен плотный, возможно реализация на CUDA как здесь:

    ),

    затем нашел бы производные от него (см. алгоритмы выделения границ изображения). Объекты скорость которых резко отличается от скорости окружающего фона (скорость соседних точек которого отличается слабо), будут выделены.

    Библиотеку для этого можно скачать здесь: LKCuda

    Здесь тоже что то на эту тему: CUDA + OpenCV


  24. Довольно медленно получается у первого ролика распознавать жесты (по сравнению с другими распознаваниями, типа
    ). Или потому что у этого жестов больше..

    Интересно, удобно ли рукой управлять компьютером? Есть ли перспектива у таких методов управления...

    Во втором - это находится средняя/скелет у контурной фигуры?

    Я не знаю как он рассчитывает во втором ролике, но подозреваю что там ищется несколько конечных точек (голова и ладони), и вместе с расчетом обратной кинематики (на которую наложены ограничения по подвижности суставов), получается довольно точно.

    Насчет управления компом при помощи жестов, мне кажется это удобно лишь в небольшом количестве специальных случаев.

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

×