gpt4 book ai didi

c++ - 将 CMSampleBufferRef 转换为 cv::Mat

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:58:49 24 4
gpt4 key购买 nike

我正在尝试将 CMSampleBufferRef(作为 iOS 中 AVCaptureVideoDataOutputSampleBufferDelegate 的一部分)转换为 OpenCV Mat,以尝试半实时地稳定输出。

我正在运行一个测试应用程序,紧接着 this ,但在我创建和使用 Mat 时不断遇到问题。

Swift Controller

let wrapper : OpenCVWrapper = OpenCVWrapper()
...
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
self.wrapper.processBuffer(sampleBuffer, self.previewMat)
}

OpenCVWrapper

- (void)processBuffer:(CMSampleBufferRef)buffer :(UIImageView*)previewMat {
// Convert current buffer to Mat
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(buffer);
CVPixelBufferLockBaseAddress( pixelBuffer, 0);

CGFloat bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
CGFloat bufferHeight = CVPixelBufferGetHeight(pixelBuffer);

unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);

Mat tmp(bufferWidth, bufferHeight, CV_8UC4, pixel);
Mat cur = tmp.clone();

dispatch_async(dispatch_get_main_queue(), ^{
[previewMat setImage:[UIImage imageWithCVMat:cur]];
});
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
}

Mat cur = tmp.clone() 中,我得到一个 EXC_BAD_ACCESS

对我在这里做错了什么有什么想法吗?

我试过 bufferWidth 和 CGFloat 和 int,并在 Mat 的构造函数中切换它们,同样的问题。

最佳答案

改进的解决方案解决了“只有前 30%”的问题:

- (cv::Mat)matFromBuffer:(CMSampleBufferRef)buffer {
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(buffer);
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

//Processing here
int bufferWidth = (int)CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = (int)CVPixelBufferGetHeight(pixelBuffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);

//put buffer in open cv, no memory copied
cv::Mat mat = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel,CVPixelBufferGetBytesPerRow(pixelBuffer));

//End processing
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );

cv::Mat matGray;
cvtColor(mat, matGray, CV_BGR2GRAY);

return matGray;
}

关于c++ - 将 CMSampleBufferRef 转换为 cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34677890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com