копирование пикселей с входа камеры - PullRequest
1 голос
/ 11 декабря 2010

Я хочу получить пиксели изображения с камеры.Я использую CoreFoundation и OpenGL, и я могу визуализировать изображение, но я хочу сделать другие вещи (в другом месте / потоке), поэтому мне нужно скопировать их.

Это то, что я пробовал: (частьметода AVCaptureVideoDataOutputSampleBufferDelegate)

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 );

В подходе AI пытался сохранить буфер дырок, чтобы я мог копировать пиксели позже, когда это необходимо, но я всегда получаю нулевой указатель (не знаю почему)

В подходе BI попробуйте каждый раз копировать пиксели, но я тогда opengl рендерер покажу черное изображение.Не знаю почему, я не изменяю исходный буфер, не так ли?

Заранее спасибо;)

Игнасио

1 Ответ

0 голосов
/ 11 декабря 2010

В вашем подходе B вы освобождаете imageData сразу после того, как скопировали в него буфер пикселей. Если вы работаете в режиме отладки, возможно, что менеджер памяти очищает память. В любом случае, не вызывайте free (), пока не закончите с данными.

...