Przejmij własność pamięci od CVImageBufferRef

Tworzę prosty potok, który pobiera obrazy z AVCaptureSession, przetwarza je w OpenCV, a następnie renderuje je w OpenGL. Jest oparty na RosyWriter, ale bez możliwości audio i nagrywania. Przetwarzanie OpenCV wygląda tak

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

W tej funkcji do tej pory nie skopiowałem żadnej pamięci i chciałbym ją zachować w ten sposób. Problem polega na tym, że pixelBuffer może nadal posiadać pamięć zawartą w display_image. Kod przetwarzania może, ale nie musi, przydzielić nowej pamięci i zapisać ją na obrazie. Jeśli przetwarzanie nie przydzieliło nowej pamięci, muszę przekazać pixelBuffer dookoła z display_matrix, aby dane nie zostały usunięte. Czy istnieje sposób, aby przejąć własność pamięci? Chcę zniszczyć pixelBuffer bez niszczenia pamięci, którą wskazuje.

Na podobnej uwadze, co dokładnie robi LockBaseAddress? Gdybym przechodził wokół cv :: Mat, para CVImageBufferRef musiałaby zablokować adres bazowy za każdym razem, gdy chcę zmodyfikować / użyć danych z cv :: Mat?

questionAnswers(1)

yourAnswerToTheQuestion