5

Androidの画像に球状フィルターを適用する必要があります。入力画像と期待される出力画像を添付しました。出力画像は、入力画像の正方形の中央領域から処理され、球にマッピングされます。Androidでこれを行う方法について考えてください。これを行うためにopenGLを使用する必要がありますか、それとも2D変換だけでタスクを実行しますか。

入力画像
出力画像

4

4 に答える 4

4

iOS で OpenGL ES 2.0 を使用して、この作業の実装を取得しました。

球面屈折の例

これは 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 デバイスでかなりのパフォーマンスを発揮するはずです。そのソース コードは、私のオープン ソースGPUImageフレームワークの GPUImageSphereRefractionFilter 内にあります。

于 2012-07-09T00:09:54.010 に答える
2

次のコードは、球体を作成するための魚眼レンズであり、球体と背景の生成をスケーリングするためにいくつかの変更を適用します。これは主に正方形の画像で機能します。

于 2012-06-16T05:47:42.627 に答える
0

私はティムに同意します。あるビットマップを別のビットマップに変換するには、3D ポイントもレイトレースも必要ありません。単純に 2D であることを忘れてください。openglに何かが組み込まれているかどうかはわかりませんが、正しい方向に向けるのに十分な3D経験があります. *選択した円領域内のすべてのポイントを反復する必要があります*これが手がかりであり、FISH-EYE 変換を使用して色を見つけます。あなたはネット上でたくさん手に入れました。お役に立てれば

于 2012-06-08T19:13:35.733 に答える
0

これは光線追跡の問題です。OpenGL はレイベースの 3D を提供しないため、OpenGL はおそらくここでは役に立ちません。ただし、これはあなたが探しているものかもしれません。

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

于 2012-06-08T18:57:20.493 に答える