4

こんにちは、iPhone SDK で画像の薄いサイズを太いサイズに変更する方法はありますか?この画像のような何か

このアプリケーションでは、iPhone SDK でサイズを測定できるスライダーをスライドさせることで、ユーザーが画像を通常のサイズから太いサイズに変更できるようにしたいと考えています。これは、画像のピクセルを取得することで機能すると思います。画像のピクセルを取得するためにこのコードを試しましたが、画像から色を削除するだけです。

UIImage *image      = [UIImage imageNamed:@"foo.png"];

CGImageRef imageRef = image.CGImage;
NSData *data        = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
char *pixels        = (char *)[data bytes];

// this is where you manipulate the individual pixels
// assumes a 4 byte pixel consisting of rgb and alpha
// for PNGs without transparency use i+=3 and remove int a
for(int i = 0; i < [data length]; i += 4)
{
    int r = i;
    int g = i+1;
    int b = i+2;
    int a = i+3;

    pixels[r]   = pixels[r]; // eg. remove red
    pixels[g]   = pixels[g];
    pixels[b]   = pixels[b];
    pixels[a]   = pixels[a];
}

// create a new image from the modified pixel data
size_t width                    = CGImageGetWidth(imageRef);
size_t height                   = CGImageGetHeight(imageRef);
size_t bitsPerComponent         = CGImageGetBitsPerComponent(imageRef);
size_t bitsPerPixel             = CGImageGetBitsPerPixel(imageRef);
size_t bytesPerRow              = CGImageGetBytesPerRow(imageRef);

CGColorSpaceRef colorspace      = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo         = CGImageGetBitmapInfo(imageRef);
CGDataProviderRef provider      = CGDataProviderCreateWithData(NULL, pixels, [data length], NULL);

CGImageRef newImageRef = CGImageCreate (
  width,
  height,
  bitsPerComponent,
  bitsPerPixel,
  bytesPerRow,
  colorspace,
  bitmapInfo,
  provider,
  NULL,
  false,
  kCGRenderingIntentDefault

  // the modified image
  UIImage *newImage   = [UIImage imageWithCGImage:newImageRef];
  imgView.image = newImage;

このコードから画像を引き伸ばしてみました。

UIImage *stretchImage = [image stretchableImageWithLeftCapWidth:10 topCapHeight:10];

誰でも私を助けることができますか?そのような機能を提供するフレームワークや SDK は見つかりませんでした。私は長い間ググってきました。

4

1 に答える 1

7

たまたま、私は現在、あなたが私たちの会社について説明しているものとほぼ同じものに取り組んでいます。私たちは顔に取り組んでいますが、これは現実的に行うのがより簡単な問題です。

これがビフォアイメージです(本当にあなたのものです)

ダンカン マグカップ 前

そして、ここに「太った顔」の変換があります。

ダンカンマグアフター

私が行ったことは、画像を OpenGL テクスチャにインポートし、そのテクスチャをメッシュ グリッドに適用することです。一連の変更をメッシュ グリッドに適用し、特定のポイントを互いに近づけたり、他のポイントをさらに引き離したりします。リアルな太った顔を作るにはかなりの微調整が必​​要でしたが、結果はかなり良いと思います。

メッシュを計算すると、OpenGL は画像を変換するという「重労働」を非常に高速に実行します。すべての設定が完了したら、変換されたイメージを実際に描画するのは 1 回の呼び出しです。

これは同じ画像で、グリッド ラインを示しています。

グリッド線のある太った顔 http://imageshack.com/a/img404/8049/afterwithlines.jpg

基本的なメッシュ ワーピングを機能させるのに数週間のフルタイムの作業が必要でした (失敗したクライアント プロジェクトの場合)。その後、ファット フェイス レイアウトを微調整するためにパートタイムでさらに 1 週​​間ほどかかりました。すべてを販売可能な製品にすることは、まだ進行中の作業です。

私が思いついたアルゴリズムは、完全な 30 FPS で iOS カメラからのビデオ入力に脂肪変換 (およびその他のさまざまな変換) を適用するのに十分な速さです。

この種の画像処理を行うには、三角関数、代数、ポインター演算、変換行列を理解し、高度に最適化されたコードの書き方をしっかりと理解している必要があります。

Apple の新しい Core Image 顔認識コードを使用して、画像内の人の顔の特徴を見つけ、目と口の座標を変換の開始点として使用しています。

あなたのプロジェクトはもっと野心的です。すべての特徴を見つけ、それらの輪郭をトレースし、説得力のある太った効果を得るために画像を変換する方法を見つけるには、かなりの画像処理を行う必要があります。良い結果を得るには、慎重に制御された条件下でポーズ、ライティング、撮影された高解像度のソース イメージが必要です。

現在の iOS デバイスの計算能力には多すぎるかもしれませんし、体のパーツを見つけ出し、それらをどのように変換するために行う必要がある種類の画像認識は、気が遠くなるほど難しいでしょう. 問題の画像認識部分の出発点として、オープン ソースの OpenCV プロジェクトを調べてみることをお勧めします。

于 2012-05-16T02:54:58.457 に答える