学习目标:
在图像处理中,由于您每秒处理大量操作,所以您的代码不仅要提供正确的解决方案,还要以最快的方式进行处理。
1、衡量你的代码的性能;
2、提高代码性能的一些技巧;
3、学习函数:cv2.getTickCount,cv2.getTickFrequency等。
除了OpenCV,Python还提供了一个有助于测量执行时间的模块时间。 另一个模块配置文件有助于获得有关代码的详细报告,例如代码中每个函数占用了多少时间,函数被调用了多少次等等。但是,如果您使用的是IPython,则所有这些功能都集成在一个用户友好 方式。 我们会看到一些重要的内容,有关更多详细信息,请查看附加资源部分中的链接。
1、用OpenCV测量性能
①、cv2.getTickCount函数---返回参考事件(如瞬间机器打开)到调用此函数之后的时钟周期数。 所以如果你在函数执行前后调用它,你会得到用于执行函数的时钟周期数。
②、cv2.getTickFrequency函数---返回时钟周期的频率或每秒钟的时钟周期数。 因此,要在几秒钟内找到执行时间,您可以执行以下操作:
Example1(cv2.getTickCount函数的使用):
e1 = cv2.getTickCount()
# 代码执行
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()
我们将用下面的例子来演示。 以下示例应用中值滤波,奇数大小的内核范围为5至49.
#coding:utf8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('F:/picture.jpg')
e1 = cv2.getTickCount()
for i in range(5, 49, 2):
img1 = cv2.medianBlur(img1, i)
e2 = cv2.getTickCount()
t = (e2 - e1)/cv2.getTickFrequency()
print (t)
输出:
0.29563351721527875
注意:也可以用时间模块做同样的事情。 使用time.time()函数而不是cv2.getTickCount。 然后取两次的差别。如下:
#coding:utf8
import cv2
import time
img1 = cv2.imread('F:/picture.jpg')
e1 = time.time()
for i in range(5, 49, 2):
img1 = cv2.medianBlur(img1, i)
e2 = time.time()
t = (e2 - e1)
print (t)
输出:
0.2426450252532959
2、OpenCV中的默认优化
许多OpenCV功能都使用SSE2,AVX等进行优化。它还包含未优化的代码。 所以如果我们的系统支持这些功能,我们应该利用它们(几乎所有的现代处理器都支持它们)。 编译时默认启用。 因此,OpenCV在启用时运行优化的代码,否则它会运行未优化的代码。 您可以使用cv2.useOptimized()检查是否启用/禁用,并使用cv2.setUseOptimized()启用/禁用它。 我们来看一个简单的例子。
①、使用优化:
#coding:utf8
import cv2
import time
cv2.setUseOptimized(True)
img1 = cv2.imread('F:/picture.jpg')
e1 = time.time()
for i in range(5, 49, 2):
img1 = cv2.medianBlur(img1, i)
e2 = time.time()
t = (e2 - e1)
print (t)
输出:
0.24064350128173828
②、禁止优化
#coding:utf8
import cv2
import time
cv2.setUseOptimized(False)
img1 = cv2.imread('F:/picture.jpg')
e1 = time.time()
for i in range(5, 49, 2):
img1 = cv2.medianBlur(img1, i)
e2 = time.time()
t = (e2 - e1)
print (t)
输出:
0.24367284774780273
注意:优化相比于未优化之间提速:0.003029346466064453