这样操作cv::Mat的内部缓冲区安全吗

Is it safe to manipulate the internal buffer of a cv::Mat like this?

本文关键字:内部 缓冲区 安全 Mat 操作 cv      更新时间:2023-10-16

我需要从缓冲区创建一个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*为单位的正确偏移量。相反,我会遇到麻烦吗?还是CV_32SC1-型Mat的缓冲区只是int的缓冲区,没有什么区别?

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

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

简历中有一个关于"外国数据"的主题::Mat docs