Я делаю простой конвейер, который получает изображения из 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?