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

Sys*_*123 2 c++ opencv

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

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

我目前正在使用

GLubyte* Img = stuff from GPU;
cv::Mat tmp(height, width, CV_8UC4, Img);
Run Code Online (Sandbox Code Playgroud)

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

否则,您会如何建议这样做以减少复制的数据量.

谢谢

san*_*iso 5

您正在使用的代码

cv::Mat tmp(rows, cols, CV_8UC4, dataPointer);
Run Code Online (Sandbox Code Playgroud)

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

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

cv::Mat grey;
cv::cvtColor(tmp, grey, CV_BGR2GRAY);
Run Code Online (Sandbox Code Playgroud)

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