Copy cv::Mat into CMSampleBufferRef



我如何将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 Image的像素数据,我遵循了这个伟大的解决方案

然后需要从basebuffer开始将像素复制到缓冲区中。下面的代码可以帮助你实现这个目标:

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++;
    }
}

注意事项

  • 确保您的CVPixelBufferLockBaseAddress和术前、术后CVPixelBufferUnlockBaseAddress。我
  • 我在CV_8UC3上这样做,你可能想检查你的简历::mat
    类型。
  • 我还没有做性能分析,但是我得到了平滑的输出。

相关内容

  • 没有找到相关文章

最新更新