1. 安装opencv
在windows系统中,打开cmd窗口,输入如下代码:
1 | pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple |
使用contrib版本的功能要全面一些,后面的-i及其后是使用清华的源进行下载,会快很多。
检查是否安装成功
1 | import cv2 as cv |
2. 基础绘制功能
cv.line(), cv.circle() , cv.rectangle(), cv.ellipse(), cv.putText()
分别用来在图片上绘制直线、圆形、矩形、椭圆、添加文字。他们的参数非常类似,都包含如下几个
- img: 绘制图形的目标图片
- color: 绘制什么颜色的图形
- thickness: 线条的粗细
- lineType: 线型 (没发现区别)
举个例子
1 | import numpy as np |
3. 用鼠标绘制
鼠标点击左键,绘制圆形。其中使用到了cv.setMouseCallback
来为图像设置回调函数,回调函数draw_cicle
接收event
以及事件发生时的xy坐标,函数内判断事件类型,进行处理。
1 | import numpy as np |
更高级的例子,使用m键切换模式,鼠标点击后拖动绘制矩形和圆形。
1 | import numpy as np |
4. TrackBar使用
使用cv.createTrackBar()
创建控制条,输入参数为:控制条名称、窗口名称、初始值、最大值、回调函数
使用cv.getTrackBarPos()
获取控制条当前位置,输入参数:控制条名称、窗口名称
OpenCV里面没有按钮,因此可以创建一个最大值为1的控制条,作为开关使用
举个例子,带有开关的调色板
1 | import numpy as np |
更复杂一些的例子,使用控制条改变绘制的颜色画笔尺寸
1 | import numpy as np |
5. 像素/通道/边框操作
- 单像素操作首选
array.item()
和array.itemset()
- 通道操作直接用numpy切片选择
- roi不是复制,是view,因此roi的修改会改变原图数据
1 | import numpy as np |
6. 图像相加与混合
与普通相加的区别,使用cv.add()
相加结果大于数据类型范围会设为最大值。
1 | import numpy as np |
使用cv.addWighted()
将两个图片混合起来,
1 | import numpy as np |
按位操作 Bitwise Operations
以下是实现将一个logo扣出来贴到另一个图片的例子
1 | import cv2 as cv |
7. 性能检查与优化
使用cv.getTickCount()
获取时钟周期,在要判断耗时的程序前后各获取一次,求差
使用cv.getTickFrequency()
获取时钟频率,耗时(秒) = 周期数量 / 频率
1 | import cv2 as cv |
性能优化
1 | import cv2 as cv |
使用IPython
时可以用它的命令%timeit
非常方便地对每行代码用时进行分析
创建数组、单个或两个元素运算时,python直接运算以及opencv算法都比numpy快
性能优化方面的思路:首先以简单的方式实现算法,一旦算法开始工作,分析找到其瓶颈优化之
- 尽可能避免在Python中使用循环
- 最大可能地将算法向量化,因为numpy和opencv都针对向量运算进行了优化
- 非必要不复制
array
,只使用其views
如果代码还是慢,考虑用Cython
附加资源