LINUX.ORG.RU

Разогнуть кадры

 , , , ,


0

1

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

Поясню что имею в виду под изменением размеров: устанавливаем камеру на штатив, смотрим на какой-то статичный объект, вращаем камеру вокруг оси Z, в разных участках матрицы размер объект будет различен.

Поразмыслив ещё немного я пришел к выводу, что дело всё в том, что на края матрицы влезает меньше изображения, самый большой угол видимости расположен в центре. Это легко подтверждается следующим опытом: ставим камеру на штатив, смотрим на неподвжный объект, вращаем камеру вокруг Z, объект будет двигаться (проекция на матрицу) по следующей траектории. Вообще это несколько контринтуитивно учитывая загнутые вниз линии на скрине раннее. Полагаю, что дело в перспективных искажениях, т.е. меньший охват краями матрицы (обусловненный оптикой/формой матрицы и подобными факторами) компенсируется перспективными искажениями (в углах объекты дальше, значит они более маленькие, это с запасом компенсирует особенности оптики и загибает линии на первом снимке).

Ну и главный вопрос - как разогнуть кадры не на статичном а на группе кадров со вращающейся камерой, чтобы предметы имели одинаковые размеры? Если правильно всё понимаю, то это состояние, когда в тесте с вращением камеры объект будет иметь траектории в виде прямой линии. А кадр после обработки будет растянут в центральной части (т.е. на статичном первом снимке линии загнутся ещё сильнее к центру).

Как это сделать правильно? У меня были надежды на lensfun, там есть target_geomerty=fisheye_orthographic, звучит подходяще, но на деле все режимы работают одинаково и разгибают линии с первого снимка, мне нужно другое. Правда коэффиценты для lensfun я выводил сам, моей камеры нет в базе, может что-то не заполнил для возможности гнуть разными способами.

Пока в голову приходит вывести ещё раз коэффиценты самому, но для случая с вращающейся камерой.

Какие есть мысли/опыт по этому вопросу? Инфа для моей камеры из lensfun базы (можно ли заюзать их для моего кейса, чтобы не выводить новые?):

        <cropfactor>5.62</cropfactor>
        <calibration>
            <distortion model="ptlens" focal="24" a="0.00328" b="-0.03471" c="0.01753"/>
        </calibration>

Ты же уже спрашивал.

Перспективные искажения не компенсируются. Минимизировать их можно, используя длиннофокусные объективы, но тогда угол зрения будет минимальным.

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

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

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

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

От перспективных искажений уйти не хочу, мне нужен одинаковый размер об объекта на всех участках матрицы (при вращении камерой).

От перспективных искажений ты уйти не хочешь, но хочешь уйти от перспективных искажений. Я понял :-)

Чтобы объект имел одинаковы размер при перемещении по матрице, он должен иметь одинаковое расстояние до матрицы. При вращении камеры такого не происходит.

Полагаю, что решить проблему в корне должна матрица со сферической матрицей

Разворачивать-то ты её потом всё равно будешь на плоский монитор. Я поэтому сразу и предложил попробовать какую-нибудь проекцию, но перспектива будет смешная. Потренируйся на статических кадрах, возьми для начала простую цилиндрическую проекцию — если такое тебя устроит, то удачи.

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

От перспективных искажений ты уйти не хочешь, но хочешь уйти от перспективных искажений. Я понял :-) Чтобы объект имел одинаковы размер при перемещении по матрице, он должен иметь одинаковое расстояние до матрицы. При вращении камеры такого не происходит.

Ты меня не понял. Я вот о чем, камера смотрит на прямоугольный стол, камера перемещаться не пожет, только вращаться. Я не хочу a==b, я хочу чтобы a==a и b==b при любых поворотах камеры (т.е. я тупо беру линейку и измеряю расстояние приложив к монитору). Перспективными скажениями я объяснял почему видно это, хотя матрица на своей периферии увеличивает, логично на первый взгляд, что линии должны быть загнутыми вверх. А бороться я с ними не хочу, просто это контринтуитивно и сбивает с толку в начале

Разворачивать-то ты её потом всё равно будешь на плоский монитор.

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

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

Я не хочу a==b, я хочу чтобы a==a и b==b при любых поворотах камеры

То есть ты не хочешь просто перспективную проекцию, ты хочешь некую ортопроекцию.

Третий раз говорю — поставь хугин, попробуй, если тебя устроит результат, да ради бога. Там несколько вариантов проекции, не надо вот прям сразу велосипедить :-)

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

Третий раз говорю — поставь хугин, попробуй, если тебя устроит результат, да ради бога. Там несколько вариантов проекции, не надо вот прям сразу велосипедить :-)

ок, спасибо, посмотрю. Он же вроде панорамы создаёт? Ну по идее должен уметь приводить кадры к какому-то «прямому» состоянию, иначе как их собрать. Правда не знаю насколько будет удобным в нём конвертнуть несколько сотена кадров

kvpfs_2
() автор топика
Ответ на: комментарий от ya-betmen

Ну не знаю, вообще как-то сложно, или нет? У меня не совсем cgi сейчас, мне нужно на реальную сцену наложить маску, вместо неё всунуть сцену на зеленом фоне. На реальной сцене камера вертится (делал это грамотно, медленно, без блёра, камеру двигали шаговые двигателя). Это получается, что нужно будет создать маску в 3д мире (плоскость), и писать её на 3д камеру, потом использовать как маску в композиторе. Ну может быть стоит попытаться, может удастся без танцев перенести характеристики моей камеру на 3д камеру

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

как-то сложно, или нет?

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

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)