2012-06-07 21 views
5

我必须在Android中的图像上应用球形滤波器,我已经附加了输入和期望的输出图像。输出图像将从输入图像的平方中心区域处理并映射到球体。任何想法如何在Android中做到这一点。我将不得不使用openGL来做到这一点,否则2D转换将会完成这项任务。在android中的球形滤波器

Input image
Output Image

回答

2

下面的代码Fish Eye lens创建球体并应用一些修改来缩放球体和背景生成,它将主要用于方形图像。

0

这是一个光线跟踪问题。由于OpenGL不提供基于3D的光线,因此OpenGL很可能不会对您有所帮助。但是,这可能是你正在寻找的。

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

+0

假如背景只是一个纹理,我认为它不一定是一个困难的光线跟踪问题。您可以将纹理映射到具有某种球面坐标系或立方体贴图的球体上。如果他反映了一个动态的3D场景,我会同意你的看法,但仅仅反映一个纹理并不是太困难。 – Tim

+0

非光线追踪的例子就是我提供的纸是关于(我很确定)!另一种做法(即使背景是纹理)仍然可以使用光线追踪。 – trumpetlicks

+2

“OpenGL不提供基于射线的3D” - 使用着色器时绝对可以。我使用OpenGL ES 2.0着色器完成了接近此的变形:http://stackoverflow.com/a/9896856/19679 GLSL甚至为通过对象的光线折射定义了一个'refract()'函数。让我看看是否可以创建着色器来复制此特定效果。 –

0

我同意添。将一个位图转换为另一个不需要3d点,也不需要Ray-trace,根本就不用它,它只是简单的2D。我不知道opengl是否有内置的东西,但是我有足够的3D经验来指引你正确的方向。你必须遍历你选择的* circle区域内的所有点*这是线索,并使用FISH-EYE变换找到颜色。网上有很多东西。 希望这有助于

+0

该人显示的例子显示了镜面反射,折射以及与水/玻璃等结合的真实圆形。即使您查看Brad Larson提供的链接(按照+1的方式进行链接),边缘在圆形边界处平滑过渡回到图像本身。这是一种效果,而不是这个用户要求的东西。如果上面的图像真的是他们正在寻找的东西,那么它可能会稍微复杂一些,比较简单的着色器类型函数。没有从提问者那里得到很多关于他们的解释的话? – trumpetlicks

4

我刚刚得到的这个iOS上使用OpenGL ES 2.0工作的落实:

Spherical refraction example

虽然这是iOS上,我使用的片段着色器可以直接跨越到Android提出。中,radius是归一化的半径 -

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是归一化坐标为球体的中心(1.0在两个维度从0.0的空间):球面折射部分是使用以下片段着色器来实现,refractiveIndex是球体的空气/材料指数,aspectRatio是图像的高宽比(用于确保球体在标准坐标空间中是圆的而不是椭圆的)。

这会计算具有提供的中心和半径的球体的曲面法线,并使用GLSL函数折射传入的矢量并在图像纹理中提供查找坐标。

使用我在this answer中描述的可分离高斯模糊来模糊背景。

此过滤器足够快,可以在iPhone上实时过滤实时视频,因此它应该在大多数Android设备上都能够很好地执行。它的源代码可以在我的开源GPUImage框架中的GPUImageSphereRefractionFilter中找到。

+0

我在openGL中使用了它,它完美地工作。但是我无法理解数学。在计算y textureCoordinateToUse时,我明白为什么aspectRatio会相乘,但为什么需要其余的计算呢? – tanvi