5

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 に含まれるメモリを所有している可能性があることです。処理コードは、新しいメモリを割り当ててイメージに格納する場合としない場合があります。処理で新しいメモリが割り当てられなかった場合は、display_matrix を使用して pixelBuffer を渡して、データが消去されないようにする必要があります。メモリの所有権を取得する方法はありますか? それが指すメモリも破壊せずに pixelBuffer を破壊したい。

関連して、LockBaseAddress は正確に何をするのでしょうか? cv::Mat と CVImageBufferRef のペアを渡している場合、cv::Mat でデータを変更/使用するたびにベース アドレスをロックする必要がありますか?

4

1 に答える 1