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

Smorodov

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

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

  • Посещение

  • Days Won

    346

Все публикации пользователя Smorodov

  1. Как прикрутить OpenCV к билдеру?

    Пока могу сюда перенаправить: http://www.qtcentre.org/forum/f-qt-program...tion-11655.html
  2. Может эта команда больше подойдет?: cvAbsDiff А дырки и залить можно floodfill есть для этого. Можно заливать фон, где нибудь в углу брать точку и заливать каким-нибудь цветом, а потом что не этим цветом заменить на второй цвет - это и будет тело.
  3. Рубить надо как раз разницу (отсечь то что меньше порога) функцией 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
  4. Насчет "выровнять гистограмму" это надо cvEqualizeHist( gray, gray ); сделать. Насчет бинаризации после вычитания, идея такая: Мир непостоянен, меняется освещенность, тени, электроны в детекторе , соответственно если смотреть чистую разницу, то получим белый шум малой амплитуды, но тем не менее, мешающий нам создать маску. Если обрубить разность по некоторому порогу, то можно избавиться от большой части мусора. Если к этому добавить видеоаккумулятор, то должно получиться не хуже чем iChat.
  5. У меня возникло предположение, что нужно бы яркость и цвета корректировать, гистограмму например ровнять , и потом после вычитания бинаризировать. Правда, если фон не очень отличается от Вас по цвету - будут дырки. Работать лучше через видеоаккумулятор (точек и др. помех намного меньше будет). Еще один параллельный компилятор для GPU (NVidia выше 5200 и ATI): http://graphics.stanford.edu/projects/brookgpu/lang.html
  6. Ну, у того чела все просто. Фон у него синий какой нибудь, а дальше шаблоним голову и фон (по инверсии маски). На голове синих точек нет, поэтому легко отделить (даже с плохой камерой). Как будет побольше времени сворганю пример. Сейчас связку CUDA+OpenCV+OpenGL пытаюсь соорудить, больно уж заманчиво. Такие фильтры можно делать
  7. Под каждую задачу свои требования, но определенные зависимости есть: Чем выше разрешение, тем выше качество изображения и , следовательно больше информации надо переваривать программе. В некоторых задачах это необходимо, но большое количество систем машинного зрения в таких случаях обходится анализом фотографий, сделанных цифровым фотоаппаратом. Во многих случаях, для улучшения качества работы алгоритмов, изображение сглаживается, так зачем тогда высокое разрешение (в разумных пределах)? Из недостатков существенно влияющих на качество работы алгоритмов машинного зрения можно отметить: Мешает шум (особенно при малом разрешении), и плохая контрастность (разрешение по цвету), в некоторых случаях, мешает также, маленькая частота кадров при малой освещенности (не существенно в промышленных применениях, так как освещенность там, как правило, настроена оптимально). Думаю что веб-камеры с разрешением 640х480, на настоящий момент, оптимальны для сопряжения с современными компьютерами (для большинства задач).
  8. распознавание движушегося фона

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

    С опцией 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 (метод главных компонент (собственные лица) (на форуме есть), нужно правда его тогда подправить), или другим.
  10. Алгоритм Вороного

    Видимо имелось ввиду что то типа этого: Crust and anticrust И еще, можете посмотреть по Вороному сайтик интересный: Вороной, то что выше оттуда.
  11. распознавание движушегося фона

    Векторы, в разных участках изображения будут направлены в разные стороны, с учетом перспективы. Я бы вычислил оптический поток (только нужен плотный, возможно реализация на CUDA как здесь: ), затем нашел бы производные от него (см. алгоритмы выделения границ изображения). Объекты скорость которых резко отличается от скорости окружающего фона (скорость соседних точек которого отличается слабо), будут выделены. Библиотеку для этого можно скачать здесь: LKCuda Здесь тоже что то на эту тему: CUDA + OpenCV
  12. Я не знаю как он рассчитывает во втором ролике, но подозреваю что там ищется несколько конечных точек (голова и ладони), и вместе с расчетом обратной кинематики (на которую наложены ограничения по подвижности суставов), получается довольно точно. Насчет управления компом при помощи жестов, мне кажется это удобно лишь в небольшом количестве специальных случаев. То же что и с сенсорными кнопками, не очень удобно (без тактильной обратной связи), но в ряде случаев без них не обойдешься.
  13. В OpenCV пока не пробовал такое делать, хотя подозреваю что все инструменты для этого там есть. Не знаю поможет ли, но вот материальчик по распознаванию человека по подписи: SignRecognition_engl_.pdf Еще статейка (распознавание рукописных формул): http://stephane.lavirotte.com/research/bib...ll-etal1999.pdf Генетический алгоритм распознавания рукописных чисел: http://www.ppgia.pucpr.br/~soares/download/sibgrapi01-ga.pdf Еще пара подходов: http://w3.gel.ulaval.ca/~mbusque/reports/artmap_digit.pdf
  14. Результат моих экспериментов по определению координат глаз (эксперименты продолжаются) Архив с проектом: FaceDetect2.rar
  15. Белый бордюр не знаю зачем, это у Интел надо спрашивать, долго мучился с этим, не мог понять, почему моменты неправильно ищет. Контуры в OpenCV задаются цепями Фримана (это последовательность команд такая вверх, вверх-влево, влево,... и т.д.), работать с этим не удобно. Аппроксимация нужна чтобы получить координаты границы контура в виде последовательности точек p(x,y), которые можно потом линией соединить, и получится граница контура (полигон). параметры функции аппроксиматора задают с какой погрешностью допустимо это сделать. CvSeq - аналог класса Vector в c++ CvSeqReader - это что то похожее на итераторы класса Vector в c++ Офиц. руководство
  16. И еще ролик, там как раз с контурами работают А здесь тоже круто
  17. Ну тогда PCA, или HMM, стороны ладони различить трудно будет в любом случае, мы же не знаем, какая рука показывается.
  18. А не влияет масштаб Поправил картинку выше.
  19. Пришлось напрячь художественные способности и повторить шедевр
  20. Картинка с другого моего сайта (старого) (думаю с цифрами получится) Повороты не имеют значения. Правда и 6 от 9 тоже не отличить Цифры означают степень различия, насколько я помню. Красятся в красный или зеленый по порогу (у красного человечика пропорции другие, а зеленые - клоны повернутые).
  21. Ну, если руки не выворачивать, то я думаю и без разворота можно обойтись А если выворачивать, то вписывать в эллипс и разворачивать ориентируясь на большую ось (на самом деле на ось инерции фигуры). Или использовать момент товарища Ху ему без разницы угол и масштаб, ему форма важна.
  22. Есть некоторая информация здесь: http://www.zone1.de/PocketPC/OpenCV.html там писание сборки для eMbedded Visual C++ 4.0 и пример приложения. У меня пока руки не дошли. Если кто пробовал, отпишитесь пожалуйста.
  23. Хочу предупредить, что методы PCA и HMM чувствительны к повороту и к тому же выловленную картинку придется масштабировать в некий стандартный размер. Я еще про моменты Ху ( Hu moments ) забыл, они не имеют зависимости от масштаба и поворота, а характеризуют именно форму контура. В офиц. руководстве (от Интел) это есть. Для таких вещей как анализ контура во втором случае идеально подходит. На форуме еще примеры по контурам были. (Определение похожести контуров). Камеры высокого разрешения, конечно хорошо, но не нужно забывать и о потоке обрабатываемой информации. Чем больше разрешение - тем больше задержки по времени, и от этого меньше точность алгоритмов завязанных на скорость поступления видеоданных, например "шаблоны движения" или "оптический поток". В тех роликах, я думаю, применяется разрешение 640х480, таких камер уже достаточно много. И скорость работы приемлемая. У меня такая на Asus EEE установлена, OpenCv притормаживает, но в целом сносно работает. ЗЫ: Там (в ролике) фон динамический, есть разница
  24. Что то это очень очень напоминает метод главных компонент или, в простонародье, principal component analysis (PCA) Пример здесь Хотя скрытые марковские модели (по английски HMM (для google)) наверное надежнее будут. Пример здесь Мне еще вот это нравится: а это уже деформируемые модели, родственные жадным змеям, но только сложнее малость.
  25. Поиск точки от лазерной указки

    В этом случае все предельно просто, после бинаризации остается лишь пятно от указки, оно ярче всего остального. А дальше алгоритм который вписывает набор точек в эллипс, эта часть есть в переведенной части руководства (нахождение осей и их наклон). Наклон тут не нужен, а центр можно найти через расчет моментов инерции этого пятна. См. начиная со стр.12 этого документа: CV_Руководство.pdf
×