戳一戳!和我一起走进opencv的世界
导读
OpenCV性能好不好?衡量一下就知道!
今天要分享这篇文章带我们一起了解如何使用代码检测程序执行时长,衡量代码性能,OpenCV默认优化如何使用。让我们走进这篇文章,一起来了解一下吧!
往期回顾
【OpenCV-YOLO v4实战】
01 | 尝鲜!Windows下实现YOLOv4物体检测
02 | 坐稳了,OpenCV老司机带你用OpenCV4实现YOLO v4物体检测
【OpenCV基础教程】
01 | 01 OpenCV简介与安装
02 | 02 图像的读取与显示
03 | 03 图像的存储与窗口操作
04 | 04 视频的读取和显示
05 | 05 图像的结构、属性与坐标
06 | 06 图形与文字的绘制
07 | 07 鼠标控件基本操作
08 | 08 trackbar操作及实例详解
09 | 09 图像像素基本操作
10 | 10 图像混合
1 性能衡量
1 为什么要衡量性能
计算机视觉需要处理图像,学过数字图像处理的同学或者看过我前面教程的同学应该能够知道,我们处理图像的本质是操作矩阵。
或者,作为一个数学专业出身的研究生,作为一个痴迷数学的布道者,我坚定的相信:
这个世界的本质就是数学,不管研究哪个领域,研究到最后,研究的就是数学。
所以,想要探求宇宙的真谛,想要探寻万物的奥秘,就必须掌握数学,深入探究数学,合理应用数学!
再说的多,估计就有人该怼我了,确实数学在我心中有不可比拟的分量。情人眼里出数学吧!
说回正题,因为矩阵操作运算量太大了,所以,我们必须要考虑执行效率的问题,不能做个处理,十年过去了。
夸张了哈!不过,因为矩阵运算量着实大,所以我们一定要考虑代码性能。
2 衡量性能API
在OpenCV中,提供了检测代码执行时间的API。
第一个API是:getTickCount ,该API实现的功能是:
返回特定事件后的刻度数。
API定义如下:
def getTickCount()
第二个API是:getTickFrequency ,该API实现的功能是:
返回每秒的刻度数。
API定义如下:
def getTickFrequency()
通过它们的功能,我们就可以计算运行时间了:
运行时间 = (运行结束的刻度数 - 运行开始的刻度数) / 每秒刻度数
既然是每秒的刻度数,那我们就知道这种方法计算出的时间单位是秒。
这两个API搭配使用方法如下:
e1 = cv.getTickCount()
# 自己的代码
e2 = cv.getTickCount()
time = (e2 - e1)/ cv.getTickFrequency()
3 代码示例
举个例子:
# coding=utf-8
import cv.cv2 as cv
img = cv.imread('./image/sign.png')
e1 = cv.getTickCount()
for i in range(0,img.shape[0],1):
for j in range(0,img.shape[1],1):
print(img[i][j],end=' ')
print()
e2 = cv.getTickCount()
t = (e2 - e1)/cv.getTickFrequency()
print("t = ", t)
部分执行结果如下:
2 默认优化方式
1 优化简述
上面的代码执行着实很慢,OpenCV提供了默认优化方式,可以通过简单设置来优化代码?
除了默认方式,我们还需要通过很多方式来优化,比如优化算法,删掉不必须的循环等等。
针对不同情况,优化方式也不同,所以让我们在这里,先掌握默认优化方式吧!
2 默认优化API
检查默认优化是否开启的API为: useOptimized ,API定义如下:
def useOptimized()
API有两个返回值:
True:默认优化开启
False:默认优化关闭
设置默认优化开启或者关闭的API是:setUseOptimized,API定义如下:
def setUseOptimized(onoff)
参数含义为:设置默认优化为开启或者关闭。该参数可选的范围就是 True 和 False 。True表示开启,False表示关闭。
3 代码及结果分析
我们想查看是否开启优化可以这样:
# coding=utf-8
import cv.cv2 as cv
img = cv.imread('./image/sign.png')
print(cv.useOptimized())
执行结果如下:
我们想关闭优化可以这样:
# coding=utf-8
import cv.cv2 as cv
cv.setUseOptimized(False)
print(cv.useOptimized())
执行结果如下:
因为刚才是启用优化,我们关闭默认优化,再试下刚才的代码:
# coding=utf-8
import cv.cv2 as cv
img = cv.imread('./image/sign.png')
cv.setUseOptimized(False)
print(cv.useOptimized())
e1 = cv.getTickCount()
for i in range(0,img.shape[0],1):
for j in range(0,img.shape[1],1):
print(img[i][j],end=' ')
print()
e2 = cv.getTickCount()
t = (e2 - e1)/cv.getTickFrequency()
print("t = ", t)
部分执行结果如下:
时间变长了,说明默认优化在一定程度上可以让我们代码执行时长更短。
说在后面的话
这篇文章到这里就要结束啦,希望大家能够通过这篇文章,能够了解使用OpenCV获取代码的执行时长,能够掌握OpenCV的默认优化方法,并将其应用到我们后续学习中!
让我们在后续的课程中,再接再厉,学习更多知识吧。
号外号外!
AI与区块链技术交流群
成立啦!
本群用于分享交流机器学习、深度学习、计算机视觉、OpenCV、PCL、TensorFlow、Pytorch等内容。
AI与区块链技术
长按二维码关注