我如何将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
类型。 - 我还没有做性能分析,但是我得到了平滑的输出。