目录
1.1仔细观察以下函数,其实每个函数只有几个特殊的参数是专有的,其他大都是相同的
1.绘制形状
1.1仔细观察以下函数,其实每个函数只有几个特殊的参数是专有的,其他大都是相同的
画圆:cv2.
circle
(img,
center, radius
, color[, thickness[, lineType[, shift]]])
画线:cv2.
line
(img,
pt1, pt2
, color[, thickness[, lineType[, shift]]])
画矩形:cv2.
rectangle
(img,
pt1, pt2
, color[, thickness[, lineType[, shift]]])
画多边形/多线段:cv2.
polylines
(img,
[
pts], isClosed
, color[, thickness[, lineType[, shift]]])
写文本:cv2.
putText
(img,
text, org, fontFace, fontScale
, color[, thickness[, lineType[, bottomLeftOrigin]]])
画椭圆:cv2.ellipse
(img,
center, axes, angle, startAngle, endAngle
, color[, thickness[, lineType[, shift]]]),附画椭圆参数图:
下面介绍一下各个参数的含义:
1.2共有参数
- img:要绘制的图像,绘制前跟绘制后是同一个图像。
- color:采用RGB颜色模式,用来指定描绘的形状的颜色。值得注意的是,三数值并不是按顺序代表RGB,而是(B,G,R)
- thickness:绘制的图像的线宽。值得注意的是,如果线宽为负则将填满整个图像。
- lineType:线段类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波),不常用。
- shift:表示点坐标中小数点的位数,不常用
1.3专属参数
①圆:
- center:圆的圆心坐标
- radius:圆的半径大小
②线:
- pt1:线的起始坐标
- pt2:线的终点坐标
③矩形:
- pt1:矩形左上角
- pt2:矩形右下角
④多线段/多边形:
- [pts]:一组点位,描述多边形的各个角的位置
范例:
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))
不少人可能会注意到reshape()函数,那就稍微了解一下吧。
reshape(参数1,参数2)函数是在不改变数据内容的情况下,改变一个数组的格式。
参数1是表示数组的格式如(3,4)表示设置为3行4列,而(3,4,1)是表示每1个数值组成一个数据,将数据组织成3行4列的样式,若输入-1Python就是根据其他数自动调整。
参数2是设置数据的读/写数据,可选C,F,A,默认为C。
如范例中的reshape((-1,1,2))是表示将两个数值组成一个数据,将数据组织为1列n行的形式。默认先读和写都以行优先。
具体可参考:
numpy中reshape方法详解
、
python中reshape的用法
- isClosed:’True’/’False’可选。若是False则图形为由点数组组成的闭合多边形。若为Ture则只将各个点连起来组成多线段。
⑤文本:
- text:要绘制的文本字符串
- org:绘制的文本的左下角
- fontFace:字体
- fontScale:字体大小
⑥椭圆:
- center:椭圆中心,形式为(x,y)
- axes:轴长度,形式为(l1,l2),l1为长轴长,l2为短轴长。
- angle:整个椭圆逆时针旋转的角度。
范例:0度与60度
- startAngle, endAngle:startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。即给出0和360给出完整的椭圆
绘制图像官方文档:
https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#gettextsize
2.鼠标绘图
注意区分鼠标事件/鼠标回调函数/鼠标响应时间。
先说结论:
- 鼠标事件是人对鼠标的敲打,如左键按下,左键双击,左键放开等。
- 鼠标回调函数是针对鼠标事件发生后程序应该执行的动作。
- 鼠标相应事件是指名鼠标回调函数发生所在的图像,土话来说就是你想把鼠标回调函数应用在哪个图像上。
那么自顶而下依次学习这3个概念:
2.1鼠标响应事件
# 布置前提环境
import cv2 as cv
cv.namedWindow('image')
# 响应事件使用范例
cv.setMouseCallback('image',鼠标回调函数)
所以设置鼠标响应事件是非常简单的,你只需设置你的(鼠标)回调函数。
2.2鼠标回调函数
函数原型:
on_mouse(event, x, y, flags, param)
# on_mouse:函数名,可随意命名
# event:鼠标事件
# x,y:鼠标事件发生的坐标
# flags:是CV_EVENT_FLAG的组合
# param:是用户定义的传递到setMouseCallback函数调用的参数
使用范例:
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img,(x,y),100,(255,0,0),1)
所以现在你只需了解鼠标事件event与flags
2.3鼠标事件
使用以下代码查看所有可选鼠标事件:
import cv2 as cv
events = [i for i in dir(cv) if 'EVENT' in i]
print( events )
# 输出结果
# ['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
①具体参数说明:
event参数:
- EVENT_MOUSEMOVE 0 //滑动
- EVENT_LBUTTONDOWN 1 //左键点击
- EVENT_RBUTTONDOWN 2 //右键点击
- EVENT_MBUTTONDOWN 3 //中键点击
- EVENT_LBUTTONUP 4 //左键放开
- EVENT_RBUTTONUP 5 //右键放开
- EVENT_MBUTTONUP 6 //中键放开
- EVENT_LBUTTONDBLCLK 7 //左键双击
- EVENT_RBUTTONDBLCLK 8 //右键双击
- EVENT_MBUTTONDBLCLK 9 //中键双击
flags参数:
- EVENT_FLAG_LBUTTON 1 //左键拖曳
- EVENT_FLAG_RBUTTON 2 //右键拖曳
- EVENT_FLAG_MBUTTON 4 //中键拖曳
- EVENT_FLAG_CTRLKEY 8 //(8~15)按 Ctrl 不放
- EVENT_FLAG_SHIFTKEY 16 //(16~31)按 Shift 不放
- EVENT_FLAG_ALTKEY 32 //(32~39)按 Alt 不放
②使用说明:
在使用中
- event事件为主
- flags事件为辅,可以不写。
范例:
def draw_circle(event,x,y,flags,param):
if event == 0: #只要鼠标在图像范围内移动就会不断画图
cv.circle(img,(x,y),100,(255,0,0),1)
若再设置flags==1后:单纯的鼠标在图像内移动不会画图,只有满足鼠标移动+鼠标左键保持按下才会开始画图。
def draw_circle(event,x,y,flags,param):
if event == 0 and flags == 1:
cv.circle(img,(x,y),100,(255,0,0),1)
2.4使用范例
import numpy as np
import cv2 as cv
# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
if event == 0 and flags == 1:
cv.circle(img,(x,y),100,(255,0,0),1)
# 创建一个黑色的图像,将鼠标响应事件绑定到窗口
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()