Sto creando una pipeline semplice che recupera le immagini da AVCaptureSession, le elabora in OpenCV e le esegue quindi in OpenGL. È basato su RosyWriter ma senza le capacità audio e di registrazione. L'elaborazione OpenCV è simile aAcquisire la proprietà della memoria da CVImageBufferRef
- (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 questa funzione fino ad ora non ho copiato alcuna memoria e vorrei mantenerla in questo modo. Il problema è che pixelBuffer può ancora possedere la memoria contenuta in display_image. Il codice di elaborazione può o non può allocare nuova memoria e memorizzarla nell'immagine. Se l'elaborazione non ha allocato nuova memoria devo passare pixelBuffer in giro con display_matrix per mantenere i dati da cancellare. C'è un modo per me di diventare proprietario della memoria? Voglio distruggere pixelBuffer senza distruggere la memoria che punta troppo.
Su una nota correlata, cosa fa esattamente LockBaseAddress? Se passassi attorno a una coppia cv :: Mat, CVImageBufferRef dovrei bloccare l'indirizzo di base ogni volta che voglio modificare/utilizzare i dati con cv :: Mat?
Hi Hammer, come si esegue il rendering del proprio cv :: Mat in OpenGL ES per favore? Grazie in anticipo – lilouch