AVCaptureSession에서 이미지를 가져 와서 OpenCV에서 처리 한 다음 OpenGL에서 렌더링하는 간단한 파이프 라인을 만들고 있습니다. RosyWriter를 기반으로하지만 오디오 및 녹음 기능은 없습니다. 이 기능에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);
}
지금까지 내가 어떤 메모리를 복사하지 않은 내가 그런 식으로 유지하고 싶은 것처럼 OpenCV의 처리 보인다. 문제는 pixelBuffer가 여전히 display_image에 포함 된 메모리를 소유 할 수 있다는 것입니다. 처리 코드는 새 메모리를 할당하거나 할당하지 않을 수도 있고 이미지에 저장할 수도 있습니다. 처리가 새 메모리를 할당하지 않은 경우 데이터가 지워지지 않도록 display_matrix와 함께 pixelBuffer를 전달해야합니다. 기억의 소유권을 가져갈 수있는 방법이 있습니까? 픽셀 버퍼를 손상시키지 않고 pixelBuffer를 파괴하려고합니다.
관련 메모에서 LockBaseAddress는 정확히 무엇을 수행합니까? cv :: Mat, CVImageBufferRef 쌍을 지나가고 있다면, 수정/cv :: Mat으로 데이터를 사용할 때마다 기본 주소를 잠궈 야합니까?
안녕 해머, 당신의 OpenGL ES로 이력서 :: 매트 이미지를하십시오 렌더링 어떻게? 미리 감사드립니다. – lilouch