Tomar posesión de la memoria de CVImageBufferRef

Estoy creando un canal simple que obtiene imágenes de AVCaptureSession, las procesa en OpenCV y luego las procesa en OpenGL. Se basa en RosyWriter pero sin las capacidades de audio y grabación. El procesamiento de OpenCV parece

- (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 ahora no he copiado ningún recuerdo y me gustaría mantenerlo así. El problema es que pixelBuffer todavía puede poseer la memoria contenida en display_image. El código de procesamiento puede o no asignar una nueva memoria y almacenarla en la imagen. Si el procesamiento no asignó nueva memoria, tengo que pasar pixelBuffer con display_matrix para evitar que los datos se borren. ¿Hay alguna manera de tomar 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 transmitiera un par cv :: Mat, cVImageBufferRef, ¿tendría que bloquear la dirección base cada vez que quiera modificar / usar los datos con cv :: Mat?

Respuestas a la pregunta(1)

Su respuesta a la pregunta