2011-03-11 13 views
2

私はこのフォーラムを検索し、この質問に対するいくつかの部分的解決策を見てきましたが、私はそれをまとめてお手伝いしたいと思います。100,000+整数(イメージデルタデータを表す)を保存するには、どのような方法が良いですか?

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

  1. didOutputSampleBufferへの各呼び出しから、これらの値のすべてを格納するための最良の方法は何ですか?私が読んできたことから、NSNumberのオーバーヘッドは目立つようになりますので、長さが144 x 192 x 5の古典的なCスタイルの配列(R、G 、B、H、S)= 138,240。それは理にかなっていますか?

  2. didOutputSampleBufferメソッドではなく、アプリケーションの起動時に配列を初期化するため、この配列をmyOutputSampleBufferメソッドのスコープに配置するにはどうすればよいですか。誰かがフォーラムでおそらくNSMutableDataで配列をラップすることができたと私はちょうどプロパティとして格納することができます言及?私は単にオブジェクトの上にCスタイルの配列IVARを作った同様の問題を扱ったとき

は、あなたのアドバイスを ドン

+0

この画像の差分データで正確に何をしますか?ちょうどそれを保管していますか、それとも他の目的がありますか? – NSResponder

答えて

0

、ありがとうございました。

私は、メタデータのようにそれに追加のプロパティを付けることができ、この方法など

@interface MyObject : NSObject { 

    int *arrayOfInts; 
} 

@property (readwrite) int *arrayOfInts; 

@end 

あなたはまだ明示的にこの場合のメモリを管理する必要があります。

+0

なぜインスタンス変数のunsigned int *およびプロパティのunsigned char *ですか? – ughoavgfhw

+0

それは間違いだった、ありがとう。今更新されました。 –

0
  1. はい、データを保存するのに適しています。あるいは、構造体の配列を使用することもできます(私の例を参照)。
  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 
1

画像のサイズが変更されないことを考えると、あなたはインターリーブバイトまたは各色成分のためのいくつかのバッファとして、これらのコンポーネントを格納するためのバッファを作成することができなければなりません飛行機。手動でmalloc()free()を使用してこのバッファを作成し、完了したら破棄することでこれを行うことができます。

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

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

関連する問題