Estoy haciendo una tubería simple que obtiene imágenes de AVCaptureSession, las procesa en OpenCV y luego las traduce en OpenGL. Está basado en RosyWriter pero sin las capacidades de audio y grabación. El procesamiento de OpenCV pareceTome posesión de la memoria de CVImageBufferRef
- (void)processPixelBuffer: (CVImageBufferRef)pixelBuffer
{
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
cv::Mat image = cv::Mat(bufferWidth,bufferHeight,CV_8UC4,pixel);
//do any processing
[self setDisplay_matrix:image];
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
}
En esta función hasta el momento no se han copiado cualquier memoria y me gustaría que siga siendo así. El problema es que pixelBuffer aún puede poseer la memoria contenida en display_image. El código de procesamiento puede o no asignar nueva memoria y almacenarla en la imagen. Si el procesamiento no asignó nueva memoria, tengo que pasar pixelBuffer alrededor con display_matrix para evitar que se borren los datos. ¿Hay alguna forma de que tome posesión de la memoria? Quiero destruir pixelBuffer sin destruir la memoria que apunta también.
En una nota relacionada, ¿qué hace exactamente LockBaseAddress? Si estuviera pasando un cv :: Mat, el par CVImageBufferRef tendría que bloquear la dirección base cada vez que quiera modificar/usar los datos con cv :: Mat?
Hola Hammer, ¿cómo renderizas tu imagen de cv :: Mat en OpenGL ES? Gracias de antemano – lilouch