2012-06-07 3 views
5

안드로이드의 이미지에 구형 필터를 적용해야하므로 입력 및 예상 출력 이미지가 첨부되어 있습니다. 출력 이미지는 입력 이미지의 중심에있는 제곱 영역에서 처리되어 구형으로 매핑됩니다. 안드로이드에서 어떻게하는지 모든 아이디어. 이 작업을 수행하기 위해 OpenGL을 사용해야하거나 2D-trasformation만으로 작업을 수행 할 수 있습니까? Output Image안드로이드의 구형 필터

답변

2

구형을 만들고 구체 및 배경 생성을 조정하기 위해 다음과 같은 코드 Fish Eye lens을 수정하면 대개 정사각형 이미지에 사용할 수 있습니다.

0

Input image

는 광선 추적 문제입니다. OpenGL은 광선 기반 3D를 제공하지 않으므로 OpenGL은 여기에서도 도움이되지 않습니다. 그러나, 이것은 당신이 찾고있는 것일 수 있습니다.

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

+0

배경이 텍스처 일 경우 필연적으로 어려운 raytracing 문제라고 생각하지 않습니다. 일종의 구형 좌표계 또는 큐브 맵을 사용하여 텍스처를 구에 매핑 할 수 있습니다. 그가 역동적 인 3D 장면을 반영했다면 나는 당신과 동의 하겠지만 텍스처를 반영하는 것만으로는 그리 어렵지 않습니다. – Tim

+0

비 광선 추적 예제는 내가 제공 한 문서가 (임 꽤 확실하다) !!! 배경을 텍스처로 사용해도이를 수행하는 또 다른 방법은 여전히 ​​레이 트레이싱을 사용할 수 있습니다. – trumpetlicks

+2

"OpenGL은 ray 기반 3D를 제공하지 않습니다."- 셰이더를 사용할 때 가장 확실하게 할 수 있습니다.저는 OpenGL ES 2.0 쉐이더를 사용하여 이것에 가까운 왜곡을했습니다 : http://stackoverflow.com/a/9896856/19679 그리고 GLSL은 객체를 통한 빛 굴절을위한'refract()'함수를 정의합니다. 이 특정 효과를 복제하는 셰이더를 만들 수 있는지 보겠습니다. –

0

나는 팀에 동의합니다. 하나의 비트 맵을 다른 비트 맵으로 변환하는 데는 3d 포인트가 필요하지 않으며 Ray-trace도 필요하지 않습니다. 간단히 말해서 2 차원입니다. OpenGL에 무언가가 내장되어 있는지 모르겠지만 올바른 방향으로 당신을 가리 키기에 충분한 3D 경험이 있습니다. 당신이 선택한 * circle 영역 안의 모든 점들을 반복해야합니다 * 이것은 단서이며 FISH-EYE 변환을 사용하여 색상을 찾습니다. 당신은 그물에 충분히 있어요. 도움이 되길 바란다

+0

그 사람의 그림은 정반사, 굴절, 물/유리 등의 원형 고리를 보여줍니다. Brad Larson이 제공하는 링크 (위대한 링크 +1)를 보면, 순환 경계에서 이미지 자체로 부드럽게 전환됩니다. 이것은 사용자가 요구하는 것이 아니라 효과입니다. 위의 이미지가 실제로 무엇을 찾고 있다면 조금 더 단순한 셰이더 유형 함수보다 조금 더 복잡 할 수 있습니다. 그러나 그들의 해석에 대해 묻는 사람에게서 많은 단어를 되찾지 않고 있었느냐? ??? – trumpetlicks

4

난 그냥 iOS에서의 OpenGL ES 2.0을 사용하여 작업이 구현있어 :

Spherical refraction example

이 iOS에서 동안을, 내가 사용하는 프레 그먼트 쉐이더는 바로 안드로이드를 통해 가져올 수 있습니다. 상기 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 refract() 함수를 사용하여 들어오는 벡터를 굴절시키고 이미지 텍스처에서 검색 좌표를 제공합니다.

this answer에 설명 된 분리 가능한 가우시안 블러를 사용하여 배경이 흐려집니다.

이 필터는 iPhone에서 실시간으로 라이브 비디오를 필터링하기에 충분히 빠르므로 대부분의 Android 장치에서 성능이 상당히 좋아야합니다. 이 소스 코드는 오픈 소스 GPUImage 프레임 워크의 GPUImageSphereRefractionFilter에서 찾을 수 있습니다.

+0

OpenGL에서이 코드를 사용했는데 완벽하게 작동했습니다. 그러나 나는 수학을 이해하는 데 어려움을 겪고있다. y textureCoordinateToUse를 계산하는 동안 aspectRatio가 곱해진 이유를 이해하지만 왜 나머지 계산이 필요합니까? – tanvi