初始化矩阵和访问其数据的不同方法

时间:2014-05-07 16:33:13

标签: c++ opencv matrix

我正在阅读代码并发现:

Mat L(3, 3, DataType<double>::type);
double *pL = L.ptr<double>(0);

但我习惯做

Mat L(3, 3, CV_64F);
double* pL = static_cast<double*>(L.data);

哪个更好?它们是一样的吗?

2 个答案:

答案 0 :(得分:2)

编译时第二个版本将失败。 L.datauchar *,无法静态投放到double *。我想你的意思是reinterpret_cast。查看When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

Mat L(3, 3, CV_64F);
double* pL = reinterpret_cast<double*>(L.data); 

在这种意义上,它与第一个版本具有相同的效果,即指针double *pL指向Mat L的数据。只需使用您更熟悉的那个。

答案 1 :(得分:2)

.ptr()方法来取代.data方法。两者的结果是相同的(在修复了@herohuyongtao提到的bug之后),但.ptr()方法稍好一些。

1)C ++为你提供了很多自由来做几乎所有事情。铸造是这种自由的一部分。但它有一个代价:工作是在运行时而不是编译时完成的。它可以很好地隐藏编译器中的错误。出于这个原因,强烈建议不要使用铸造,除非没有别的办法。

2)使用L.ptr&lt; double&gt;(i)将指向行&#39; i&#39;,与L.data不同,它只能为您提供指向第一行的指针。这可以节省您计算以下行之间的步骤,这是非常频繁的错误来源。