opencv第三天

性能测量

import numpy as np
import cv2 as cv
'''n 图像处理,由于您每秒处理大量操作,因此您的代码不仅要提供正确的解决方案,而且还要以最快的方式提供解决方案,这是强制性的。
 因此,在本章中,您将学习:
    衡量代码的性能。
    一些提高代码性能的技巧。
您将看到这些函数:cv.getTickCount、cv.getTickFrequency 等。
除了 OpenCV,Python 还提供了一个模块时间,有助于测量执行时间。 另一个模块配置文件有助于获得关于代码的详细报告,
例如代码中每个函数花费了多少时间,函数被调用了多少次等。但是,如果您使用的是 IPython,所有这些功能都集成在用户中 -友好的方式。 我们将看到一些重要的内容,有关更多详细信息,请查看附加资源部分中的链接。'''

'''使用 OpenCV 测量性能
cv.getTickCount 函数返回从参考事件(如机器开启的那一刻)到调用此函数的那一刻的时钟周期数。
cv.getTickFrequency 函数返回(cpu)时钟周期的频率,或每秒的时钟周期数。 
因此,要以秒为单位查找执行时间,您可以执行以下操作:执行时间=总时钟次数/一秒内的时钟次数即频率(单位秒)
        e1 = cv.getTickCount()
        # your code execution
        e2 = cv.getTickCount()
        time = (e2 - e1)/ cv.getTickFrequency()'''



img1 = cv.imread('1.jpg')
e1 = cv.getTickCount()
for i in range(5,49,2):
    # des=cv.medianBlur(src,ksize) 中值滤波 ksize要是比1大的奇数!类似于avgpool和maxpool即:
    #以每个点为核,取ksize大小的正方形大小像素,将其排序,取中值,直到遍历完,返回处理后的图至des
    # 一般来说,ksize越大,返回的图越模糊
    img1 = cv.medianBlur(img1,i)
    '''可以输入这个查看模糊效果
    cv.imshow('name', img1)
    cv.waitKey(0)
    cv.destroyAllWindows()'''

e2 = cv.getTickCount()
t = (e2 - e1)/cv.getTickFrequency()
print( t )

'''你可以用时间模块做同样的事情。 使用 time.time() 函数代替 cv.getTickCount。 然后取两次之差。
OpenCV 中的默认优化
许多 OpenCV 函数都使用 SSE2、AVX 等进行了优化。它还包含未优化的代码。 
因此,如果我们的系统支持这些功能,我们应该利用它们(几乎所有现代处理器都支持它们)。
 编译时默认启用。 所以 OpenCV 如果启用则运行优化的代码,否则运行未优化的代码。 
 您可以使用 cv.useOptimized() 检查它是否启用/禁用,并使用 cv.setUseOptimized() 启用/禁用它。
  让我们看一个简单的例子。(由于%timeit和%time只能在ipython和jupter中使用,这里就不演示了

(加it是计算多次的时间,不加
仅计算单次的时间)

  就演示cv.useOptimized()与cv.setUseOptimized(False)  '''

# check if optimization is enabled
print(cv.useOptimized())#True  默认情况下就是True

# %timeit res = cv.medianBlur(img,49)

# Disable it
cv.setUseOptimized(False)
print(cv.useOptimized())#False

# %timeit res = cv.medianBlur(img,49)
# 如您所见,优化的中值滤波比未优化的版本快 2 倍。 如果你检查它的来源,你可以看到中值过滤是 SIMD 优化的。 因此,您可以使用它在代码顶部启用优化(请记住默认情况下已启用)。

在 IPython /jupyter中测量性能
有时您可能需要比较两个类似操作的性能。其为您提供了一个神奇的命令 timeit 来执行此操作。 它多次运行代码以获得更准确的结果。 再次,它适用于测量单行代码。

例如,你知道下面哪个加法运算更好,x = 5; y = x**2, x = 5; y = x*x, x = np.uint8([5]); y = x*x,还是 y = np.square(x)? 我们将在 IPython shell 中使用 timeit 找出答案。

 

你可以看到, x = 5 ; y = x*x 最快,与 Numpy 相比快 好几倍。 如果您还考虑阵列创建,它可能会快更多 倍。 很酷,对吧? *(Numpy 开发人员正在解决这个问题)*

笔记
Python 标量运算比 Numpy 标量运算快。 因此对于包含一两个元素的操作,Python 标量优于 Numpy 数组。 当数组的大小稍微大一点时,Numpy 具有优势。

我们将再尝试一个例子。 这一次,我们将比较同一图像的 cv.countNonZero() 和 np.count_nonzero() 的性能。

看,OpenCV 函数比 Numpy 函数快近 25 倍。

笔记
通常,OpenCV 函数比 Numpy 函数快。 因此,对于相同的操作,首选 OpenCV 函数。 但是,可能会有例外,尤其是当 Numpy 使用视图而不是副本时。

更多 IPython 魔术命令
还有其他几个神奇的命令可以测量性能、分析、行分析、内存测量等。它们都有很好的文档记录。 因此,此处仅提供指向这些文档的链接。 建议有兴趣的读者尝试一下。

性能优化技术
有几种技术和编码方法可以发挥 Python 和 Numpy 的最大性能。 此处仅注明相关内容,并提供重要来源的链接。 这里要注意的主要是,首先尝试以简单的方式实现算法。 一旦它开始工作,就对其进行分析,找到瓶颈并对其进行优化。

尽可能避免在 Python 中使用循环,尤其是双/三循环等。它们天生就很慢。
尽可能将算法/代码矢量化,因为 Numpy 和 OpenCV 针对矢量运算进行了优化。
利用缓存一致性。
除非必要,否则切勿复制数组。 尝试改用视图。 数组复制是一项昂贵的操作。
如果您的代码在执行完所有这些操作后仍然很慢,或者如果不可避免地使用大循环,请使用 Cython 等其他库来使其更快。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值