OpenCV-Python中文官方文档 学习笔记
说明:
首先介绍一下我学习的OpenCV-Python中文官方文档(引用该文档的前言):
写在前面的话
2014年段力辉在当时已翻译过OpenCV 3.0,但时隔五年,如今的OpenCV 4.1中许多函数和内容已经有所更新,因此有必要对该官方文档再进行一次翻译。
翻译过程中难免有所疏漏,如发现错误,希望大家指出,谢谢支持。
OpenCV-Python Tutorials英文官方文档:
https://docs.opencv.org/master/d6/d00/tutorial_py_root.html
其次介绍以下学习笔记的主要内容:
鉴于该文档已经相当完整,我所整理的笔记主要包含对文档内容的理解和拓展。大家在学习文档时可以将该笔记作为参考,希望它可以对你有帮助。
第三章 核心操作
3.3 性能衡量和提升技术
使用OpenCV衡量性能
我们需要衡量代码的性能,而最好的衡量方式就是在数值上体现代码的性能。在这里我们使用代码执行的时间做为这个数值。
所以我们使用OpenCV提供的cv.getTickCount()函数和cv.getTickFrequency()函数来获取代码行执行的时间,从而衡量代码的性能。
函数解析:
cv.getTickCount()函数从参考事件(如打开Python编辑器的那一刻)到调用此函数那一刻之间的时钟周期数。通常我们在代码行前后调用它,然后我们就得到了代码行执行所用的时钟周期数。
cv.getTickFrequency()函数返回时钟周期的频率或者每秒的时钟周期数。通常我们可以将其理解为一个常数。
这里要说明一下,时钟周期是一个时间单位,我们在已知时钟周期数和每秒的时钟周期数时,就可以通过以下公式,将时间单位有时钟周期转化为秒。
代码示例:
# 衡量中位数过滤性能
# 这里不必纠结中位数衡量结果是什么(实际上是用来平滑图像的过程,以后会了解),只要熟悉衡量代码行性能的过程就好
import cv2 as cv
# import time 当然我们也可以使用Python自带的time函数计算代码行执行时间
img1 = cv.imread('messi5.jpg')
e1 = cv.getTickCount()
# t1 = time.time()
for i in range(5,49,2):
img1 = cv.medianBlur(img1,i)
e2 = cv.getTickCount()
# t2 = time.time()
t = (e2 - e1)/cv.getTickFrequency()
# T = t2 - t1
print(t)
# print(T)
OpenCV中的默认优化
大部分OpenCV函数自带优化代码,并且默认启用优化。我们可以利用函数cvUseoptimized()检查是否启用/禁用和函数cvSetuseoptimized()启用/禁用它。
代码示例:
# 在启用/禁用优化状态下,观察代码性能变化
import cv2 as cv
import time
img1 = cv.imread('messi5.jpg')
e1 = cv.getTickCount()
# t1 = time.time()
for i in range(5,49,2):
img1 = cv.medianBlur(img1,i)
e2 = cv.getTickCount()
# t2 = time.time()
t = (e2 - e1)/cv.getTickFrequency()
# T = t2 - t1
print(t)
# print(T)
#检测优化是否启用
flag = cv.useOptimized()
print(flag)
#关闭优化
cv.setUseOptimized(False)
flag = cv.useOptimized()
print(flag)
#再次执行代码
img1 = cv.imread('messi5.jpg')
e1 = cv.getTickCount()
# t1 = time.time()
for i in range(5,49,2):
img1 = cv.medianBlur(img1,i)
e2 = cv.getTickCount()
# t2 = time.time()
t = (e2 - e1)/cv.getTickFrequency()
# T = t2 - t1
print(t)
# print(T)
在IPython中衡量性能
更多IPython魔术命令
鉴于我们较少使用IPython,在此不做解释拓展。
IPython:https://baike.baidu.com/item/ipython/6817092?fr=aladdin
性能优化技术
有几种技术和编码方法可以充分利用 Python 和 Numpy 的最大性能。这里只注明相关信息,并提供重要信息来源的链接。这里要注意的主要事情是,首先尝试以一种简单的方式实现算法。一旦它运行起来,分析它,找到瓶颈并优化它们。
- 尽量避免在Python中使用循环,尤其是双/三重循环等。它们本来就很慢。
- 由于Numpy和OpenCV已针对向量运算进行了优化,因此将算法/代码向量化到最大程度。
- 利用缓存一致性。
- 除非需要,否则切勿创建数组的副本。尝试改用视图。数组复制是一项昂贵的操作。
Numpy 副本和视图:https://www.runoob.com/numpy/numpy-copies-and-views.html
即使执行了所有这些操作后,如果你的代码仍然很慢,或者不可避免地需要使用大循环,请使用Cython等其他库来使其更快。
Cython入门教程:https://www.jianshu.com/p/cfcc2c04a6f5
Cython是一个编程语言,它通过类似Python的语法来编写C扩展并可以被Python调用.既具备了Python快速开发的特点,又可以让代码运行起来像C一样快,同时还可以方便地调用C library。
其他资源
- Python优化技术:http://wiki.python.org/moin/PythonSpeed/PerformanceTips
- Scipy讲义- 高级Numpy:http://scipy-lectures.github.io/advanced/advanced_numpy/index.html#advanced-numpy
- IPython中的时序和性能分析:http://pynash.org/2013/03/06/timing-and-profiling/