Мне нужно применить сферический фильтр к изображению в Android, я прикрепил входное и ожидаемое выходное изображение. Выходное изображение будет обработано из квадратной центрированной области входного изображения и сопоставлено с сферой. Любая идея, как это сделать в Android. Придется ли мне использовать openGL для этого или только 2D-трансформация решит эту задачу.
Сферический фильтр в андроиде
Ответы (4)
следующий код объектив Fish Eye для создания Сфера и применить некоторые модификации для масштабирования сферы и генерации фона, это будет работать в основном для квадратных изображений.
Я только что получил реализацию этой работы с использованием OpenGL ES 2.0 на iOS:
Пока это на 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
— это аспект соотношение изображения (чтобы убедиться, что сфера круглая, а не эллиптическая в нормализованном координатном пространстве).
Это вычисляет нормали поверхности для сферы с предоставленным центром и радиусом и использует функцию GLSL refract()
для преломления входящего вектора и предоставления координат поиска в текстуре изображения.
Фон размыт с помощью разделяемого размытия по Гауссу, которое я описываю в этом ответе.
Этот фильтр достаточно быстр, чтобы фильтровать живое видео в режиме реального времени на iPhone, поэтому он должен работать достаточно эффективно на большинстве устройств Android. Исходный код для него можно найти в GPUImageSphereRefractionFilter в моем фреймворке GPUImage с открытым исходным кодом.
Это проблема трассировки лучей. OpenGL, скорее всего, даже не поможет вам здесь, поскольку OpenGL не обеспечивает 3D на основе лучей. Тем не менее, это может быть то, что вы ищете.
http://www1.cs.columbia.edu/CAVE/publications/pdfs/Garg_TR04.pdf
refract()
для преломления света через объекты. Позвольте мне посмотреть, смогу ли я создать шейдер для воспроизведения этого конкретного эффекта.
- person Brad Larson; 09.06.2012
refract()
GLSL выполняет здесь большую часть тяжелой работы.
- person Brad Larson; 09.07.2012
Я согласен с Тимом. Преобразование одного растрового изображения в другое не требует ни 3D-точек, ни трассировки лучей, вообще забудьте об этом, это просто 2D. Я не знаю, есть ли в opengl что-то встроенное, но у меня достаточно опыта работы с 3D, чтобы указать вам правильное направление. Вы должны перебрать все точки внутри * выбранной области круга * это подсказка и найти цвет с помощью преобразования РЫБИЙ ГЛАЗ. Вас много в сети. надеюсь это поможет