我有一组 RGBA 格式的像素数据。尽管我已经使用 GPU 将此数据转换为灰度(因此所有 4 个 channel 都是相同的)。
我现在想在 OpenCV 中使用这个灰度数据,我不想存储相同数据的 4 个拷贝。是否可以通过指定步幅从此像素数组创建 cv::Mat 结构。 (即只读出每 4 个字节)
我正在使用
GLubyte* Img = stuff from GPU;
cv::Mat tmp(height, width, CV_8UC4, Img);
但这会复制所有数据,还是将现有指针包装到 cv::Mat 中而不复制它?如果它在没有复制的情况下包装,那么我将很乐意使用标准 C++ 例程将我想要的数据从 Img 复制到新的内存部分,然后将其包装为 cv::Mat。
否则您会如何建议这样做以减少被复制的数据量。
谢谢
最佳答案
您正在使用的代码
cv::Mat tmp(rows, cols, CV_8UC4, dataPointer);
不执行任何复制,仅分配 Mat
实例的 data
字段。
如果您可以使用 4 channel 矩阵,那就继续吧。
否则,如果您更喜欢使用 1 channel 矩阵,则只需使用函数 cv::cvtColor()
创建一个具有单个 channel 的新图像(但随后您将在内存并为转换支付 CPU 周期):
cv::Mat grey;
cv::cvtColor(tmp, grey, CV_BGR2GRAY);
最后,最后一件事:如果您可以预先对颜色平面进行去交错处理(例如在 GPU 上)并使用 [blue plane, green plane, red plane] 获得一些图像,那么您可以通过 CV_8UC1
作为 tmp
构造中的图像类型,您将获得没有任何数据拷贝的单 channel 灰度图像。
关于c++ - OpenCV 使用步幅从数组生成 cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23808049/