Python-OpenCV —— 技巧篇之评估与优化

在做图像处理时,你不仅要保证你的代码是正确的,还要保证运行的速度是否最快,根据Python之禅 There should be one and preferably only one obvious way to do it.你需要检查你的代码。

评估代码时间

import cv2
start = cv2.getTickCount()
# 这里写代码...
end = cv2.getTickCount()
print((end - start) / cv2.getTickFrequency())

这段代码就是用来测量程序运行时间的(单位:s),其中cv2.getTickCount()函数得到电脑启动以来的时钟周期数,cv2.getTickFrequency()返回你电脑的主频,前后相减再除以主频就是你代码的运行时间(这样解释并不完全准确,但能理解就行)。另外,也可以用Python中的time模块计时:

import time
start = time.clock()
# 这里写代码...
end = time.clock()
print(end - start)

OpenCV优化

# 用cv2.useOptimized()检查是否可以优化
In [5]: cv2.useOptimized()
Out[5]: True

In [6]: %timeit res = cv2.medianBlur(img,49)
10 loops, best of 3: 34.9 ms per loop

# 禁止优化
In [7]: cv2.setUseOptimized(False)

In [8]: cv2.useOptimized()
Out[8]: False

In [9]: %timeit res = cv2.medianBlur(img,49)
10 loops, best of 3: 64.1 ms per loop
#可以看到,前后相差一倍运行时间

Python中的性能优化

举例说明

In [10]: x = 5

In [11]: %timeit y=x**2
10000000 loops, best of 3: 73 ns per loop

In [12]: %timeit y=x*x
10000000 loops, best of 3: 58.3 ns per loop

In [15]: z = np.uint8([5])

In [17]: %timeit y=z*z
1000000 loops, best of 3: 1.25 us per loop

In [19]: %timeit y=np.square(z)
1000000 loops, best of 3: 1.16 us per loop

可以看到, x = 5 ; y = x*x是最快的,比Numpy快约20倍。

总结:Python标量操作速度比Numpy标量操作快得多。对于操作一两个元素,使用Python,大数组时用Numpy
举例说明2

In [35]: %timeit z = cv2.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。

性能优化技巧

  1. 在Python中尽量避免使用循环、尤其是多重循环,机器耗费时间;
  2. 将算法/代码尽可能的向量话,因为Numpy和OpenCV对此进行了优化;
  3. 利用缓存一致性;
  4. 不要做数组的复制,这极其耗费资源。

你可能感兴趣的:(Python-OpenCV —— 技巧篇之评估与优化)