【发布时间】:2012-07-07 04:16:03
【问题描述】:
我正在制作一个简单的管道,从 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 修改/使用数据时,我是否必须锁定基地址?
【问题讨论】:
-
嗨 Hammer,请问如何将 cv::Mat 图像渲染到 OpenGL ES 中?提前致谢
标签: objective-c ios memory-management avcapturesession