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

时间:2012-08-30 17:56:30

标签: image-processing opencv

我有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(我的图像缓冲区)不变。我怎么能这样做?

1 个答案:

答案 0 :(得分:5)

我认为(我不确定)如果您使用cv::cvtColor(mat, mat, CV_RGB2BGR);,您实际上会重新创建mat,但是您使用RGB-> BGR转换数据覆盖数据。由于您使用指针将数据传递到“mat”,如果您覆盖mat中的数据,您也会更改“image-> data”。

因此,我认为表现不如:

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

您可以编写新数据,而不是覆盖。这应该具有相同的性能成本...... 我不知道在颜色转换后你的图像有什么计划,但即使性能不同,它也可能会产生轻微的影响。