我正在阅读代码并发现:
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);
哪个更好?它们是一样的吗?
答案 0 :(得分:2)
编译时第二个版本将失败。 L.data
是uchar *
,无法静态投放到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不同,它只能为您提供指向第一行的指针。这可以节省您计算以下行之间的步骤,这是非常频繁的错误来源。