Jump to content
Compvision.ru
Sign in to follow this  
alex

3D реконструкция

Recommended Posts

Библиотеки AAMlibrary, ASMlibrary и STASM написаны с использованием OpenCV. И,естественно, понимают IplImage. Так что все равно будете писать программу на основе opencv :)

Share this post


Link to post
Share on other sites

Одна из книг, на которую почти все ссылаются когда речь идет о геометрии в машинном зрении:

Multiple View Geometry in computer vision Авторы Richard Hartley и Andrew Zisserman

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

Share this post


Link to post
Share on other sites

Знаю что для Ламбертовых поверхностей строят, сам не пробовал.

Вот, например: http://www.loria.fr/~kerautre/publications/Braquelaire05.pdf

Share this post


Link to post
Share on other sites

Извиняюсь, Ваше исходное сообщение попортил.

а есть такое чтобы например идет человек с камерой и строится ЗД сцена по этому видео.

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

вроде бы было еще даже 3д модель головы человека по видео.

SFM это называется или Structure From Motion.

Библиотеки в тему:

fvision

libmv

По поводу ламбертовых поверхностей:

Ламберта закон (Lambert's cosine law)

Яркость L рассеивающей свет (диффузной) поверхности одинакова во всех направлениях, а сила света, излучаемого плоской рассеивающей площадкой dS в каком-либо направлении, зависит от угла α между этим направлением и перпендикуляром к dS: Iα = I0cosα. Последнее выражение означает, что сила света плоской поверхности максимальна (I0) по нормали к ней и, убывая с ростом α, становится равной нулю в касательных к поверхности направлениях. Такая схема идеального рассеяния света очень удобна для теоретических исследований.

Ламбертова поверхность (Lambertian surface)

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

Например гипсовые фигуры. Преимущественно матовые поверхности равномерно рассеивающие свет.

Share this post


Link to post
Share on other sites

вот кстати прям с видео карта глубины.

хотя там не понятно в реальном времени ли это и просто ли с видео.

Structure From Motion я вроде бы даже смотрел как раз про восстановление города по фотографиям в поинт клауд, но там это все обрабатывалось на кластере, интересно есть ли что то ближе к реальному времени.

по сути получается как склейка панорамы - допустим ведем камеру и нам не надо смотреть сопоставления дескрипторов все против всех, а можно только соседние изображения, только вот вопрос в том, что если мы например столб обходим и обошли 360 градусов, то эту ситуацию надо как то обработать, а тут уже получается надо все против всех смотреть(хотя бы как то быстро отметать, да и даже учитывая, что можно придумать быстрый алгоритм отсева(или хорошую структуру как их хранить) и все точки дескрипторов у нас просчитывались на каждом шаге, то их все таки надо хранить\читать с диска что накладывает ограничения)

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

вообщем меня больше интересует вопрос насколько реально отсняв камерой(для простоты считаем, что каждый кадр фотография) помещение допустим получить потом его 3Д модель? или натренировать на особый класс объектов, т.е. получить с видео например 3д модель объекта, который на этом видео двигался.

p.s. да и кстати я так и не понял как побороть Radial distortion т.е. с искажениями Sift/surf плохо работает.

Share this post


Link to post
Share on other sites

Да, у Kinect идет еще один слой данных - глубина.

Share this post


Link to post
Share on other sites

Я так понял, что Вам нужна модель для AAM. Но тогда вопрос, какую библиотеку используете? Если ту, что я прикрепил сверху напишите e-mail, я отправлю модель. Не прикрепил, т.к. она большая (около 40 Мб, если память не подводит).

Хочу поиграться с AAM_src.rar линк на данные на лицо не кините ?

Share this post


Link to post
Share on other sites

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

aamlibrary_release_2.0.zip

В нем есть все необходимое для построения моделей (см. папку example) в ней уже есть екзешник для построения модели (данные в папке image) build.exe (run-build.bat). И детектор fit.exe (run-fit.bat). Build-ом строите модель (файл с расширением .amf) и скармливаете его детектору. Впрочем, там по содержимому bat файла не сложно разобраться (при том есть еще и исходники обоих экзешников).

Share this post


Link to post
Share on other sites

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

aamlibrary_release_2.0.zip

В нем есть все необходимое для построения моделей (см. папку example) в ней уже есть екзешник для построения модели (данные в папке image) build.exe (run-build.bat). И детектор fit.exe (run-fit.bat). Build-ом строите модель (файл с расширением .amf) и скармливаете его детектору. Впрочем, там по содержимому bat файла не сложно разобраться (при том есть еще и исходники обоих экзешников).

Благодарствую. Поигрался с AAM и ASM точность откровенно хромает.

Как вы думаете с каким методом стоит бороться дабы точность возросла ?

Или есть мне неведомые альтернативы ?

Нужны контрольные точки. Скорость не критична.

Share this post


Link to post
Share on other sites

AAM потенциально мощнее, но реализация его в данном исходнике не самая лучшая. Что касается направления куда смотреть, то я думаю в сторону 3D ASM/AAM (по фотографии, но с использованием трехмерных моделей), плюс не нужно забывать о каскадах Хаара, фильтрации по цвету и других методах Template matching, например. Ни один метод отдельно, на сегодняшний день, не даст необходимой точности.

Можете еще пару продуктов посмотреть:

Здесь есть скачиваемый бесплатно код (не открытый и с ограничениями):

http://www.seeingmachines.com/product/faceapi/

и одна из передовых фирм в этой области (тут видео можно посмотреть, демка есть в меню Try Live - примерка очков)

http://www.t-immersion.com/

  • Like 1

Share this post


Link to post
Share on other sites

Я игрался с востановлением карты глубины по двум изображениям. Хочу поделиться результатами.

В опенсв есть 2 функции: FindStereoCorrespondenceBM и cvFindStereoCorrespondenceGC

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

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

Вот код на питоне:

import cv


L=cv.LoadImage("l.jpg",0)

R=cv.LoadImage("r.jpg",0)


size = (L.width, L.height)


disparity = cv.CreateImage( size, cv.IPL_DEPTH_32F, 1)

dLeft = cv.CreateImage( size, cv.IPL_DEPTH_16S, 1)

dRight = cv.CreateImage( size, cv.IPL_DEPTH_16S, 1)



Hleft = cv.CreateImage( size, cv.IPL_DEPTH_8U, 1)

Hright = cv.CreateImage( size, cv.IPL_DEPTH_8U, 1)


print "calculation started", time.ctime()


state = cv.CreateStereoGCState(128, 100)

cv.FindStereoCorrespondenceGC(L, R, dLeft, dRight, state, False)


print "calculation complited", time.ctime()


cv.ShowImage("L", L)

cv.ShowImage("R", R)


cv.AddWeighted(dRight, 2, dRight, 0, 0, dRight)

cv.AddWeighted(dLeft, -2, dLeft, 0, 0, dLeft) 


cv.ConvertScale(dLeft, Hleft)

cv.ConvertScale(dRight, Hright)


cv.ShowImage("Disparity Left", Hleft)

cv.ShowImage("Disparity Right", Hright)


cv.SaveImage("Hleft.jpg", Hleft)

cv.SaveImage("Hright.jpg", Hright)


cv.WaitKey(5000)

Расчет на одном ядре занял около 10 минут. Это наилучший результат, которого я смог добиться

Экспериментально нужно подобрать параметры функции cv.CreateStereoGCState(128, 100)

post-2009-0-99490900-1316286153_thumb.jp

  • Like 1

Share this post


Link to post
Share on other sites

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

Соорудил конструкцию из двух камер, получаю карту глубины с помощью Semi-global block matching алгоритма, все хорошо. Использую Point CLoud Library пока что просто для вывода облака точек, кстати проверял расстояние меряет довольно точно - на реальном расстоянии в 2 метра погрешность была 5 см. :)

Расчитываю с помощью визуальной одометрии матрицу поворота+переноса из предыдущего кадра в текущий. Теперь проблема. Хочу строить 3д карту помещения, просто вращая свою установку и не могу понять как сюда привязать одометрию и регистрацию облаков точек.

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

Помогите люди добрые разобраться, бьюсь 4 месяца уже.

Share this post


Link to post
Share on other sites

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

не знаю можно ли использовать "плоские" дескрипторы просто с изображений, но вроде в PCL есть 3Д дескрипторы, хотя может это не в тему.

если не использовать дескрипторы то имеем 2 облака точек и их можно наложить друг на друга через ICP алгоритм, он тоже есть в PCL.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×