Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Получить 2D изображение из стерео фотографии.

Получить 2D изображение из стерео фотографии.

Поделиться
tmtlibПостоялецwww19 окт. 20178:12#0
Какой способ наиболее оптимален для решения этой задачи? Необходимо получить обычное фото из двух, при этом добиться хотя бы небольшого эффекта super resolution улучшения качества по сравнению с отдельным фото для левого/правого каналов. Если делать карту глубины, 3D, повторное проецирование и т.д. то много лишних телодвижений, и качество результата скорее всего будет не очень. Задача облегчается тем, что наблюдаемый объект находится на расстоянии десятка метров, и отличия между левым/правым кадрами малы, допустимо иметь отночительно большую погрешность в вычислениях.
SuslikМодераторwww19 окт. 20178:18#1
tmtlib
для гуглежа тема называется 3d reconstruction from stereo images. большинство алгоритмов основаны на том, что ты пробегаешься по каждому пикселю одного изображения и ищешь как можно ближе к нему пиксель второго изображения, чтобы у них окрестности почти совпадали. когда находишь, выпускаешь два перспективных луча из каждого глаза, точка их пересечения и будет точкой карты высот, соответствующей этому пикселю. super resolution теоретически можно получить, усреднив их цвета, но я в эту сторону не копал.

Правка: 19 окт. 2017 8:18

tmtlibПостоялецwww19 окт. 20178:58#2
Спасибо Suslik, хорошо объяснил, сразу понятно стало. В этом подходе для меня основная проблема это низкое качество картинки после проецирование из полученного 3D обратно в 2D. Качество получается хуже, чем у двух исходных изображений.
Я тут нашел интересную статью 1993 года https://www.researchgate.net/publication/2672266_Stereoscopic_Ray-Tracing
In  this  paper,  we  describe  a  method  to  create  an approximate  ray-traced  stereoscopic  pair  by transforming  a  fully  ray-traced  left-eye  view  into an  inferred  right-eye  view.      Performance  results from evaluating several random scenes are given which  indicate  that  the  second  view  in  a stereoscopic image can be computed with as little as 5% of the effort required to fully ray-trace the first view.  We also discuss worst case performance of our algorithm, and demonstrate that our technique will always be at least as efficient as two passes of a standard ray-tracer.

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

Пока что думаю сделать так, с учетом твоего разъяснения по выпуску лучей.
1) глубина задается вручную по математической модели. Пол - плоскость. Объект на расстоянии 30 метров - прямоугольник перпендикулярно полу. Известно положение камеры, её наклон. Т.е. карту глубины я хочу сгенерировать. При этом камеру расположить так, чтобы уменьшить перепад высот между прямоугольником и фоном, т.е. камеру расположить повыше, чтобы за объектом не было видно горизонта, а только пол/земля. Чтобы было меньше артифактов на краях.
2) Для каждого пикселя из фото левого глаза пустить луч до известной глубины. Луч попадет либо на плоскость пола, либо на прямугольник, либо в бесконечный фон.
Если было найдено пересечение, то полученная точка проецируется в изображение правого глаза.

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

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

SuslikМодераторwww19 окт. 201710:23#3
tmtlib
здесь вся фишка в том, что в общем случае невозможно найти точно целочисленный пиксель на правом изображении, соответствующий левому изображению, потому что он практически всегда будет где-то между пикселями. поэтому ищут обычно окрестность на правом изображении с нецелыми координатами, которая наиболее точно совпадает с окрестностью на левом. для этого ищут экстремум корреляционной функции вида:
[cht]\vec \Delta*(\vec x) = {\arg \min} \limits_{\vec \Delta}\left(\int_{O(\vec x)}\left(L(\vec x)-R(\vec x+\vec \Delta)\right)^2 ds\right)[/cht]
то есть надо найти такое смещение для каждого пикселя [cht]\vec \Delta^*[/cht], чтобы окрестность [cht]O(\vec x)[/cht] пикселя [cht]\vec x[/cht] как можно лучше совпадала с окрестностью соответствующего пикселя [cht]\vec x + \vec \Delta[/cht] на другом изображении. и вот тогда уже, зная эти окрестности, в общем случае используя какую-нибудь хитрую интерполяцию и усредняя их между собой, можно что-то предпринять. но, повторю, про superresolution тут всё лишь мои догадки, потому что я писал только 3d reconstruction часть.

Правка: 19 окт. 2017 10:27

tmtlibПостоялецwww19 окт. 201710:58#4
спасибо за разъяснения
по поводу super resolution кому интересно здесь очень простое объяснение:
https://www.researchgate.net/publication/277140841_SUPER_RESOLUTI… LUTION_IMAGES
здесь про использование нескольких камер:
http://www.ieice.org/proceedings/ITC-CSCC2008/pdf/p465_A4-5.pdf

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр