我正在使用此代码从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时,它会产生:
但是其他配置文件创建了一个cv:Mat就好了。有人可以帮忙吗?
答案 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;
}