使用从缓冲区复制的图像更改 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)?