OpenCV-Python——第8章:程序性能检测及优化

目录

1 使用OpenCV检测程序效率      2 OpenCV中的默认优化      3 在Ipython中检测效率      4 效率优化技术


1 使用OpenCV检测程序效率

cv2.getTickCount()

函数返回从参考点到这个函数被执行的时钟数。

cv2.getTickFrequency()

返回时钟频率,或者说每秒钟的时钟数。

举个例子:

import cv2
import numpy as np
import time

# 使用cv2.getTickCount()计时
img1 = cv2.imread('logo.jpg')
t1 = cv2.getTickCount()
for i in range(5, 49, 2):
    img1 = cv2.medianBlur(img1, i)
t2 = cv2.getTickCount()
t = (t2 - t1)/cv2.getTickFrequency()
print('Result I got is ', t, ' seconds')

# 使用time.clock()计时
img2 = cv2.imread('logo.jpg')
start = time.clock()
for i in range(5, 49, 2):
    img2 = cv2.medianBlur(img2, i)
elapsed = (time.clock() - start)
print('Result I got is ', elapsed, ' seconds')

结果如下:

 

2 OpenCV中的默认优化 

OpenCV 中的很多函数都被优化过(使用 SSE2,AVX 等)。也包含一些 没有被优化的代码。如果我们的系统支持优化的话要尽量利用只一点。在编译时 优化是被默认开启的。因此 OpenCV 运行的就是优化后的代码,如果你把优化 关闭的话就只能执行低效的代码了。

cv2.useOptimized()

查看优化是否被开启了

cv2.setUseOptimized()

 用于开启或关闭优化

举一个例子

OpenCV-Python——第8章:程序性能检测及优化_第1张图片

额。。。,好像并没有优化,目前不知道为什么。

 

3 在Ipython中检测效率

在Ipython中可以使用%time命令让代码运行好几次从而得到一个准确的(运行)时间。它也可以被用来测试单行代码。

例如:

OpenCV-Python——第8章:程序性能检测及优化_第2张图片

可以看出Python 的标量计算比 Nump 的标量计算要快。对于仅包含一两个 元素的操作 Python 标量比 Numpy 的数组要快。但是当数组稍微大一点时 Numpy 就会胜出了。

我们来再看几个例子。我们来比较一下 cv2.countNonZero() 和 np.count_nonzero()。

OpenCV-Python——第8章:程序性能检测及优化_第3张图片

很明显cv2.countNonZero() 比 np.count_nonzero()快了30多倍。

一般情况下 OpenCV 的函数要比 Numpy 函数快。所以对于相同的操 作最好使用 OpenCV 的函数。当然也有例外,尤其是当使用 Numpy 对视图 (而非复制)进行操作时。

 

4 效率优化技术

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

你可能感兴趣的:(—OpenCV,python,opencv,运行时间,程序效率,优化)