2

フォーラムを検索したところ、この質問に対する部分的な解決策がいくつか見つかりましたが、すべてをまとめる手助けをしたいと思います。

カメラからフレームを取得し、現在のフレームと前のフレームの違いについて画像処理を行っています。カメラからの RGB 値に加えて、各ピクセルの色相と彩度も計算しています。これらもそれぞれ int です。だから私の2つの質問は次のとおりです。

  1. への各呼び出しからこれらすべての値を保存する最良の方法は何didOutputSampleBufferですか? 私が読んだことから、この多くの値では、NSNumber からのオーバーヘッドが顕著になるため、長さ 144 x 192 x 5(R,G ,B,H,S) = 138,240. それは理にかなっていますか?

  2. didOutputSampleBuffer メソッドではなく、アプリの起動時に配列を初期化しているため、この配列を didOutputSampleBuffer メソッドのスコープに入れるにはどうすればよいですか。フォーラムの誰かが、おそらく配列を NSMutableData でラップして、それをプロパティとして保存できると述べました。

アドバイスありがとう、ドン

4

3 に答える 3

1

画像のサイズが変わらないことを考えると、これらのコンポーネントをインターリーブされたバイトとして格納するためのバッファ、または各カラーコンポーネントプレーンのいくつかのバッファを作成できるはずです。これを行うには、とを手動で使用malloc()free()てこのバッファを作成し、完了したら破棄します。

参照カウントを使用したい場合は、これらのバイトをNSDataインスタンスでラップできます。これにより、処理に大きなオーバーヘッドが追加されることはありません。処理されたバッファバイトへのポインタまたはNSDataインスタンスのいずれかをプロパティとして使用できます。

unsigned char各カラーコンポーネントの個別のバイトのみを取得するため、各コンポーネントにタイプを使用することをお勧めします。なぜ不必要な精度でメモリを浪費するのですか?

于 2011-03-11T22:16:04.700 に答える
0

同様の問題に対処していたとき、私は単純に C スタイルの配列をオブジェクトの ivar にしました。

このようにして、メタデータなどの追加のプロパティをアタッチできます。

@interface MyObject : NSObject {

    int *arrayOfInts;
}

@property (readwrite) int *arrayOfInts;

@end

この場合でも、メモリを明示的に管理する必要があります。

于 2011-03-11T22:04:50.030 に答える
0
  1. はい、それはデータを保存する良い方法です。または、構造体の ac 配列を使用することもできます (私の例を参照してください)。
  2. NSMutableData オブジェクトまたは配列へのポインタを含むグローバル変数またはプロパティを使用できます。生データではなく整数としてデータにアクセスする必要があるため、データへのポインターを格納する方がおそらく NSData オブジェクトよりも簡単です。

例:

// header file
struct PixelData {
    int r, g, b, h, s;
};
@interface TheClass : TheSuperclass {
    struct PixelData *dataPointer;
}
@property struct PixelData *dataPointer;
@end

// implementation file
@implementation TheClass
@synthesize dataPointer;
- (void)didOutputSampleBuffer { // Yes, I know this isn't the full name.
    // parse data
    // store data for pixel at index i:
    struct PixelData *dp = self.dataPointer;
    dp[i].r = r;
    dp[i].g = g;
    dp[i].b = b;
    dp[i].h = h;
    dp[i].s = s;
}
@end
于 2011-03-11T22:11:41.140 に答える