Вопрос по android, image-processing, geometry, raytracing, opengl-es – Сферический фильтр в Android

5

Я должен применить сферический фильтр к изображению в Android, я приложил вход и ожидаемое выходное изображение. Выходное изображение будет обработано из квадрата по центру области входного изображения и сопоставлено с сферой. Любая идея, как это сделать в Android. Придется ли мне использовать openGL для этого, или 2D-трансформация сама сделает эту задачу.

Input image
Output Image

Ваш Ответ

4   ответа
2

Линза "Рыбий глаз" для создания сферы и применения некоторых модификаций для масштабирования сферы и генерации фона, он будет работать в основном для квадратных изображений.

0

скорее всего, вам здесь даже не поможет, так как OpenGL не предоставляет 3D на основе лучей. Тем не менее, это может быть то, что вы ищете.

http://www1.cs.columbia.edu/CAVE/publications/pdfs/Garg_TR04.pdf

Пример не-трассировки - это то, о чем я писал (я уверен) !!! Тем не менее, другим способом сделать это (даже если фон является текстурой) можно использовать трассировку лучей.
Я не думаю, что это обязательно трудная проблема трассировки лучей, при условии, что фон - это просто текстура. Вы можете просто привязать текстуру к сфере с помощью некоторой сферической системы координат или кубической карты. Если бы он отражал динамическую 3D-сцену, я бы с вами согласился, но просто отразить текстуру не так уж сложно.
"OpenGL не предоставляет 3D на основе лучей" - это определенно можно при использовании шейдеров. Я сделал искажение, близкое к этому, используя шейдер OpenGL ES 2.0:stackoverflow.com/a/9896856/19679 и GLSL даже определяетrefract() функция преломления света через объекты. Позвольте мне посмотреть, смогу ли я создать шейдер для воспроизведения этого конкретного эффекта.
ОК, я наконец собрал фрагментный шейдер OpenGL ES 2.0 для этого. Результаты можно увидеть в моем ответе, и они очень близки к приведенному выше образцу изображения. Там может быть немного прозрачности, которой у меня нет, но это можно добавить с помощью простой настройки.refract() Функция GLSL справляется с большинством тяжелых работ здесь.
Очень хорошая информация :-) Я не думаю, что это делает фактическую трассировку лучей. Это довольно хорошо известно, что видеокарты еще не могут выполнять трассировку лучей, это то место, куда они хотели бы пойти, и они действительно близки к трассировке лучей в реальном времени, но пока еще не получили. Эти фильтры искажения являются математическим приближением к эффекту. Отличная ссылка, выглядит забавно, и, возможно, что-то близкое - именно то, что нужно этому пользователю :-)
0

гое не требует ни 3d-точек, ни трассировки лучей, забудьте об этом, просто 2d. Я не знаю, есть ли в OpenGL что-то встроенное, но у меня достаточно опыта в 3D, чтобы указать вам правильное направление. Вы должны перебрать все точки внутри * области круга, которую вы выбираете * это ключ, и найти цвет с помощью преобразования FISH-EYE. У тебя много в сети. надеюсь это поможет

Человек & apos; В приведенном примере показано зеркальное отражение, преломление и истинная круговая граница с водой / стеклом и т. д. ... Даже если вы посмотрите на ссылку, предоставленную Брэдом Ларсоном (отличная ссылка между прочим +1), края на круговой границе гладкие переход к самому изображению. Это эффект, НЕ ОБЯЗАТЕЛЬНО того, о чем просит этот пользователь. Если приведенное выше изображение действительно то, что они ищут, то оно может быть немного сложнее, чем немного более простые функции типа шейдера. Однако не получил много слов от спрашивающего об их интерпретации ???
4

2.0 на iOS:

Spherical refraction example

Хотя это на iOS, фрагментный шейдер, который я использовал, может быть перенесен прямо на Android. Сферическая рефракционная часть выполняется с использованием следующего фрагментного шейдера:

 varying highp vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;

 uniform highp vec2 center;
 uniform highp float radius;
 uniform highp float aspectRatio;
 uniform highp float refractiveIndex;

 void main()
 {
     highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio));
     highp float distanceFromCenter = distance(center, textureCoordinateToUse);
     lowp float checkForPresenceWithinSphere = step(distanceFromCenter, radius);

     distanceFromCenter = distanceFromCenter / radius;

     highp float normalizedDepth = radius * sqrt(1.0 - distanceFromCenter * distanceFromCenter);
     highp vec3 sphereNormal = normalize(vec3(textureCoordinateToUse - center, normalizedDepth));

     highp vec3 refractedVector = refract(vec3(0.0, 0.0, -1.0), sphereNormal, refractiveIndex);

     gl_FragColor = texture2D(inputImageTexture, (refractedVector.xy + 1.0) * 0.5) * checkForPresenceWithinSphere;     
 }

center является нормализованной координатой для центра сферы (из пространства 0,0 - 1,0 в обоих измерениях),radius является нормализованным радиусом, тоrefractiveIndex является индексом воздуха / материала вашей сферы, аaspectRatio это соотношение сторон изображения (чтобы убедиться, что сфера круглая, а не эллиптическая в нормализованном координатном пространстве).

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

Фон размыт с помощью разделяемого размытия по Гауссу, которое я описываю вэтот ответ.

Этот фильтр достаточно быстрый, чтобы фильтровать видео в реальном времени на iPhone, поэтому он должен быть достаточно производительным на большинстве устройств Android. Исходный код для этого может быть найден в GPUImageSphereRefractionFilter в моем открытом исходном кодеGPUImage фреймворк.

Я использовал это в openGL, и он работал отлично. Однако у меня возникают проблемы с пониманием математики. При вычислении y textureCoordinateToUse я понимаю, почему аспектное соотношение умножается, но зачем нужны остальные вычисления?

Похожие вопросы