像这样操纵cv :: Mat的内部缓冲区是否安全?

时间:2012-03-13 17:36:49

标签: c++ opencv

我需要从缓冲区创建一个cv :: Mat,但我不希望共享数据,所以我不能使用Mat(高度,宽度,类型,数据)构造函数:

int data[100];
cv::Mat m;
m.create(10, 10, CV_32SC1); // allocate own buffer for m
for (size_t i = 0; i < 100; ++i)
{
    reinterpret_cast<int*>(m.data)[i] = data[i];
}

我需要转换内部缓冲区(总是uchar *)才能直接复制我想要的类型的数据(在本例中为int),它似乎工作。但是,我记得文档首选使用uchar *执行所有操作的方法,即将源缓冲区转换为uchar *并使用名为stepWidth的参数在uchar * -units中获取正确的偏移量。我是否会以相反的方式解决这个问题,或者CV_32SC1类型的缓冲区是否只是int的缓冲区,它没有什么区别?

1 个答案:

答案 0 :(得分:1)

是的,cv :: Mat内部缓冲区只是一个数据块 - 可以随意使用它们(只是不要释放它们!)

对于多维数组(例如图像),唯一的复杂性是每个新行不一定直接来自最后一行的末尾。 行被填充,因此它们总是以32位(64位构建的64位)边界开始 - 所以你需要使用数据(行)。

cv::Mat文档

中有关于“外国数据”的主题