opencv-python-学习笔记七(程序性能检测及提升)

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.效率优化

  1. 尽量避免使用循环,尤其双层三层循环,它们天生就是非常慢的。
  2. 算法中尽量使用向量操作,因为 Numpy 和 OpenCV 都对向量操作进行 了优化。
  3. 利用高速缓存一致性。
  4. 没有必要的话就不要复制数组。使用视图来代替复制。数组复制是非常浪 费资源的。

 

posted @ 2019-07-14 15:20  少灬儿郎  Views(739)  Comments(0Edit  收藏  举报