c++ - OpenCV 使用步幅从数组生成 cv::Mat

标签 c++ opencv

我有一组 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/

相关文章:

python - Opencv 和 python 参数中的方括号

python - cv2 CascadeClassifier 参数

python - Python:变量似乎没有在while循环中重新分配+分配前引用的局部变量

c++ - 删除图像中的小背景(黑色)区域

c++ - 系统找不到指定的文件 Visual Studio 2015

c++ - Qt Creator - uic 不会在构建时自动运行

python-3.x - OpenCV错误:(-215:断言失败)(mtype == CV_8U || mtype == CV_8S)&& _mask.sameSize(* psrc1)在函数 'cv::binary_op'中

java - Java和C++之间的套接字通信

C++ for循环初始化计数器错误

c++ - X3 : Is this parser, *(char - eol),消耗所有行?