使用从缓冲区复制的图像更改 cv::Mat 会影响原始图像

Posted

技术标签:

【中文标题】使用从缓冲区复制的图像更改 cv::Mat 会影响原始图像【英文标题】:Changing cv::Mat with image copied from buffer affects original image 【发布时间】:2012-08-30 17:56:29 【问题描述】:

我有 24 位 RGB 格式的图像缓冲区。这个缓冲区被复制到 cv::Mat 使用

cv::Mat mat = cv::Mat(image->height, image->width, CV_8UC3, image->data);

由于这个缓冲区是 RGB 格式,而 OpenCV 使用 BGR 格式,我将mat转换为 BGR

cv::cvtColor(mat, mat, CV_RGB2BGR);

这可行,但是当我检查原始图像时,它的通道也被反转(因此它们变得错误),我不希望这种情况发生。

我想反转 mat 频道顺序,使 image-data(我的图像缓冲区)保持不变。我该怎么做?

【问题讨论】:

在颜色转换之前硬拷贝矩阵或者只是 cv::cvtColor(mat, mat2, CV_RGB2BGR); ? 我不这么认为。会不会对性能影响太大? 【参考方案1】:

我假设(我不确定)如果你使用cv::cvtColor(mat, mat, CV_RGB2BGR);,你实际上是重新创建了 mat,但是你用 RGB->BGR 转换的数据覆盖了数据。由于您使用指针将数据传递给您的“垫子”,因此如果您覆盖垫子中的数据,您也会更改“图像->数据”。

因此,我预计性能不会低于:

cv::Mat mat = cv::Mat(image->height, image->width, CV_8UC3, image->data);
cv::Mat mat2;
cv::cvtColor(mat, mat2, CV_RGB2BGR);
//Work with mat 2 now

您写入新数据而不是覆盖。这应该承担相同的性能成本...... 我不知道你的图像在颜色转换后有什么打算,但即使性能不同,它也可能对整体产生轻微的影响。

【讨论】:

以上是关于使用从缓冲区复制的图像更改 cv::Mat 会影响原始图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用模板函数从缓冲区(T* 数据数组)创建 cv::Mat?

如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?

将 arm_compute::Image 转换为 cv::Mat

cv::Mat 类是不是存在设计缺陷?

从 3d 数组创建 cv::Mat 图像

如何直接在boost共享内存中编写opencv cv :: Mat图像