LINUX.ORG.RU

Построение 3D поверхности по 2D изображению

 ,


1

2

Пытаюсь навелосипедить такую вот вот штуку, ну или такую. Выделение точек для отслеживания легко реализовать при помощи средств, встроенных в OpenCV(goodFeaturesToTrack). Но вот как построить поверхность 2-го порядка, я ума не приложу. Точки, как можно наблюдать на видео, разбросаны не очень информативно(нет точек которые характеризуют конкретно глаза, нос и тд ), т.е. диаметр цилиндра, например, получить не удастся. Собственно вопрос, как построить эту поверхность, как выбрать начало координат. И ещё, можно обратить внимание на то, что на втором видео некоторые точки принадлежат поверхности, а некоторые на неё спроецированы. Какие точки проецировать, а через какие точки эту поверхность проводить?

★★★

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

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Хаар, насколько мне известно, только матчит лицо в фас, стоит чуть-чуть повернуться - и начинаются проблемы. А точки трекить при передвижении головы я думал при помощью Лукаса — Канаде. А ransac, как я понял, просто подбирает оптимальную форму этой самой поверхности 2-го порядка. Я в ручную выбрал цилиндр, а сейчас стоит задача преобразования 2d точек в 3d. Есть функция posit, но в тех примерах, которые я встречал, 3d точки ставятся 2d точкам в ручную, для видео это не подходит.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

1) ну если будет «спиной стоять» то не распознает. он просто довольно затратный что бы каждый кадр успевать распознавать.

2) Если из того что есть: Хаар дал квадрат лица --- Хаар дал два глаза и нос--- начали трекать глаза и нос и пихать в позит

если из мирового_опытаТМ, то «структуре предикшен» в которой заложена «форма лица» и которую надо велосипедить самому, со всеми вытекающими подробностями :(

вот например раму велосипеда фитят http://tiberiocaetano.com/iccv_tutorial/ 28 слайд первой части

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Я пробовал хаар для глаз и носа, так вот, стоит хотяб чуть-чуть повернутся - и он их не видит. Форма лица - это следующий шаг. Сейчас я условно считаю, что голова имеет форму цилиндра, это вполне допустимое предположение. Про позит можно по подробнее?

LIKAN ★★★
() автор топика

О круто, я маюсь тем же. Вообще я представлял себе, что нужно натравить Хаара с четырех сторон.

Erfinder
()
Ответ на: комментарий от Erfinder

Фас и два профиля, а ещё какая сторона? Знаете, судя по анализу ли-ры и того, что люди ты youtube выкладывают, самое простое и эффективное решение это klt+цилиндр.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Собственно вид сверху и снизу) Я же тоже не профессионал. Вообще у меня есть мысль зайти в irc opencv и спросить там.

Erfinder
()
Ответ на: комментарий от LIKAN

ха, там куча примеров появилась

http://www.morethantechnical.com/2010/03/19/quick-and-easy-head-pose-estimati...

http://xuvif.blogspot.com/2011/05/head-pose-estimation-by-using-posit-in.html

они что то даже допилили именно для лица http://docs.opencv.org/modules/contrib/doc/facerec/index.html

с другой стороны они похоже «убили кени» --- перехрерачили структуру сайта :( я не нахожу позита вообще :)

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Первые две ссылки я уже видел (я наверное весь код, что более менее легко гуглится пересмотрел). Так вот, там человек руками забивает соотвествие между 2д и 3д координатами. 3д координаты берутся из 3-х мерной модели головы. И да, там люди в ручную опять таки отметчают уши глаза, нос. Как вы понимаете - это не серьезно. А второе - это мануал по Хаару и ещё по трем встроенным в OpenVC методам, которые можно обучать на разные дискретные классы человеческих мордочек. (Ну там мальчики-девочки, или профиль-фас, с этим я уже поигрался сам) Тоже для трекинга головы под произвольными углами не подходит. Единственное адекватное, что я нашел - это позит

LIKAN ★★★
() автор топика
Ответ на: комментарий от Erfinder

Да, оно. И как видите, нам откуда-то надо взять координаты точек лица в 3-х мерном пространстве. Так как лицо мерять дело крайне муторное, существуеют всякие аппроксимации, описывающие лицо, как поверхность 1-го или 2-го порядка. Т е мы можем считать, что наше лицо - плоское как блин т е третья координата, которой нет на 2-х мерном кадре - это константа (ну до того момента, как человек смотрит прямо, как только поворачивается, начинаются системы линейных и не очень уравнений, матрицы перехода, экшен, кровь и кишки) Ну или можно считать, то человеческих фейс (а точней вся голова) например описыва цилиндром, там уже координату z считать придеться.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

хотите «не в ручную» остается перебор этого самого «solvePnP was used in order to calculate fundamental matrix that can be used to map 3D points in model to 2D point in images» со всеми точками кандидатами

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

Поэтому (раз речь о видеопотоке) ну пусть Хаар ошибется сколько то там раз, всегда ведь позит ответит насколько он качественно вписался в предложенное начальное приближение и плавно потом двигается? Ну получится что то типа «фильтра частиц» «все потенциальные головы в видеопотоке» рано или поздно «фальшивые головы» отвалятся :)

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

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

http://answers.opencv.org/question/418/heavy-shearing-effects-using-hartleys/...

Может накопив таких «стереопар» кадров побольше можно накопить поверхность движущегося объекта в pcl

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Мм, так как в распознавании изображений я, мягко говоря недавно, я бы пошел наиболее простым путем, предложенным, как я понимаю во втром абзаце. Хаар использовать на все лицо или с его помощью выделять глаза, рот, нос? Про позит и «все потенциальные головы в видеопотоке» я, честно говоря не понял вообще. Позит принимает на вход 2d точки, предполагаемо соответсвующие им 3d и фокально расстояние камеры, а возвращает матрицы сдвига и поворота. Как его для аппроксимации-то использовать?

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

1) Вначале Хаар на всё лицо естественно

2) Поток состоит из кадров, на каждом из которых обычный Хаар ищет «лицо», найденные «лица» (их «прямоугольники») «матчатся» через особые точки в соседние кадры потока (там хранить немного надо, так что нагрузка не большая). Получается два источника информации о положении лиц в потоке кадров --- Хаар текущего кадра и трекинг области когда то сработавшей на Хаар. Чем чаще совпадает, тем вероятнее что этот прямоугольник именно «лицо». Наверное придется настроить некий порог срабатывания.

3) Внутри прямоугольника найти «глаза» и «уши». Или «структурное предсказание» (ссылка на лекцию). Или внутри найденных «областей лица» предыдущего этапа (тоже в соседних кадрах) --- Хаар «правое ухо», «левое ухо», «глаз» (глаза искать проще http://docs.opencv.org/trunk/doc/py_tutorials/py_objdetect/py_face_detection/...), «нос». А позит постоянно фитится во все варианты и выбирает наиболее удачный фит (вернее сумму ошибок фита) по серии соседних кадров. Это в принципе повторяет частично «в ручном режиме» то что делает «структурное предсказание».

Основное, всегда когда один раз «уверенно» что то удалось найти, то начинается простой трекинг по ключевым точкам взятым из ближайших предыдущих кадров (было несколько таких примеров в инете, где идет трекинг за выбранной пользователем области экрана). С неё и надо начинать. А для всей истории кадров вести историю где какую область задетектило в текущем кадре или «экспоненциальный след» детекта на ближайших соседних кадрах. Тогда вполне какой нибудь рандом форест будет помогать принимать решения...

psv1967 ★★★★★
()
Ответ на: комментарий от Erfinder

Там по моему нет проективной геометрии вообще, это просто конвертилка координат? Основная проблема «I'm not sure where you'll be getting your 3D z-coordinate, ...» --- то есть нужна быстрая цепочка «3д цилиндр модели - 3д хуz - фокальная проекция» и обратная ей оптимизация некой невязки много раз гоняющая прямую цепочку с перебираемыми параметрами «3д цилиндра модели». Начальное приближение и диапазон перебора параметров берется от предыдущего успешного фита.

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Так, через весь этот мануал красной нитью идет трекинг точек. Я для этого использую Лукаса-Канаде - и точки трекятся, мягко говоря, не очень. Точки могут гулять по всему лицу.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

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

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

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

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

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

обычно в демках примеров хвастаются именно поворотом отслеживаемого объекта, которое не сохраняет исходных точек.

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

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

То есть вы предлагаете вообще отказаться от Лукаса-Канаде, и каждый раз на новом кадре искать ключевые точки? Ок, тогда каким образом это делать, так как goodFeaturesToTrack, которым я до сих пор пользовался, даже на одном и том же кадре определяет разные наборы точек.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

1) Есть прямоугольник интереса (выделенный или вручную, или Хааром) выделенный на кадре №1. Только в этом прямоугольнике находят годные точки. Их матчат во кадре №2, и вписывают наилучшим образом исходный прямоугольник (как в примере при сшивке панорамы).

Содержимое «найденного» прямоугольника кадра №2 становиться источником нового набора годных точек.

2) поскольку у нас последовательность кадров, то имеет смысл искать найденный прямоугольник в неком наборе кадров следующих за кадром из которого извлечены ключевые точки рекурсивным образом. Лучше всего если с помощью какой то разумной схемы типа Калмана, или фильтра частиц или т.п.

PS Только не говорите что это не понятно :) Я уже устал третий раз одно и тоже писать.

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Я выше отписался, что в распознавании, мягко выражаясь, недавно. У меня нет гуру, лекций мне на эту тематику не читали. Я каждый день стараюсь расширить сови познания, читая различные статьи в сети, но делаю это несколько бессистемно. Я очень благодарен вам за ваше терпение и помощь, но если честно у меня не сформировалось четкой картины. Постараюсь детально описать, то что мне удалось осознать, но сначала поставлю цель. Цель - определение положения головы в 3-х мерном пространстве, то есть мне нужна матрица сдвига и матрица поворота относительно некоторой начальной точки. За начало отсчета я беру фас лица в центре кадра. В предлагаете в первом кадре выделить прямоугольник лица и внутри этого прямоугольник отметить несколько точек. Далее, следующий кадр, человек повернул лицо на определенный угол. Потом идут варианты. Если алгоритм трекинга точек сработал хорошо, и точка, которая в первом кадер оказалась на кончике носа, и во втором кадре осталась на кончике носа, и то же самое произошло со всеми остальнымим точками, то мы просто запихиваем старые координаты кончика носа и новые в posit, и получаем нужные матрицы. Вариант второй, точка которая была на кончике носа в первом кадре, оказалась на верхней губе во втором. PS Из ваших ответов, я так понял, вы пыталсиь мне объяснить, как лучше всего искать лицо, но мне нужно немножко другое, не только искать, но и получать вот эти вот матрицы. Или я вас опять не правильно понял?

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

1) совершенно не поняли :(

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

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

ну и внутри области интереса так мало точек, что можно уже фитить напрямую проекцию модели головы со всеми нужными «ушами». сделать это со всем кадром не получиться.

3) см. Построение 3D поверхности по 2D изображению (комментарий)

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Так, я потихоньку начинаю осознавать, в чем кроется причина моего непонимания. Я не знаком с вероятностными методами трекинга. То, что вы мне предлагаете, очень мне напоминает краткое описание собственно этих самых фильтров частиц (или Кальмана). Я нахожусь в процессе осознавания принципов этих алгоритмов. Но меня очень настораживает пара фраз. Первая, это

Вот область на следующем кадре куда была с помощью точек вписана область с предыдущего кадра опять обладает ценностью и её опять можно использовать для извлечения особых точек. чем больше кадров между областями, тем слабее вероятность того что особые точки сохраняться.
Что такое «область»? Это прямоугольник (или другая 2д геом фигура) с четко заданными параметрами и положением относительно начала координат? Что значит область «вписана» в другую область. Зачем прямогольник с одного кадра вписывать в прямоугольник с другого? Или область, это, например, нос? Тогда непонятно, как мы поймём, где на следующем кадре нос, да и как эти носы друг в друга вписывать? Вторая фраза
ну и внутри области интереса так мало точек, что можно уже фитить напрямую проекцию модели головы со всеми нужными «ушами». сделать это со всем кадром не получиться.
Это мне напомнило фильтр частиц, где от итерации к итерации выделяются точки с наибольшим весом, до тех пор пока они не будут хорошо описывать модель (ну косвенно их стане «мало»). При чем тут весь кадр?

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

а меня как настораживает :)

bounding box и confidence level for detected object это основные и понятия, и параметры, что тут может быть «непонятно»?

например LatentSvmDetector::detect даёт rectangular regions (множество найденных bounding box) in the given image that are likely to contain objects of loaded classes (models) and corresponding confidence levels.

и у bounding box естественно есть координаты. найденный bounding box мы используем что бы извлечь из него GoodFeaturesToTrack , по той простой причине что просто уделаемся успеть обучить по bounding box новую модель даже имея суперкомп --- у нас просто нет статистики данного объекта пока мы его не посмотрим несколько минут как минимум.

на извлеченных точках первого кадра мы применяем DescriptorMatcher::match и получаем где на следующих кадрах (ба, да его теперь уже смотрю «гвоздями прибили» к такому использованию сразу на куче кадров :) ) находится наш исходный bounding box (и всё таки его лучше не тупо обвести minAreaRect, а уточнить проекцией исходной области функциями вот отсюда http://docs.opencv.org/modules/stitching/doc/stitching.html хотя может и так сойдёт). после согласования «взаимоположения» bounding box на последовательности кадров существенно уменьшается ошибка определения его положения. каждый раз из следующего bounding box извлекаются оптимальные для ближайших кадров GoodFeatures и поэтому процесс намного устойчивее.

(все это нужно только потому что любые методы ML будут давать своеобразные «кей фреймы» с предполагаемыми положениями лиц только раз в несколько секунд при применении к кадру «в целом» + неизбежно с существенной задержкой. и потому между этими опорными кадрами, а во многом и дополняя их работает обычный трекинг (по хорошему вся информация о вероятности положения bounding box нужного объекта полученного разными методами объединяется Калманом или фильтром частиц))

в принципе следить за прямоугольником теперь целая готовая подсистема у них есть http://en.wikipedia.org/wiki/Phase_correlation

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Так, я не оставляю попыток понять вашу мысль. В предлагаете с помощью шаблонов или хаара,например, найти нос на кадре 1, обвести прямоуголником, на прямогульнике заключающем в себе нос, найти характерные точки с помощью GoodFeaturesToTrack. Потом отматчить эти же точки при помощи match на кадр 2, по ним построить прямоугольник (или фигуру) содержащую нос. Потом точки удалить, снова на этой фигуре запустить GoodFeaturesToTrack отматчить их на кадр 3 и так далее. Теперь я уразумел?

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

почти правильно.

маленькая поправка --- матчат точки с текущего носа на _нескольких_ _последовательных_ последующих кадрах. чем дальше от кадра донора точек матчат, тем меньший вес (помимо веса назначенного матчером) получает результат (в общем случае результатЫ, поскольку на одном кадре может быть найдено несколько «носов»). Эта процедура применяется рекурсивно --- на каждом текущем кадре будет скопление зон «носа» от предыдущих кадров с произведениями «весов расстояния» «в кадрах» от кадра «донора ключевых точек» на вес уверенности для найденной области от матчера.

для придания этому процессу большей «структурности» «истинную область» ведет от кадра к кадру по этой информации один из статистических фильтров (частиц или Калман).

для построения таких серий кадров в библиотеке есть структуры соответствующие — с них собственно и начинается каждое руководство по опецв :)

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

psv1967 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.