如何在没有循环的情况下规范化opencv Mat的行?

时间:2012-05-20 13:13:28

标签: c++ opencv normalization

我是按照以下方式做到的

Mat temp, rp;    
for (int i = 0; i <= descriptors1.rows - 1; i++)
{
    normalize(descriptors1.row(i), temp);
    rp = normd1.rowRange(i, i+1);
    temp.copyTo(rp);
}

上面的描述符1是Mat。

但使用循环非常耗时。有没有更好的方法来做到这一点?

问候。

1 个答案:

答案 0 :(得分:1)

循环没有问题。与你在Matlab中听到的不一样,它们在C ++中并不慢!如果要在非常时间敏感的应用程序中使用它,那么您可以优化循环以在每次迭代中删除i <= descriptors1.rows - 1检查。使用temp也是不必要的,您可以直接将normd1.rowRange传递给normalize以节省时间,只需一行即可。

修改:您可以使用此方法normalize(A.row(i), _OutputArray(B.ptr(i), B.cols))_OutputArray的模板版本。在每次迭代中编写循环的方式descriptors1.rows - 1应该进行评估,因为编译器看到rows不是常量,并且很可能不理解循环中的函数不会改变它。所以我会改为:

for (i = descriptors1.rows - 1; i >= 0; i--)

但是,您需要检查编译器生成的代码以确保它已经过优化,并且还要考虑循环展开。如果这真的是代码的瓶颈,那么谷歌可以找到很多关于优化循环的材料。