質問

私は10.5+の最初のMac OSX Cocoaアプリに取り組んでいます。ここでは、cvimagebufferref(qtkitを使用してキャプチャ)を持っています。この画像をTCPソケットでクライアントアプリに転送する必要があります。クライアントアプリにはRGB値が必要です。だからここに私が現在行っていることがあります(私の現在のソリューションは必要に応じて機能しますが、多くのCPUを使用しています)

cvimagebufferref-> nsbitmapimagerep-> nsdata->次に、TCPソケットを介して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値に変換するための効率的なソリューションが必要です。

役に立ちましたか?

解決

CvimageBufferRefから直接進む場合は、CVimageBufferから派生しているため、CVPixelBufferを使用できます。 cvpixelbufferlockbaseaddress()を使用してから、cvpixelbuffergetbaseaddress()を使用して、最初のピクセルへのポインターを取得します。他にも多くのcvpixelbufferget*メソッドがあります(http://developer.apple.com/library/mac/#documentation/quartzcore/reference/cvpixelbufferref/reference/reference.html)送信されるデータのサイズの知識については、幅、高さなどを問い合わせます。そしてもちろん、CVPixelBufferUnLockBaseAddress()がデータを使用して完了しました。

nsbitmapimagerepを使用している場合、私はジャスティンに同意します。使用 [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コンポーネントを提供します

他のヒント

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

(ログも行くはずです)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top