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()函数返回时钟周期的频率或者每秒的时钟周期数。通常我们可以将其理解为一个常数。

这里要说明一下,时钟周期是一个时间单位,我们在已知时钟周期数和每秒的时钟周期数时,就可以通过以下公式,将时间单位有时钟周期转化为秒。
python OpenCV如何加载本地字体 opencv-python文档_时钟周期
代码示例:

# 衡量中位数过滤性能
# 这里不必纠结中位数衡量结果是什么(实际上是用来平滑图像的过程,以后会了解),只要熟悉衡量代码行性能的过程就好
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 的最大性能。这里只注明相关信息,并提供重要信息来源的链接。这里要注意的主要事情是,首先尝试以一种简单的方式实现算法。一旦它运行起来,分析它,找到瓶颈并优化它们。

  1. 尽量避免在Python中使用循环,尤其是双/三重循环等。它们本来就很慢。
  2. 由于Numpy和OpenCV已针对向量运算进行了优化,因此将算法/代码向量化到最大程度。
  3. 利用缓存一致性。
  4. 除非需要,否则切勿创建数组的副本。尝试改用视图。数组复制是一项昂贵的操作。

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。

其他资源

  1. Python优化技术:http://wiki.python.org/moin/PythonSpeed/PerformanceTips
  2. Scipy讲义- 高级Numpy:http://scipy-lectures.github.io/advanced/advanced_numpy/index.html#advanced-numpy
  3. IPython中的时序和性能分析:http://pynash.org/2013/03/06/timing-and-profiling/