我有一个连接到 MLModel 的实时视频源。为了从 MLModel 的检测中获取正确的标准化坐标,我将 AVCaptureConnection 的 videoOrientation 值设置为“Portrait”。
这效果很好,我的检测结果正确地绘制在屏幕上。
但是我有第二阶段,我必须将 CVPixelBufferRef 转换为 openCV 矩阵。
问题是我通常处理此问题的代码会产生交错像素的垃圾。经过一番调查,我发现如果我没有更改输出的 videoOrientation(因此它保持在“横向右”),那么将像素缓冲区转换为 openCV 矩阵将按预期工作。
如何修改标准转换方法(如下)以将 CVPixelBufferRef 正确读取到 openCV 矩阵中?
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
void *baseaddress = CVPixelBufferGetBaseAddress(pixelBuffer);
mat = cv::Mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
我尝试过交换宽度和高度,并尝试了唯一两种似乎适用于 MLModel 的视频格式(kCVPixelFormatType_32BGRA 和 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)
任何帮助将不胜感激!附件是当前生成的 cv::Mat 的图像(左上角附近的小且损坏的图像)。如果我不设置输出方向,生成的图像是正确的(尽管旋转了)。
事实证明,将每行字节传递给构造函数是有效的。不知道为什么没有它就可以工作!
mat = cv::Mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, bytesPerRow);