2012-06-07 20 views
5

Tôi phải áp dụng bộ lọc hình cầu trên hình ảnh trong Android, tôi đã đính kèm đầu vào và hình ảnh đầu ra được mong đợi. Hình ảnh đầu ra sẽ được xử lý từ vùng trung tâm bình phương của hình ảnh đầu vào và ánh xạ nó thành hình cầu. Bất kỳ ý tưởng làm thế nào để làm điều này trong Android. Tôi sẽ phải sử dụng OpenGL để thực hiện điều này hoặc 2D-trasformation một mình sẽ làm nhiệm vụ.Bộ lọc hình cầu trong android

Input image
Output Image

Trả lời

2

mã sau đây Fish Eye lens để tạo Sphere và áp dụng một số sửa đổi để mở rộng hình cầu và tạo nền, nó sẽ hoạt động chủ yếu cho hình ảnh vuông.

0

Đây là vấn đề đi tia sáng. OpenGL rất có thể sẽ không giúp bạn ở đây vì OpenGL không cung cấp hình ảnh 3D dựa trên tia. Tuy nhiên, đây có thể là những gì bạn đang tìm kiếm.

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

+0

Tôi không nghĩ rằng nó nhất thiết là một vấn đề raytracing khó khăn với điều kiện nền chỉ là một kết cấu. Bạn chỉ có thể ánh xạ kết cấu tới hình cầu với một số loại hệ tọa độ hình cầu hoặc hình khối. Nếu anh ấy phản ánh cảnh 3D động, tôi sẽ đồng ý với bạn, nhưng chỉ phản ánh kết cấu không quá khó. – Tim

+0

Ví dụ không phải raytracing là những gì giấy tôi cung cấp là về (Im khá chắc chắn) !!! Một cách khác để làm điều đó (ngay cả với nền là kết cấu) vẫn có thể sử dụng tính năng dò tia. – trumpetlicks

+2

"OpenGL không cung cấp dựa trên tia 3D" - nó chắc chắn nhất có thể khi sử dụng trình đổ bóng.Tôi đã thực hiện một sự biến dạng gần với điều này bằng cách sử dụng một shader OpenGL ES 2.0: http://stackoverflow.com/a/9896856/19679 và GLSL thậm chí còn định nghĩa một hàm 'refract()' để khúc xạ ánh sáng thông qua các đối tượng. Hãy để tôi xem nếu tôi có thể tạo ra một shader để nhân rộng hiệu ứng cụ thể này. –

0

Tôi đồng ý với Tim. Việc chuyển đổi một bitmap thành một bitmap khác không yêu cầu các điểm 3d, cũng như Ray-trace, quên nó đi, chỉ đơn giản là 2d. Tôi không biết nếu opengl có một cái gì đó được xây dựng trong, nhưng tôi có đủ kinh nghiệm 3d để chỉ cho bạn đi đúng hướng. Bạn phải lặp lại tất cả các điểm bên trong vùng * vòng tròn mà bạn chọn * đây là manh mối và tìm màu bằng cách sử dụng phép biến đổi FISH-EYE. Bạn có rất nhiều thứ trên mạng. hy vọng điều này sẽ giúp

+0

Ví dụ được hiển thị của người thể hiện sự phản xạ, khúc xạ, và hình tròn đúng với mặt nước/kính vv… Ngay cả khi bạn nhìn vào liên kết do Brad Larson cung cấp (liên kết lớn bằng cách +1) các cạnh tại đường tròn được chuyển đổi suôn sẻ trở lại chính hình ảnh đó. Đó là một hiệu ứng, không phải là CẦN THIẾT những gì người dùng này đang yêu cầu. Nếu hình ảnh trên thực sự là những gì họ đang tìm kiếm thì nó có thể phức tạp hơn một chút sau đó các chức năng kiểu đổ bóng đơn giản hơn chút ít. Đã không nhận được nhiều từ trở lại từ người hỏi về cách giải thích của họ tuy nhiên? – trumpetlicks

4

Tôi chỉ có một thực hiện này làm việc sử dụng OpenGL ES 2.0 trên iOS:

Spherical refraction example

Trong khi điều này là trên iOS, đổ bóng đoạn tôi đã sử dụng có thể được đưa thẳng trên Android. Phần khúc xạ hình cầu được thực hiện bằng cách sử dụng shader đoạn sau:

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;  
} 

các center là một bình thường phối hợp với trung tâm của hình cầu (từ một không gian của 0,0-1,0 ở cả hai chiều), các radius là bán kính bình thường , refractiveIndex là chỉ số không khí/vật chất của hình cầu của bạn và aspectRatio là tỷ lệ co của hình ảnh (để đảm bảo hình cầu tròn và không hình elip trong không gian tọa độ chuẩn hóa).

Tính toán các chỉ tiêu bề mặt cho hình cầu với trung tâm và bán kính được cung cấp và sử dụng hàm GLSL refract() để khúc xạ véc tơ đến và cung cấp tọa độ tra cứu trong kết cấu hình ảnh.

Nền mờ bằng cách sử dụng hiệu ứng mờ Gaussian tách mà tôi mô tả trong this answer.

Bộ lọc này đủ nhanh để lọc video trực tiếp trong thời gian thực trên iPhone, vì vậy nó sẽ khá hiệu quả trên hầu hết các thiết bị Android. Mã nguồn cho nó có thể được tìm thấy trong GPUImageSphereRefractionFilter trong khung công tác GPUImage nguồn mở của tôi.

+0

Tôi đã sử dụng tính năng này trong OpenGL và nó hoạt động hoàn hảo. Tuy nhiên tôi gặp khó khăn trong việc hiểu toán. Trong khi tính toán y textureCoordinateToUse, tôi hiểu tại sao aspectRatio được nhân lên, nhưng tại sao phần còn lại của phép tính cần thiết? – tanvi