2016-07-05 184 views
1

鉴于opencv::Mat m1,m2,我想检查m1[i][j]m2[i][j]是否相等。at()和row()。col()之间的区别

我已经看到有两种方法可以做到这一点:

if(m1.row(i).col(j) == m2.row(i).col(j)) 

和:

if(m1.at<float>(i,j)==m2.at<float>(i,j)) 

注意两个m1m2是SIFT矩阵描述符(所以float是元素类型)。

我的问题是:两种访问方法有什么区别?

回答

2

虽然两个操作的最终结果是一样的,第一个是更昂贵:

  • m1.row(i)创建Mat对象代表一行i,然后
  • col(j)上被调用返回的Matm1.row(i)以获得代表对象的单元素Mat(i, j)
  • 将相同的操作序列应用于m2
  • 两个Mat对象进行比较与==
  • 四个临时对象得到解除了分配

相比之下,m1.at<float>(i,j)简单地返回一个float,然后把它相比于其他浮动,不会造成任何额外的对象。

+0

但是第一种解决方案的优点是我们不需要在编译时知道'Mat'类型。那是对的吗? – justHelloWorld

+0

@justHelloWorld这是正确的,被比较的对象类型是“Mat”,所以你不需要在编译时显式声明它。 – dasblinkenlight

相关问题