【发布时间】:2014-05-22 13:19:42
【问题描述】:
我有一个 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。
否则,您如何建议这样做以减少被复制的数据量。
谢谢
【问题讨论】:
-
所以,这会复制所有 4 个频道,但您只需要/想要一个? (到目前为止,它只复制 pointer,而不是数据)
-
是的,这将复制所有 4 个通道,我只想要 1 个。我不确定这是复制指针还是数据。
-
仅指针。它是一个借来的指针,所以它不会分配内存或复制任何东西。也许在上面做一个 cvtColor 到灰度?
-
哦,请把上面的宽、高倒过来。
-
啊啊,解决了。感谢您指出。我已经有一个灰度图像,因此浪费 CPU 周期将灰度转换为灰度似乎毫无意义。我只是将我想要的值复制到一个新的缓冲区并将其转换为 cvMat。谢谢