2

私は CVImageBufferRef (QTKit を使用してキャプチャ) がある 10.5+ 用の最初の mac osx cocoa アプリに取り組んでいます。このイメージを TCP ソケット経由でクライアント アプリに転送する必要があります。クライアント アプリには RGB 値が必要です。これが私が現在行っていることです(私の現在のソリューションは必要に応じて機能しますが、多くのCPUを使用します)

CVImageBufferRef --> NSBitmapImageRep --> NSData --> 次に、TCP Socket 経由で NSData をクライアント アプリに送信し、クライアント側で RGB を取得する次のコードを作成します。

UInt8 r,g,b
int width=320;
int height=240;

NSData *data; //read from TCP Socket
NSBitmapImageRep *bitmap=[[NSBitmapImageRep alloc] initWithData:data];

for (y=1;y<=height;y++) {
    for(x=1;x<=width;x++){


        NSColor *color=[bitmap colorAtX:x y:y];
        // ^^ this line is actually a culprit and uses a lot of CPU


        r=[color redComponent]*100;
        g=[color greenComponent]*100;
        b=[color blueComponent]*100;
        NSLog(@"r:%d g:%d b:%d",r,g,b);
    }
}

[bitmap release];

CVImageBufferRef を RGB 値の配列に変換できる場合は完璧です。それ以外の場合は、NSBitmapImageRep を RGB 値に変換する効率的なソリューションが必要です。

4

2 に答える 2

3

を使用してビットマップデータを取得し、bitmapDataそこから必要なピクセル値を取得できます。これにより、多くの場合が100倍以上高速になります。

(ログも行くはずです)

于 2011-10-19T21:47:34.657 に答える
3

CVImageBufferRef から直接取得する場合は、CVImageBuffer から派生した CVPixelBuffer を使用できます。CVPixelBufferLockBaseAddress() を使用してから、CVPixelBufferGetBaseAddress() を使用して、最初のピクセルへのポインターを取得します。他にも多くの CVPixelBufferGet* メソッド ( http://developer.apple.com/library/mac/#documentation/QuartzCore/Reference/CVPixelBufferRef/Reference/reference.html ) があり、幅、高さなどを調べてサイズを確認します。送信するデータ。そしてもちろん CVPixelBufferUnlockBaseAddress() は一度データを処理します。

NSBitmapImageRep を使用している場合は、ジャスティンに同意します。using[bitmap bitmapData]は、最初の要素へのポインタを返します。予備知識がなくても、次のような生データを送信できます。

unsigned char *data = [bitmap bitmapData];
unsigned long size = [bitmap pixelsWide]*[bitmap pixelsHigh]*[bitmap samplesPerPixel]*sizeof(unsigned char);

このデータは RGB 連続値になります。つまり1stRedComponent = *(data + 0)1stGreenComponent = *(data + 1) 1stBlueComponent = *(data + 2)NSBitmapImageRep の外部でピクセル固有のアクセスが必要な場合は、データの最初の RGB コンポーネントが得られます。

于 2011-10-20T04:00:34.203 に答える