我有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。
否则你会如何建议这样做以减少被复制的数据量。
由于
答案 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
的构造,您将得到一个没有任何数据副本的单通道灰色图像。