Apropriar-se da memória do CVImageBufferRef

Eu estou fazendo um pipeline simples que obtém imagens de AVCaptureSession, processa-as no OpenCV e, em seguida, as renderiza no OpenGL. Ele é baseado no RosyWriter, mas sem os recursos de áudio e gravação. O processamento 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 );
}

Nesta função até agora não copiei nenhuma memória e gostaria de continuar assim. A questão é que o pixelBuffer ainda pode possuir a memória contida em display_image. O código de processamento pode ou não alocar nova memória e armazená-la na imagem. Se o processamento não alocou a nova memória, tenho que passar o pixelBuffer com display_matrix para evitar que os dados sejam apagados. Existe uma maneira de eu me apropriar da memória? Eu quero destruir o pixelBuffer sem destruir a memória que ele aponta também.

Em uma nota relacionada, o que exatamente o LockBaseAddress faz? Se eu estivesse passando um par cv :: Mat, CVImageBufferRef eu teria que bloquear o endereço base toda vez que eu quisesse modificar / usar os dados com cv :: Mat?

questionAnswers(1)

yourAnswerToTheQuestion