说明:
首先介绍一下我学习的OpenCV-Python中文官方文档(引用该文档的前言):
写在前面的话
2014年段力辉在当时已翻译过OpenCV 3.0,但时隔五年,如今的OpenCV 4.1中许多函数和内容已经有所更新,因此有必要对该官方文档再进行一次翻译。
翻译过程中难免有所疏漏,如发现错误,希望大家指出,谢谢支持。
OpenCV-Python Tutorials英文官方文档:
https://docs.opencv.org/master/d6/d00/tutorial_py_root.html
其次介绍以下学习笔记的主要内容:
鉴于该文档已经相当完整,我所整理的笔记主要包含对文档内容的理解和拓展。大家在学习文档时可以将该笔记作为参考,希望它可以对你有帮助。
我们需要衡量代码的性能,而最好的衡量方式就是在数值上体现代码的性能。在这里我们使用代码执行的时间做为这个数值。
所以我们使用OpenCV提供的cv.getTickCount()函数和cv.getTickFrequency()函数来获取代码行执行的时间,从而衡量代码的性能。
函数解析:
cv.getTickCount()函数从参考事件(如打开Python编辑器的那一刻)到调用此函数那一刻之间的时钟周期数。通常我们在代码行前后调用它,然后我们就得到了代码行执行所用的时钟周期数。
cv.getTickFrequency()函数返回时钟周期的频率或者每秒的时钟周期数。通常我们可以将其理解为一个常数。
这里要说明一下,时钟周期是一个时间单位,我们在已知时钟周期数和每秒的时钟周期数时,就可以通过以下公式,将时间单位有时钟周期转化为秒。
时 间 t / 秒 = 时 钟 周 期 数 N 每 秒 的 时 钟 周 期 数 n 时间t/秒 = \frac{时钟周期数N}{每秒的时钟周期数n} 时间t/秒=每秒的时钟周期数n时钟周期数N
代码示例:
# 衡量中位数过滤性能
# 这里不必纠结中位数衡量结果是什么(实际上是用来平滑图像的过程,以后会了解),只要熟悉衡量代码行性能的过程就好
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函数自带优化代码,并且默认启用优化。我们可以利用函数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:https://baike.baidu.com/item/ipython/6817092?fr=aladdin
有几种技术和编码方法可以充分利用 Python 和 Numpy 的最大性能。这里只注明相关信息,并提供重要信息来源的链接。这里要注意的主要事情是,首先尝试以一种简单的方式实现算法。一旦它运行起来,分析它,找到瓶颈并优化它们。
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。
其他资源