Übernehmen Sie den Besitz des Speichers von CVImageBufferRef

Ich erstelle eine einfache Pipeline, mit der Bilder von AVCaptureSession abgerufen, in OpenCV verarbeitet und dann in OpenGL gerendert werden. Es basiert auf RosyWriter, jedoch ohne Audio- und Aufnahmefunktionen. Die OpenCV-Verarbeitung sieht so aus

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

In dieser Funktion habe ich bisher keine Erinnerung kopiert und möchte es auch so belassen. Das Problem ist, dass pixelBuffer möglicherweise immer noch den in display_image enthaltenen Speicher besitzt. Der Verarbeitungscode kann neuen Speicher zuweisen oder nicht und ihn im Bild speichern. Wenn die Verarbeitung keinen neuen Speicher reserviert hat, muss ich pixelBuffer mit display_matrix weitergeben, damit die Daten nicht gelöscht werden. Gibt es eine Möglichkeit für mich, die Erinnerung in Besitz zu nehmen? Ich möchte pixelBuffer zerstören, ohne den Speicher zu zerstören, auf den es verweist.

Was genau macht LockBaseAddress im Zusammenhang damit? Wenn ich ein cv :: Mat, CVImageBufferRef-Paar umrunden würde, müsste ich die Basisadresse jedes Mal sperren, wenn ich die Daten mit cv :: Mat ändern / verwenden möchte?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage