ios - 将 cv::Mat 复制到 CMSampleBufferRef

标签 ios opencv avfoundation

如何将 cv::Mat 数据复制回 sampleBuffer?

我的场景如下: 我从 pixelBuffer 创建一个 cv::Mat 用于地标检测,并将地标添加到 cv::Mat 图像数据。我想将此 cv::Mat 复制到示例缓冲区中以与地标一起显示。

这可能吗?

我用 dlib 实现了这个,但需要知道如何用 cv::mat 实现:

char *baseBuffer = (char *)CVPixelBufferGetBaseAddress(imageBuffer);
img.reset();
long position = 0;
while (img.move_next()) {
        dlib::bgr_pixel& pixel = img.element();
        long bufferLocation = position * 4; //(row * width + column) * 4;
        char b = baseBuffer[bufferLocation];
        char g = baseBuffer[bufferLocation + 1];
        char r = baseBuffer[bufferLocation + 2];
        dlib::bgr_pixel newpixel(b, g, r);
        pixel = newpixel;

        position++;
    }

最佳答案

我正在回答我自己的问题。

首先,您需要访问 cv::mat 图像的像素数据,我遵循了这个很棒的 solution

然后您需要将像素复制到从基缓冲区开始的缓冲区中。以下代码应该可以帮助您实现这一点:

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
char *baseBuffer = (char *)CVPixelBufferGetBaseAddress(imageBuffer);   
long position = 0;
uint8_t* pixelPtr = (uint8_t*)targetImage.data;
int cn = targetImage.channels();
cv::Scalar_<uint8_t> rgbPixel;
for(int i = 0; i < targetImage.rows; i++)
{
    for(int j = 0; j < targetImage.cols; j++)
    {
        long bufferLocation = position * 4;

        rgbPixel.val[0] = pixelPtr[i*targetImage.cols*cn + j*cn + 0]; // B
        rgbPixel.val[1] = pixelPtr[i*targetImage.cols*cn + j*cn + 1]; // G
        rgbPixel.val[2] = pixelPtr[i*targetImage.cols*cn + j*cn + 2]; // R
        baseBuffer[bufferLocation] = rgbPixel.val[2];
        baseBuffer[bufferLocation + 1] = rgbPixel.val[1];
        baseBuffer[bufferLocation + 2] = rgbPixel.val[0];
        position++;
    }
}

一些注意事项

  • 确保你 CVPixelBufferLockBaseAddressCVPixelBufferUnlockBaseAddress 操作前后。我
  • 正在 CV_8UC3 上执行此操作,您可能需要检查您的 cv::mat
    类型。
  • 我还没有进行性能分析,但我的输出很流畅。

关于ios - 将 cv::Mat 复制到 CMSampleBufferRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39083710/

相关文章:

opencv - 具有与背景相同颜色的字体的背景检测

ios - AVAssetResourceLoader 支持的 AVURLAsset 播放仅通过 AirPlay 失败

ios - Swift 如何避免在子类中覆盖 init?(编码器)

android - redux state 在 react native 中在内存中保留多长时间

java - 透视变换——OpenCV显示镜像

python - 使用opencv测量两个元素之间的距离

ios - 无法显示 AVCaptureVideoPreviewLayer

ios - 使用 AVCam 在视频录制期间禁用自动对焦

ios - NSPredicate NSArray 和 NSObject 之间的值匹配

ios - UITextField Xcode 的圆角