Взять на себя ответственность памяти от CVImageBufferRef

Я делаю простой конвейер, который получает изображения из AVCaptureSession, обрабатывает их в OpenCV, а затем отображает их в OpenGL. Он основан на RosyWriter, но без возможностей аудио и записи. Обработка OpenCV выглядит так

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

До сих пор в этой функции я не копировал никакую память и хотел бы сохранить ее в таком виде. Проблема в том, что pixelBuffer все еще может владеть памятью, содержащейся в display_image. Код обработки может выделять или не выделять новую память и сохранять ее в изображении. Если при обработке не было выделено новой памяти, я должен передать pixelBuffer с помощью display_matrix, чтобы предотвратить стирание данных. Есть ли у меня способ завладеть памятью? Я хочу уничтожить pixelBuffer, не разрушая память, на которую он указывает.

Что связано с LockBaseAddress? Если бы я передавал пару cv :: Mat, CVImageBufferRef, мне пришлось бы блокировать базовый адрес каждый раз, когда я хочу изменить / использовать данные с помощью cv :: Mat?

Ответы на вопрос(1)

Ваш ответ на вопрос