2012-03-13 110 views
0

我需要创建一个CV ::垫从一个缓冲区,但我不希望的数据被共享,所以不能使用垫(高度,宽度,类型,数据)构造:操作cv :: 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类型的Mat的缓冲区,它只是int的缓冲区,并没有什么区别?

回答

1

是的,CV ::垫内部缓冲区只是一个数据块 - 与他们无关,你将(只是不释放他们!)

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

有一个在cv::Mat文档

+0

在我的情况下对“外来数据”的话题,在多方面的问题并不适用,所以我想我不必担心。至于这个话题,我只在该页面发现了一个'foreign',它适用于共享一个缓冲区的结构。不管怎样,谢谢! – neuviemeporte 2012-03-14 08:20:18

相关问题