OpenCV使用stride从数组生成cv :: Mat

时间:2014-05-22 13:19:42

标签: c++ opencv

我有RGBA格式的像素数据数组。虽然我已经使用GPU将这些数据转换为灰度(因此所有4个通道都相同)。

我现在想在OpenCV中使用这个灰度数据,我不想存储4个相同数据的副本。是否可以通过指定步幅从此像素阵列创建cv :: Mat结构。 (即每4字节仅读出一次)

我目前正在使用

GLubyte* Img = stuff from GPU;
cv::Mat tmp(height, width, CV_8UC4, Img);

但是这会复制所有数据,还是将现有指针包装成cv :: Mat而不复制它?如果它没有复制包装,那么我将很乐意使用标准的c ++例程将我想要的数据从Img复制到一个新的内存部分,然后将其包装为cv :: Mat。

否则你会如何建议这样做以减少被复制的数据量。

由于

1 个答案:

答案 0 :(得分:5)

您正在使用的代码

cv::Mat tmp(rows, cols, CV_8UC4, dataPointer);

不会执行任何副本,只会分配data个实例的Mat字段。

如果你可以使用4个频道的矩阵,那就继续吧。 否则,如果您更喜欢使用单通道矩阵,那么只需使用函数cv::cvtColor()创建一个具有单个通道的新图像(但随后您将在内存中获得一个额外的图像并支付CPU周期转换):

cv::Mat grey;
cv::cvtColor(tmp, grey, CV_BGR2GRAY);

最后,最后一件事:如果您可以预先对彩色平面进行去交错(例如在GPU上)并使用[蓝色平面,绿色平面,红色平面]获得一些图像,那么您可以将CV_8UC1作为图像传递键入tmp的构造,您将得到一个没有任何数据副本的单通道灰色图像。