OpenCV-Python Tutorials
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
图像处理实际上是对矩阵的处理和操作,数据量巨大,每一秒钟都在进行大量的运算。如果程序代码写的不好,性能差距将会很大,代码的执行效率也会大打折扣。因此对程序的要求不仅要求结果准确,更要高效。
获取程序运行时间
OpenCV主要函数
cv2.getTickCount()
:记录从参考点到程序执行完成的时间周期数cv2.getTickFrequency()
:返回时间频率,即每秒钟的时间周期数
Python主要函数
time.time()
:获得当前时间的时间戳time.perf_counter()
:返回计时器的精准时间(系统的运行时间),包含整个系统的睡眠时间。由于返回值的参考点是未定义的,只有连续调用的结果之间的差才是有效的。
获取放大图像所需要的时间
import cv2
import time
import os
os.chdir('C:/Users/lenovo/Desktop/')
bear = cv2.imread('BearBrown.jpg')
rows, cols = bear.shape[:2]
# 测试放大图像所需要的时间
# 程序执行终止的时间 - 起始时间为程序运行时间
############### OpenCV库 ################
start = cv2.getTickCount() #函数执行前的时钟周期数
bear_dst0 = cv2.resize(bear,(cols*2,rows*3),interpolation=cv2.INTER_CUBIC) #放大图像
end = cv2.getTickCount() #函数执行完成的时间周期数
time0 = (end-start)/cv2.getTickFrequency() #获得放大图像所需要的时间
print(time0)
################ time库 #################
# time.perf_counter()函数
start1 = time.perf_counter()
bear_dst1 = cv2.resize(bear,(cols*2,rows*3),interpolation=cv2.INTER_CUBIC) #放大图像
end1 = time.perf_counter() - start1
print(end1)
# time.time()函数
start2 = time.time()
bear_dst2 = cv2.resize(bear,(cols*2,rows*3),interpolation=cv2.INTER_CUBIC) #放大图像
end2 = time.time() - start2
print(end2)
程序优化
OpenCV 中的很多函数都被优化过,但也包含一些没有被优化的代码。在编译时优化是被默认开启的。
cv2.useOptimized()
来查看优化是否被开启cv2.setUseOptimized()
:参数为True开启优化,False关闭优化。
import cv2
import time
import os
os.chdir('C:/Users/lenovo/Desktop/')
bear = cv2.imread('BearBrown.jpg')
rows, cols = bear.shape[:2]
# 测试开启和关闭所需要的运行时间
cv2.setUseOptimized(True)
print(cv2.useOptimized())
start = cv2.getTickCount() #函数执行前的时钟周期数
bear_dst0 = cv2.resize(bear,(cols*3,rows*3),interpolation=cv2.INTER_CUBIC) #放大图像
end = cv2.getTickCount() #函数执行完成的时间周期数
time0 = (end-start)/cv2.getTickFrequency() #获得放大图像所需要的时间
cv2.setUseOptimized(False) # 关闭优化
print(cv2.useOptimized())
start = cv2.getTickCount() #函数执行前的时钟周期数
bear_dst3 = cv2.resize(bear,(cols*3,rows*3),interpolation=cv2.INTER_CUBIC) #放大图像
end = cv2.getTickCount() #函数执行完成的时间周期数
time3 = (end-start)/cv2.getTickFrequency() #获得放大图像所需要的时间
print("开启优化的运行时间为"+str(time0))
print("关闭优化的运行时间为"+str(time3))
运行结果:
True
False
开启优化的运行时间为0.0073506805537736615
关闭优化的运行时间为0.01660434574697629
效率优化原则
- Python 的标算比 在Numpy 里计算快。对于仅包含一两个元素的运算,Python 比 Numpy 的数组快。但当数组元素多时Numpy 快。所以Numpy的运行速度并不一定比Python本身语法快,元素数量较少时,用Python自身的格式计算。
- 尽量避免使用循环,尤其两层三层的嵌套循环,迭代非常慢
- 优先使用OpenCV/Numpy中封装好的函数
- 尽量将数据向量化,变成Numpy的数据格式
- 尽量避免数组的复制操作