2010-12-11 3 views
1

Ich möchte die Pixel des Bildes von der Kamera erhalten. Ich benutze CoreFoundation und OpenGL und ich kann das Bild rendern, aber ich möchte einige andere Dinge (an anderer Stelle/Thread) tun, also muss ich sie kopieren.Kopieren von Pixeln von Kamera-Eingang

Dies ist, was ich versucht habe: (Teil AVCaptureVideoDataOutputSampleBufferDelegate Methode)

CVImageBufferRef tmpPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
CVPixelBufferLockBaseAddress(tmpPixelBuffer, 0); 

//APPROACH A 
CFRetain(tmpPixelBuffer); 
if(pixelBuffer!= 0) CFRelease(pixelBuffer); 
pixelBuffer = tmpPixelBuffer; 

//create and bind textureHandle 
if(m_textureHandle==0) m_textureHandle = [self _createVideoTextureUsingWidth:videoDimensions.width Height:videoDimensions.width]; 
glBindTexture(GL_TEXTURE_2D, m_textureHandle); 

unsigned char *linebase = (unsigned char *)CVPixelBufferGetBaseAddress(tmpPixelBuffer); 

//APPROACH B 
unsigned size = videoDimensions.width*videoDimensions.height*4;//since its BGRA 
unsigned char *imageData = malloc(size); 
memcpy(linebase, imageData, size); 
free(imageData); 

//map the texture 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoDimensions.width, videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, linebase); 

CVPixelBufferUnlockBaseAddress(tmpPixelBuffer, 0); 

Im Ansatz AI das Loch Puffer zu behalten haben versucht, so kann ich später die Pixel kopiert werden, wenn nötig, aber ich bekomme immer ein NULL Zeiger (Ich weiß nicht warum)

In Ansatz BI versuchen Sie, die Pixel jedes Mal zu kopieren, aber ich dann OpenGL Renderer wird ein schwarzes Bild zeigen. Ich weiß nicht warum, ich ändere nicht den ursprünglichen Puffer bin ich?

Vielen Dank im Voraus;)

Ignacio

Antwort

0

In Ihrem Ansatz B, befreien Sie die imagedata sofort nach dem Pixelpuffer in sie kopiert haben. Wenn Sie im Debug-Modus ausgeführt werden, ist es möglich, dass der Speichermanager den Speicher löscht. In jedem Fall rufen Sie nicht kostenlos() auf, bis Sie mit den Daten fertig sind.

+0

Sie haben Recht, aber selbst wenn ich die Erinnerung vor der Hand malloc und frei in Dealloc-Methode bekomme ich immer noch einen schwarzen Bildschirm. Ich habe erkannt, dass, wenn ich Ansatz B nach glTexSubImage2D setzen wird es den Rahmen rendern wird, aber ich frage mich warum? Ich handle nicht mit den Originaldaten. Ich kopiere es. – nacho4d

+0

Ihr Aufruf an memcpy oben überschreibt tatsächlich den Inhalt des Pixelpuffers mit Ihrem neu zugewiesenen Speicher. Die Signatur lautet void * memcpy (void * Ziel, const void * source, size_t num); –

Verwandte Themen