在阅读扫描图像教程时,我会描述The iterator (safe) method,然后有The efficient way。
但是根据我对std::vector
的经验,例如,迭代器和原始指针在速度方面基本相同 - 我怀疑生成的程序集/可执行代码在发布版本中甚至是不同的。 cv :: Mat也不是这样吗?因为它在教程中表达的方式,暗示MatIterator_更安全,但更慢。
另外,如果速度较慢,它的速度会慢多少百分比?它是否以有意义的方式变慢,比如慢10%,或者更慢0.1%?
注意:我正在讨论发布版本,并启用了所有优化功能。在Debug构建中,迭代器很可能有断言和什么不是。
答案 0 :(得分:0)
我找到了效果比较at the end of the same tutorial,因此我将在此处发布结果:
表现差异
为了获得最佳结果,请编译程序并以您自己的速度运行它。为了更好地展示差异,我使用了相当大的(2560 X 1600)图像。此处介绍的性能适用于彩色图像。为了得到更准确的值,我将函数调用得到的值平均了100次。
高效方式79.4717毫秒
迭代器83.7201毫秒
飞行中RA 93.7878毫秒
LUT功能32.5759毫秒
我们可以总结一些事情。如果可能,请使用已经制作的 OpenCV的功能(而不是重新发明)。最快的方法 原来是LUT功能。这是因为OpenCV库 通过英特尔螺纹构建模块启用多线程。然而, 如果你需要写一个简单的图像扫描更喜欢指针方法。 迭代器是一个更安全的赌注,但速度相当慢。使用 用于全图扫描的动态参考访问方法是最多的 调试模式很昂贵。在释放模式下,它可能击败迭代器 是否接近,但它确实牺牲了安全性 迭代器的特征。
这意味着迭代器方法在这些性能测试中比原始指针慢5%。