使用AVCaptureSessionPresetPhoto时,来自CMSampleBufferRef的损坏的cv:Mat

时间:2017-07-28 13:43:12

标签: ios opencv avfoundation avcapturesession avcapturedevice

我正在使用此代码从CMSampleBufferRef创建一个cv :: Mat。它适用于AVCaptureSessionPreset(高,中,低),但是当我使用AVCaptureSessionPresetPhoto时,它会输出一个乱码图像。

- (cv::Mat) matFromSampleBuffer:(CMSampleBufferRef) sampleBuffer {
    CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

    CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

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

    cv::Mat mat(bufferHeight,bufferWidth,CV_8UC4,pixel);

    CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );

    return mat;
}

当我使用AVCaptureSessionPresetPhoto时,它会产生:

garbled

但是其他配置文件创建了一个cv:Mat就好了。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

解决了,我错过了以字节为单位的步长:

- (cv::Mat) matFromSampleBuffer:(CMSampleBufferRef) sampleBuffer {
    CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

    CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

    int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
    int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
    int bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
    unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);

    cv::Mat mat(bufferHeight,bufferWidth,CV_8UC4,pixel,bytesPerRow);

    CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );

    return mat;
}