Pregunta

Estoy trabajando en mi primera aplicación Mac Osx Cocoa para 10.5+ donde tengo un CVIMageBufferRef (capturado usando QTKIT), necesito transferir esta imagen a través de TCP Socket a la aplicación del cliente. La aplicación del cliente necesita valores RGB. Así que esto es lo que estoy haciendo actualmente (mi solución actual funciona según sea necesario pero usa mucha CPU)

CVIMAGEBUFFERREF -> NSBITMAPIMAGEREP -> NSDATA -> Luego transmita NSDATA a través de TCP Socket a la aplicación del cliente y al lado del cliente tengo el siguiente código para obtener el 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];

Si CVIMAGEBUFFERREF se puede convertir en una matriz de valores RGB que serían perfectos, de lo contrario, necesito una solución eficiente para convertir NSBITMAPIMAGEREP en valores RGB.

¿Fue útil?

Solución

Si va directamente de un cviMageBufferRef, puede usar cvpixelbuffer, ya que se deriva de cviMagebuffer. Use cvpixelbufferlockbaseAddress () y luego cvpixelbuffergetbaseaddress () para obtener un puntero al primer píxel. También hay muchos otros métodos cvpixelbufferget* (http://developer.apple.com/library/mac/#documentation/quartzcore/reference/cvpixelbufferref/reference/reference.html) Consultar ancho, altura, etc. para obtener el conocimiento del tamaño de los datos que se transmitirán. Y, por supuesto, CVPIXELBUFFERUnlockBaseAddress () una vez hecho con los datos.

Si uso el NSBITMapimageP, estoy de acuerdo con Justin. usando [bitmap bitmapData] devolverá el puntero al primer elemento. Incluso sin conocimiento previo, puede enviar los datos sin procesar que serán:

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

Estos datos serán valores sucesivos de RGB, es decir 1stRedComponent = *(data + 0), 1stGreenComponent = *(data + 1) 1stBlueComponent = *(data + 2) le dará el primer componente RGB en los datos si necesita acceso específico de píxel fuera del NSBITMapimageP

Otros consejos

Puede obtener la mano de los datos de mapa de bits usando bitmapData Y tome los valores de píxeles que necesita de él. Eso debería hacer que muchos casos sean más de 100 veces más rápido.

(El registro también debería ir)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top