1.使用OpenCV测量性能
1.1常用函数:
retval=cv.getTickCount()
retval=cv.getTickFrequency()
1.2固定写法:
# use getTickCount() to get time e1 = cv.getTickCount() # CODE e2 = cv.getTickCount() time = (e2 - e1)/cv.getTickFrequency() print(time) #结果以秒为单位
# 使用time.clock()计时 start = time.clock() # CODE elapsed = (time.clock() - start)
print(time) #结果以秒为单位
2.OpenCV中的默认优化
许多OpenCV函数都是使用SSE2、AVX等进行优化的。它还包含未加密的代码。因此,如果我们的系统支持这些特性,我们就应该利用它们(几乎所有现代处理器都支持它们)。编译时默认启用它。因此,如果OpenCV启用了优化代码,它将运行优化后的代码,否则它将运行未经优化的代码。可以使用cv.useoptimization()检查是否启用/禁用了它,并使用cv.setuseoptimization()启用/禁用它。
一般情况下 OpenCV 的函数要比 Numpy 函数快。所以对于相同的操 作最好使用 OpenCV 的函数。当然也有例外,尤其是当使用 Numpy 对视图 (而非复制)进行操作时。
3.在Ipython中检测效率
有时您可能需要比较两个类似操作的性能。IPython提供了一个神奇的命令timeit来执行此操作。它运行代码较少的次数获得更精确的结果。同样,它们也适用于测量单行代码。
Python标量操作比Numpy标量操作快。因此,对于包含一两个元素的操作,Python标量优于Numpy数组。当数组的大小稍微大一点时,Numpy就会发挥作用。
我们试一个例子。这一次,我们将比较相同图像的cv.countNonZero()和np.count_nonzero()的性能。
In [35]: %timeit z = cv.countNonZero(img) 100000 loops, best of 3: 15.8 us per loop In [36]: %timeit z = np.count_nonzero(img) 1000 loops, best of 3: 370 us per loop
OpenCV函数比Numpy函数快25倍。
通常,OpenCV函数比Numpy函数更快。因此,对于相同的操作,OpenCV函数是首选的。但是,也有例外,特别是当Numpy使用视图而不是副本时。
4.效率优化
- 尽量避免使用循环,尤其双层三层循环,它们天生就是非常慢的。
- 算法中尽量使用向量操作,因为 Numpy 和 OpenCV 都对向量操作进行 了优化。
- 利用高速缓存一致性。
- 没有必要的话就不要复制数组。使用视图来代替复制。数组复制是非常浪 费资源的。